Add strace debugging section.
This commit is contained in:
parent
5088b18431
commit
a9ae96dde4
@ -6,12 +6,12 @@ Well, you can file an angry bug report and wait until some of the core
|
|||||||
developers try to reproduce your problem, try to find what's the matter
|
developers try to reproduce your problem, try to find what's the matter
|
||||||
with your program and cygwin and fix the bug, if any. But you can do something
|
with your program and cygwin and fix the bug, if any. But you can do something
|
||||||
better than that. You can debug the problem yourself, and even if you can't
|
better than that. You can debug the problem yourself, and even if you can't
|
||||||
fix it, your analysis may be very helpful. Here's the (incomplete) howto on
|
fix it, your analysis may be very helpful. Here's the (incomplete) howto on
|
||||||
cygwin debugging.
|
cygwin debugging.
|
||||||
|
|
||||||
1. The first thing you'll need to do is to build cygwin1.dll and your crashed
|
1. The first thing you'll need to do is to build cygwin1.dll and your crashed
|
||||||
application from sources. To debug them you'll need debug information, which
|
application from sources. To debug them you'll need debug information, which
|
||||||
is normally stripped from executables.
|
is normally stripped from executables.
|
||||||
|
|
||||||
2. Create known-working cygwin debugging environment.
|
2. Create known-working cygwin debugging environment.
|
||||||
- create a separate directory, say, c:\cygdeb, and put known-working
|
- create a separate directory, say, c:\cygdeb, and put known-working
|
||||||
@ -33,8 +33,8 @@ c:\cygdeb\gdb.exe -nw %1 %2
|
|||||||
|
|
||||||
4. Strace.
|
4. Strace.
|
||||||
You can run your program under 'strace' utility, described if user's manual.
|
You can run your program under 'strace' utility, described if user's manual.
|
||||||
If you know where the problem approximately is, you can add a bunch of
|
If you know where the problem approximately is, you can add a bunch of
|
||||||
additional debug_printf()s in the source code and see what they print in
|
additional debug_printf()s in the source code and see what they print in
|
||||||
strace log. There's one common problem with this method, that some bugs
|
strace log. There's one common problem with this method, that some bugs
|
||||||
may mysteriously disappear once the program is run under strace. Then the
|
may mysteriously disappear once the program is run under strace. Then the
|
||||||
bug is likely a race condition. strace has two useful options to deal with
|
bug is likely a race condition. strace has two useful options to deal with
|
||||||
@ -42,7 +42,7 @@ c:\cygdeb\gdb.exe -nw %1 %2
|
|||||||
timeouts introduced by strace, and -m option allows you to mask certain
|
timeouts introduced by strace, and -m option allows you to mask certain
|
||||||
classes of *_printf() functions, reducing timeouts even more.
|
classes of *_printf() functions, reducing timeouts even more.
|
||||||
|
|
||||||
5. Problems at early startup.
|
5. Problems at early startup.
|
||||||
Sometimes, something crashes at the very early stages of application
|
Sometimes, something crashes at the very early stages of application
|
||||||
initialization, when JIT debugging facility is not yet active. Ok, there's
|
initialization, when JIT debugging facility is not yet active. Ok, there's
|
||||||
another environment variable that may help. Create program_wrapper.cmd:
|
another environment variable that may help. Create program_wrapper.cmd:
|
||||||
@ -53,7 +53,7 @@ rem to sleep for x milliseconds at startup
|
|||||||
set CYGWIN_SLEEP=20000
|
set CYGWIN_SLEEP=20000
|
||||||
c:\some\path\bad_program.exe some parameters
|
c:\some\path\bad_program.exe some parameters
|
||||||
===================================
|
===================================
|
||||||
|
|
||||||
Now, run program_wrapper.cmd. It should print running program pid.
|
Now, run program_wrapper.cmd. It should print running program pid.
|
||||||
After starting program_wrapper.cmd you've got 20 seconds to open another
|
After starting program_wrapper.cmd you've got 20 seconds to open another
|
||||||
window, cd to c:\cygdeb in it, run gdb there and in gdb prompt type
|
window, cd to c:\cygdeb in it, run gdb there and in gdb prompt type
|
||||||
@ -71,3 +71,26 @@ c:\some\path\bad_program.exe some parameters
|
|||||||
To do it, just add --enable-malloc-debugging option to configure. Be warned,
|
To do it, just add --enable-malloc-debugging option to configure. Be warned,
|
||||||
however, that this version of dll is _very_ slow (10-100 times slower than
|
however, that this version of dll is _very_ slow (10-100 times slower than
|
||||||
normal), so use it only when absolutely necessary.
|
normal), so use it only when absolutely necessary.
|
||||||
|
|
||||||
|
7. Program dies when running under strace.
|
||||||
|
If your program crashes when you run it using strace but runs ok (or has a
|
||||||
|
different problem) otherwise, then there may be a problem in one of the
|
||||||
|
strace *_printf statements. Usually this is caused by a change in arguments
|
||||||
|
resulting in a %s being used with something other than a pointer to a
|
||||||
|
string.
|
||||||
|
|
||||||
|
To debug this scenario, do something like this:
|
||||||
|
|
||||||
|
bash$ gdb -nw yourapp.exe
|
||||||
|
(gdb) dll cygwin1
|
||||||
|
(gdb) l dll_crt0_1
|
||||||
|
(gdb) bp <<first line in the function>>
|
||||||
|
(gdb) run
|
||||||
|
(gdb) set strace.active=1
|
||||||
|
(gdb) continue
|
||||||
|
|
||||||
|
The program will then run in "strace mode", calling each strace *_printf,
|
||||||
|
just like it does when run under the strace program. Eventually, the
|
||||||
|
program will crash, probably in small_printf. At that point, a 'bt'
|
||||||
|
command should show you the offending call to strace_printf with the
|
||||||
|
improper format string.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user