2000-02-18 03:38:33 +08:00
|
|
|
|
|
|
|
<sect1 id="gdb"><title>Debugging Cygwin Programs</title>
|
|
|
|
|
|
|
|
<para>When your program doesn't work right, it usually has a "bug" in
|
|
|
|
it, meaning there's something wrong with the program itself that is
|
|
|
|
causing unexpected results or crashes. Diagnosing these bugs and
|
|
|
|
fixing them is made easy by special tools called
|
|
|
|
<emphasis>debuggers</emphasis>. In the case of Cygwin, the debugger
|
|
|
|
is GDB, which stands for "GNU DeBugger". This tool lets you run your
|
|
|
|
program in a controlled environment where you can investigate the
|
|
|
|
state of your program while it is running or after it crashes.
|
|
|
|
Crashing programs sometimes create "core" files. In Cygwin these are
|
|
|
|
regular text files that cannot be used directly by GDB.
|
|
|
|
</para>
|
|
|
|
|
|
|
|
<para>Before you can debug your program, you need to prepare your
|
|
|
|
program for debugging. What you need to do is add
|
|
|
|
<literal>-g</literal> to all the other flags you use when compiling
|
|
|
|
your sources to objects.</para>
|
|
|
|
|
2008-07-17 19:49:45 +08:00
|
|
|
<example id="gdb-g"><title>Compiling with -g</title>
|
2000-02-18 03:38:33 +08:00
|
|
|
<screen>
|
2008-12-15 17:37:50 +08:00
|
|
|
<prompt>bash$</prompt> gcc -g -O2 -c myapp.c
|
|
|
|
<prompt>bash$</prompt> gcc -g myapp.c -o myapp
|
2000-02-18 03:38:33 +08:00
|
|
|
</screen>
|
|
|
|
</example>
|
|
|
|
|
|
|
|
<para>What this does is add extra information to the objects (they get
|
|
|
|
much bigger too) that tell the debugger about line numbers, variable
|
|
|
|
names, and other useful things. These extra symbols and debugging
|
|
|
|
information give your program enough information about the original
|
|
|
|
sources so that the debugger can make debugging much easier for
|
|
|
|
you.</para>
|
|
|
|
|
|
|
|
<para>In Windows versions of GNUPro, GDB comes with a full-featured
|
|
|
|
graphical interface. In Cygwin Net distributions, GDB is only
|
|
|
|
available as a command-line tool. To invoke GDB, simply type
|
|
|
|
<command>gdb myapp.exe</command> at the command prompt. It will
|
|
|
|
display some text telling you about itself, then
|
|
|
|
<literal>(gdb)</literal> will appear to prompt you to enter commands.
|
|
|
|
Whenever you see this prompt, it means that gdb is waiting for you to
|
|
|
|
type in a command, like <command>run</command> or
|
|
|
|
<command>help</command>. Oh <literal>:-)</literal> type
|
|
|
|
<command>help</command> to get help on the commands you can type in,
|
|
|
|
or read the <citation>GDB User's Manual</citation> for a complete
|
|
|
|
description of GDB and how to use it.</para>
|
|
|
|
|
|
|
|
<para>If your program crashes and you're trying to figure out why it
|
|
|
|
crashed, the best thing to do is type <command>run</command> and let
|
|
|
|
your program run. After it crashes, you can type
|
|
|
|
<command>where</command> to find out where it crashed, or
|
|
|
|
<command>info locals</command> to see the values of all the local
|
|
|
|
variables. There's also a <command>print</command> that lets you look
|
|
|
|
at individual variables or what pointers point to.</para>
|
|
|
|
|
|
|
|
<para>If your program is doing something unexpected, you can use the
|
|
|
|
<command>break</command> command to tell gdb to stop your program when it
|
|
|
|
gets to a specific function or line number:</para>
|
|
|
|
|
2008-07-17 19:49:45 +08:00
|
|
|
<example id="gdb-break"><title>"break" in gdb</title>
|
2000-02-18 03:38:33 +08:00
|
|
|
<screen>
|
|
|
|
<prompt>(gdb)</prompt> break my_function
|
|
|
|
<prompt>(gdb)</prompt> break 47
|
|
|
|
</screen>
|
|
|
|
</example>
|
|
|
|
|
|
|
|
<para>Now, when you type <command>run</command> your program will stop
|
|
|
|
at that "breakpoint" and you can use the other gdb commands to look at
|
|
|
|
the state of your program at that point, modify variables, and
|
|
|
|
<command>step</command> through your program's statements one at a
|
|
|
|
time.</para>
|
|
|
|
|
|
|
|
<para>Note that you may specify additional arguments to the
|
|
|
|
<command>run</command> command to provide command-line arguments to
|
|
|
|
your program. These two cases are the same as far as your program is
|
|
|
|
concerned:</para>
|
|
|
|
|
2008-07-17 19:49:45 +08:00
|
|
|
<example id="gdb-cliargs"><title>Debugging with command line arguments</title>
|
2000-02-18 03:38:33 +08:00
|
|
|
<screen>
|
2008-12-15 17:37:50 +08:00
|
|
|
<prompt>bash$</prompt> myprog -t foo --queue 47
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2008-12-15 17:37:50 +08:00
|
|
|
<prompt>bash$</prompt> gdb myprog
|
2000-02-18 03:38:33 +08:00
|
|
|
<prompt>(gdb)</prompt> run -t foo --queue 47
|
|
|
|
</screen>
|
|
|
|
</example>
|
|
|
|
|
|
|
|
|
|
|
|
</sect1>
|