Ticket #29: PDUMP.CMD

File PDUMP.CMD, 6.8 KB (added by roderick, 17 years ago)
Line 
1@echo off
2:: PDumpCtl - ProcDump control front-end
3::            Dump named process/pid or run interactive
4::            OK to exit to shell and update options
5
6:: Copyright (c) 2001, 2006 Steven Levine and Associates, Inc.
7:: All rights reserved.
8
9rem $TLIB$: $ &(#) %n - Ver %v, %f $
10rem TLIB: $ $
11
12:: 27 Jun 01 SHL Baseline
13:: 21 Jan 04 SHL Add -f -x options
14:: 14 Jun 05 SHL Add -a option
15:: 05 Jul 05 SHL Update usage
16:: 08 Jul 05 SHL Support dec/hex pid and quoted name
17:: 09 Dec 06 SHL Add sysvm to full mode to allow .m commands
18
19on errormsg pause
20setlocal
21
22:: Scan args, I=num A=value X=scratch
23
24set D=          %+ :: Dump directory
25set M=a         %+ :: Auto/Interactive (a/i)
26set N=          %+ :: Process name
27set P=          %+ :: Pid
28set T=n         %+ :: Normal/Full/eXtended
29
30:: N and P mutually exclusive
31
32do I = 1 to %[#]
33  set A=%[%I]
34  set X=%@substr[%A,0,1]
35  iff "%X" eq "/" .or. "%X" eq "-" then
36    :: Got switch
37    set X=%@lower[%@substr[%A,1,1]]
38    iff "%X" == "h" .or. "%X" == "?" then
39      goto Help
40    elseiff "%X" == "a" then
41      set T=a
42    elseiff "%X" == "f" then
43      set T=f
44    elseiff "%X" == "i" then
45      set M=i
46    elseiff "%X" == "x" then
47      set T=x
48    else
49      echo Switch %X unexpected
50      goto Usage
51    endiff
52  else
53    :: Got proc/pid - detect/convert decimal to hex
54    set P=%A
55    iff '%@left[1,%P]' == '%="' then
56      set N=%@strip[%=",%P]
57      set P=
58    elseiff "%@left[2,%A]" == "0x" then
59      set P=%@substr[%P,2,100]
60      set X=%@convert[16,16,%P]
61      if "%P" != "%X" ( echo Bad PID %+ goto usage )
62    elseiff "%@left[2, %P]" == "0n" then
63      set P=%@substr[%P,2,100]
64      set X=%@convert[10,10,%P]
65      if "%P" != "%X" ( echo Bad PID %+ goto usage )
66      set P=%@convert[10,16,%P]
67    else
68      :: Try for hext PID
69      set X=%@convert[16,16,%P]
70      if "%P" != "%X" ( set N=%P %+ set P= )
71    endiff
72  endiff
73enddo
74
75if %M == a if "%P %N" == " " ( echo No process/pid selected %+ goto usage )
76
77:: Set defaults
78
79echo on
80pdumpusr reset
81@echo off
82
83iff isdir c:\ then
84  set D=c:\
85elseiff isdir c:\ then
86  set D=c:\
87elseiff isdir c:\ then
88  set D=c:\
89else
90  echo Dump directory not found - checked i:\Dumps d:\tmp\Dumps and j:\tmp\Dumps
91  cancel
92endiff
93
94echo.
95echo on
96procdump on /l:%D
97@echo off
98
99:: instance     Instance data referenced by the process.
100:: krheaps      Kernel Resident Heaps
101:: ksheaps      Kernel Swappable Heaps
102:: idt          Interrupt descriptor table
103:: laddr        Linear address range(s)
104:: mvdm         MVDM instance data for process
105:: paddr(all)   Add physical memory
106:: private      Private code and data referenced by process
107:: sem          Semaphore information for all blocked threads in process
108:: shared       Shared code and data referenced by process
109:: summ         Summary for dumped threads
110:: sysfs        File System data for all processes
111:: sysio        IO subsystem structures (AIRQI, DIRQ, PDD eps, PDD chain)
112:: sysldr       Loader data for all processes
113:: sysmvdm      MVDM data for all VDM and the kernel resident heap
114:: syspg        Physical and Page Memory management records (PF, VP, PTE, PDE)
115:: syssem       SEM data for all blocked threads in system
116:: syssumm      Summary for all threads
117:: systk        Task Management related data for all processes
118:: sysvm        Virtual Memory data for all processes
119
120iff "%T" == "a" then
121  :: All physical memory
122  echo on
123  pdumpusr paddr(all)
124  @echo off
125endiff
126
127iff "%T" == "f" then
128  :: Full
129  echo on
130  pdumpusr summ,sysfs,sysldr,private,instance,syssem,sysio
131  @echo off
132endiff
133
134iff "%T" == "x" then
135  :: Extended
136  echo on
137  pdumpusr summ,sysfs,sysldr,private,instance,syssem,sysio
138  pdumpusr shared,update
139  @echo off
140endiff
141
142echo on
143procdump query
144@echo off
145
146:: Check forced dump request using current settings
147iff %M=a then
148  procdump query
149  iff "%P" != "" then
150    echo Dumping PID %P
151    procdump force /pid:%P
152  else
153    echo Dumping process %N
154    procdump force /proc:%N
155  endiff
156  procdump off
157  procdump query
158  quit
159endiff
160
161:: Interactive
162
163do forever
164  iff "%P" != "" then
165    :: echo.
166    echo PID %P selected
167    echo.
168  elseiff "%N" != "" then
169    :: echo.
170    echo Process %N selected
171    echo.
172  endiff
173  inkey /k"adfhorsvq!?[Esc][Enter]" `D)ump F)ull S)hared A)ll R)eset V)iew O)ff H)elp Q)uit ? ` %%Z
174  echo.
175  iff "%Z" == "q" .or. "%Z" == "" then
176    leave
177  elseiff "%Z" == "@28" then
178    iterate
179  elseiff %Z == a then
180    :: All physical memory
181    echo on
182    pdumpusr reset
183    pdumpusr paddr(all)
184    pdumpusr query
185    @echo off
186  elseiff %Z == d then
187    :: Force dump now
188    iff "%P" != "" then
189      echo Dumping PID %P
190      echo on
191      procdump force /pid:%P
192      @echo off
193    elseiff "%N" != "" then
194      echo Dumping process %N
195      echo on
196      procdump force /proc:%N
197      @echo off
198    else
199      echo No process/pid selected
200    endiff
201  elseiff %Z == f then
202    :: Full
203    echo on
204    :: pdumpusr reset
205    pdumpusr summ,sysfs,private,instance,syssem,sysio,sysldr,sysvm,update
206    pdumpusr query
207    @echo off
208  elseiff %Z == o then
209    :: Off
210    echo on
211    procdump off
212    @echo off
213  elseiff %Z == r then
214    :: Reset to default
215    echo on
216    procdump reset /pid:all
217    procdump on /l:%D
218    pdumpusr reset
219    procdump query
220    @echo off
221  elseiff %Z == v then
222    :: Status
223    echo on
224    procdump query
225    @echo off
226  elseiff %Z == s then
227    :: Add shared
228    echo on
229    pdumpusr shared,update
230    pdumpusr query
231    @echo off
232  elseiff "%Z" == "!" then
233    :: Shell
234    echo.
235    %comspec
236  elseiff "%Z" == "h" .or. "%Z" == "?" then
237    :: Help
238    echo D - Force dump using current settings
239    echo F - Set up for full dump - adds summ,sysfs,sysldr,private,instance,syssem,sysio
240    echo S - Add shared code/data to current settings
241    echo A - Set up to dump all physical memory with paddr(all) - resets other settings
242    echo V - View current settings
243    echo O - Turn off dump facility
244    echo R - Reset to default settings
245    echo H - Display this screen
246    echo Q - Quit
247    echo ? - Display this screen
248    echo ! - Shell
249  else
250    pause Unexpected %Z
251    cancel
252  endiff
253enddo
254
255:: Show exit state
256echo on
257procdump query
258@echo off
259
260quit
261
262::=== Usage: Report usage error ===
263
264:Usage
265  beep
266  echo Usage: %@lower[%0] `[-?] [-f] [-i] [-x] [procname|hex-pid|dec-pid]`
267  cancel
268
269::=== Help: Show usage help ===
270
271:Help
272  echo.
273  echo Usage: %@lower[%0] `[-?] [-f] [-i] [-x] [procname|hex-pid|dec-pid]`
274  echo.
275  echo ` -?        This message`
276  echo ` -f        Full (default=normal)`
277  echo ` -i        Interactive (default=force dump and exit)`
278  echo ` -x        Extended, full plus shared (default=normal)`
279  echo.
280  echo ` hex-pid   hex pid, optionally prefix 0x`
281  echo ` dec-pid   decimal pid, prefix with 0n`
282  echo ` procname  Process name, quote if name lots like number`
283  cancel
284
285:end