Вы можете пользоваться этим руководством в свое удовольствие, чтобы прочитать о GDB все. Однако, достаточно небольшого количества команд, чтобы начать пользоваться отладчиком. Эта глава иллюстрирует эти команды.
В этом примере сеанса мы выделяем ввод пользователя так: ввод, чтобы его было проще отличить от находящегося рядом вывода программы.
В одной из предварительных версий программы GNU m4 (настраиваемый макропроцессор), была допущена следующая ошибка: иногда, при замене строк, определяющих кавычки, со значений по умолчанию, команды, использовавшиеся для поиска одного макроопределения внутри другого, прекращали работать. В следующем коротком сеансе m4, мы
определим макрос foo, который расширяется до 0000; затем мы используем встроенную процедуру m4 defn, чтобы определить bar точно также. Однако, когда мы изменим открывающую кавычку на <QUOTE>, а закрывающую на <UNQUOTE>, та же самая процедура не сможет определить новый синоним baz:
$ <B>cd gnu/m4</B> $ <B>./m4</B> <B>define(foo,0000)</B> <B>foo</B> 0000 <B>define(bar,defn(`foo'))</B> <B>bar</B> 0000 <B>changequote(<QUOTE>,<UNQUOTE>)</B> <B>define(baz,defn(<QUOTE>foo<UNQUOTE>))</B> <B>baz</B> <B>C-d</B> m4: End of input: 0: fatal error: EOF in string 2</A>
$ <B>gdb m4</B> GDB is free software and you are welcome to distribute copies of it under certain conditions; type "show copying" to see the conditions. There is absolutely no warranty for GDB; type "show warranty" for details. GDB 5.0, Copyright 1999 Free Software Foundation, Inc... (gdb)
(gdb) <B>set width 70</B>
(gdb) <B>break m4_changequote</B> Breakpoint 1 at 0x62f4: file builtin.c, line 879.
(gdb) <B>run</B> Starting program: /work/Editorial/gdb/gnu/m4/m4 <B>define(foo,0000)</B> <B>foo</B> 0000
<B>changequote(<QUOTE>,<UNQUOTE>)</B> Breakpoint 1, m4_changequote (argc=3, argv=0x33c70) at builtin.c:879 879 if (bad_argc(TOKEN_DATA_TEXT(argv[0]),argc,1,3))
(gdb) <B>n</B> 882 set_quotes((argc >= 2) ? TOKEN_DATA_TEXT(argv[1])\ : nil,
(gdb) <B>s</B> set_quotes (lq=0x34c78 "<QUOTE>", rq=0x34c88 "<UNQUOTE>") at input.c:530 530 if (lquote != def_lquote)
(gdb) <B>bt</B> #0 set_quotes (lq=0x34c78 "<QUOTE>", rq=0x34c88 "<UNQUOTE>") at input.c:530 #1 0x6344 in m4_changequote (argc=3, argv=0x33c70) at builtin.c:882 #2 0x8174 in expand_macro (sym=0x33320) at macro.c:242 #3 0x7a88 in expand_token (obs=0x0, t=209696, td=0xf7fffa30) at macro.c:71 #4 0x79dc in expand_input () at macro.c:40 #5 0x2930 in main (argc=0, argv=0xf7fffb20) at m4.c:195
(gdb) <B>s</B> 0x3b5c 532 if (rquote != def_rquote) (gdb) <B>s</B> 0x3b80 535 lquote = (lq == nil || *lq == '\0') ? \ def_lquote : xstrdup(lq); (gdb) <B>n</B> 536 rquote = (rq == nil || *rq == '\0') ? def_rquote\ : xstrdup(rq); (gdb) <B>n</B> 538 len_lquote = strlen(rquote);
(gdb) <B>p lquote</B> $1 = 0x35d40 "<QUOTE>" (gdb) <B>p rquote</B> $2 = 0x35d50 "<UNQUOTE>"
(gdb) <B>l</B> 533 xfree(rquote); 534 535 lquote = (lq == nil || *lq == '\0') ? def_lquote\ : xstrdup (lq); 536 rquote = (rq == nil || *rq == '\0') ? def_rquote\ : xstrdup (rq); 537 538 len_lquote = strlen(rquote); 539 len_rquote = strlen(lquote); 540 } 541 542 void
(gdb) <B>n</B> 539 len_rquote = strlen(lquote); (gdb) <B>n</B> 540 } (gdb) <B>p len_lquote</B> $3 = 9 (gdb) <B>p len_rquote</B> $4 = 7
(gdb) <B>p len_lquote=strlen(lquote)</B> $5 = 7 (gdb) <B>p len_rquote=strlen(rquote)</B> $6 = 9
(gdb) <B>c</B> Continuing. <B>define(baz,defn(<QUOTE>foo<UNQUOTE>))</B> baz 0000
<B>C-d</B> Program exited normally.(3)
(gdb) <B>quit</B>