]> sourceware.org Git - newlib-cygwin.git/blame - winsup/utils/ssp.txt
Cygwin: add 3.2.1 release file and add fixes up to this point
[newlib-cygwin.git] / winsup / utils / ssp.txt
CommitLineData
cc55c579
DD
1
2SSP - The Single Step Profiler
3
4Original Author: DJ Delorie <dj@redhat.com>
5
6The SSP is a program that uses the Win32 debug API to run a program
7one ASM instruction at a time. It records the location of each
8instruction used, how many times that instruction is used, and all
9function calls. The results are saved in a format that is usable by
10the profiling program "gprof", although gprof will claim the values
11are seconds, they really are instruction counts. More on that later.
12
13Because the SSP was originally designed to profile the cygwin DLL, it
14does not automatically select a block of code to report statistics on.
15You must specify the range of memory addresses to keep track of
16manually, but it's not hard to figure out what to specify. Use the
17"objdump" program to determine the bounds of the target's ".text"
18section. Let's say we're profiling cygwin1.dll. Make sure you've
19built it with debug symbols (else gprof won't run) and run objdump
20like this:
21
eedc36cb 22 objdump -h cygwin1.dll
cc55c579
DD
23
24It will print a report like this:
25
26cygwin1.dll: file format pei-i386
27
28Sections:
29Idx Name Size VMA LMA File off Algn
30 0 .text 0007ea00 61001000 61001000 00000400 2**2
31 CONTENTS, ALLOC, LOAD, READONLY, CODE, DATA
32 1 .data 00008000 61080000 61080000 0007ee00 2**2
33 CONTENTS, ALLOC, LOAD, DATA
34 . . .
35
36The only information we're concerned with are the VMA of the .text
37section and the VMA of the section after it (sections are usually
38contiguous; you can also add the Size to the VMA to get the end
39address). In this case, the VMA is 0x61001000 and the ending address
40is either 0x61080000 (start of .data method) or 0x0x6107fa00 (VMA+Size
41method).
42
43There are two basic ways to use SSP - either profiling a whole
44program, or selectively profiling parts of the program.
45
46To profile a whole program, just run ssp without options. By default,
47it will step the whole program. Here's a simple example, using the
48numbers above:
49
50 ssp 0x61001000 0x61080000 hello.exe
51
52This will step the whole program. It will take at least 8 minutes on
53a PII/300 (yes, really). When it's done, it will create a file called
54"gmon.out". You can turn this data file into a readable report with
55gprof:
56
57 gprof -b cygwin1.dll
58
59The "-b" means "skip the help pages". You can omit this until you're
60familiar with the report layout. The gprof documentation explains
61a lot about this report, but ssp changes a few things. For example,
62the first part of the report reports the amount of time spent in each
63function, like this:
64
65Each sample counts as 0.01 seconds.
eedc36cb
CF
66 % cumulative self self total
67 time seconds seconds calls ms/call ms/call name
cc55c579
DD
68 10.02 231.22 72.43 46 1574.57 1574.57 strcspn
69 7.95 288.70 57.48 130 442.15 442.15 strncasematch
70
71The "seconds" columns are really CPU opcodes, 1/100 second per opcode.
72So, "231.22" above means 23,122 opcodes. The ms/call values are 10x
73too big; 1574.57 means 157.457 opcodes per call. Similar adjustments
74need to be made for the "self" and "children" columns in the second
75part of the report.
76
77OK, so now we've got a huge report that took a long time to generate,
78and we've identified a spot we want to work on optimizing. Let's say
79it's the time() function. We can use SSP to selectively profile this
80function by using OutputDebugString() to control SSP from within the
81program. Here's a sample program:
82
83 #include <windows.h>
84 main()
85 {
86 time_t t;
87 OutputDebugString("ssp on");
88 time(&t);
89 OutputDebugString("ssp off");
90 }
91
92Then, add the "-d" option to ssp to default to *disabling* profiling.
93The program will run at full speed until the first OutputDebugString,
94then step until the second.
95
96 ssp -d 0x61001000 0x61080000 hello.exe
97
98You can then use gprof (as usual) to see the performance profile for
99just that portion of the program's execution.
100
101OK, now for the other ssp options, and when to use them:
102
103"-v" - verbose. This prints messages about threads starting and
104stopping, OutputDebugString calls, DLLs loading, etc.
105
106"-t" and "-tc" - tracing. With -t, *every* step's address is written
107to the file "trace.ssp". This can be used to help debug functions,
108since it can trace multiple threads. Clever use of scripts can match
109addresses with disassembled opcodes if needed. Warning: creates
110*huge* files, very quickly. "-tc" prints each address to the console,
111useful for debugging key chunks of assembler.
112
113"-s" - subthreads. Usually, you only need to trace the main thread,
114but sometimes you need to trace all threads, so this enables that.
115It's also needed when you want to profile a function that only a
116subthread calls. However, using OutputDebugString automatically
117enables profiling on the thread that called it, not the main thread.
118
119"-dll" - dll profiling. Generates a pretty table of how much time was
120spent in each dll the program used. No sense optimizing a function in
121your program if most of the time is spent in the DLL.
122
123I usually use the -v, -s, and -dll options:
124
125 ssp -v -s -dll -d 0x61001000 0x61080000 hello.exe
This page took 0.314586 seconds and 5 git commands to generate.