/
ThreadMonitorHistory.btm
163 lines (149 loc) · 4.87 KB
/
ThreadMonitorHistory.btm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
########################################################################
# JBoss, Home of Professional Open Source
# Copyright 2011, Red Hat and individual contributors
# by the @authors tag. See the copyright.txt in the distribution for a
# full listing of individual contributors.
#
# This is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as
# published by the Free Software Foundation; either version 2.1 of
# the License, or (at your option) any later version.
#
# This software is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this software; if not, write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
#
# @author Andrew Dinn
# @author Scott Stark
#
# ThreadMonitorHistory
#
# A byteman script which stores thread creation, start, run and exit events
#
# to use ths script to trace execution of java program org.my.App execute
#
# -- set the directory in which byteman has been installed
# BYTEMAN_HOME= ...
#
# -- identify the samples helper jar to the boot path
# SAMPLE_JAR=${BYTEMAN_HOME}/sample/lib/byteman-sample.jar
#
# -- identify this script
# SCRIPT={BYTEMAN_HOME}/sample/scripts/ThreadMonitorHistory.btm
#
# ${BYTEMAN_HOME}/bin/bmjava.sh -l $SCRIPT -b $SAMPLE_JAR org.my.App
#
# alternatively to load the script dynamically
#
# -- start the program with the agent
# ${BYTEMAN_HOME}/bin/bmjava.sh org.my.App
#
# -- install the helper library into the bootstrap classpath
# ${BYTEMAN_HOME}/bin/bmsubmit.sh -b $SAMPLE_JAR
#
# -- install the script
# ${BYTEMAN_HOME}/bin/bmsubmit.sh -l $SCRIPT
########################################################################
#
# Rule to trace thread creation
#
RULE ThreadMonitor trace create
CLASS java.lang.Thread
METHOD <init>
HELPER org.jboss.byteman.sample.helper.ThreadHistoryMonitorHelper
AT EXIT
IF TRUE
DO traceCreate($0, 5)
ENDRULE
########################################################################
#
# Rule to trace thread start
#
RULE ThreadMonitor trace start
CLASS ^java.lang.Thread
METHOD start()
HELPER org.jboss.byteman.sample.helper.ThreadHistoryMonitorHelper
AT ENTRY
IF TRUE
DO traceStart($0)
ENDRULE
########################################################################
#
# Rule to trace thread exit
#
RULE ThreadMonitor trace exit
CLASS ^java.lang.Thread
METHOD exit()
HELPER org.jboss.byteman.sample.helper.ThreadHistoryMonitorHelper
AT ENTRY
IF TRUE
DO traceExit($0)
ENDRULE
########################################################################
#
# Interface rule to trace calls to implementations of Runnable.run
# n.b. this is injected into overriding implementations of run as well
# as direct implementations. In some cases the overriding method will
# call the super method causing multiple trace lines to be displayed for
# a given run call.
#
RULE ThreadMonitor trace Runnable run
INTERFACE ^java.lang.Runnable
METHOD run()
HELPER org.jboss.byteman.sample.helper.ThreadHistoryMonitorHelper
AT ENTRY
IF TRUE
DO traceRun($0)
ENDRULE
RULE ThreadMonitor trace Callable call
INTERFACE ^java.util.concurrent.Callable
METHOD call()
HELPER org.jboss.byteman.sample.helper.ThreadHistoryMonitorHelper
AT ENTRY
IF TRUE
DO traceRun($0)
ENDRULE
# A registration of the ThreadHistoryMonitorHelper MXBean
# This has to be done after the installation of the platform mbean to avoid
# conflicts with installing the j.u.l.LogManager.
RULE Register ThreadHistoryMonitorHelper mbean
CLASS org.jboss.modules.Main
METHOD main
HELPER org.jboss.byteman.sample.helper.ThreadHistoryMonitorHelper
AT EXIT
IF TRUE
DO registerHelperMBean("org.jboss.byteman:helper=ThreadHistoryMonitorHelper")
ENDRULE
# A rule to trigger a flush of the events after the initial server bootstrap
RULE write ThreadHistoryMonitorHelper boot events
CLASS org.jboss.as.server.ApplicationServerService
METHOD start
HELPER org.jboss.byteman.sample.helper.ThreadHistoryMonitorHelper
AT EXIT
IF TRUE
do writeAllEventsToFile("/tmp/thread-boot.txt")
ENDRULE
# A rule to trigger a flush of the events after the server startup msg
RULE write ThreadHistoryMonitorHelper to start msg events
CLASS org.jboss.as.server.BootstrapListener
METHOD finish
HELPER org.jboss.byteman.sample.helper.ThreadHistoryMonitorHelper
AT EXIT
IF TRUE
do writeAllEventsToFile("/tmp/thread-events.txt")
ENDRULE
# A rule to trigger a flush of the events on System.exit
RULE write ThreadHistoryMonitorHelper to a file manu
CLASS java.lang.System
METHOD exit
HELPER org.jboss.byteman.sample.helper.ThreadHistoryMonitorHelper
AT ENTRY
IF TRUE
do writeAllEventsToFile("/tmp/thread-system-exit.txt")
ENDRULE