表 27.1. 基本 gdb 命令. | 命令描述 |
| file | 装入想要调试的可执行文件。 |
| kill | 终止正在调试的程序。 |
| list | 执行一行源代码但不进入函数内部。 |
| next | 执行一行源代码但不进入函数内部。 |
| step | 执行一行源代码而且进入函数内部。 |
| run | 执行当前被调试的程序 |
| quit | 终止 gdb |
| watch | 使你能监视一个变量的值而不管它何时被改变。 |
| break | 在代码里设置断点, 这将使程序执行到这里时被挂起。 |
| make | 使你能不退出 gdb 就可以重新产生可执行文件。 |
| shell | 使你能不离开 gdb 就执行 UNIX shell 命令。 |
gdb 支持很多与 UNIX shell 程序一样的命令编辑特征。 你能象在 bash 或 tcsh里那样按 Tab 键让 gdb 帮你补齐一个唯一的命令, 如果不唯一的话 gdb 会列出所有匹配的命令。 你也能用光标键上下翻动历史命令。
gdb 应用举例
本节用一个实例教你一步步的用 gdb 调试程序。 被调试的程序相当的简单, 但它展示了 gdb 的典型应用。
ZqULinux联盟
下面列出了将被调试的程序。 这个程序被称为 greeting , 它显示一个简单的问候, 再用反序将它列出。 #include ZqULinux联盟 main () ZqULinux联盟 { ZqULinux联盟 char my_string[] = "hello there"; ZqULinux联盟 my_print (my_string); ZqULinux联盟 my_print2 (my_string); ZqULinux联盟 } ZqULinux联盟 void my_print (char *string) ZqULinux联盟 { ZqULinux联盟 printf ("The string is %sn", string); ZqULinux联盟 } ZqULinux联盟 void my_print2 (char *string) ZqULinux联盟 { ZqULinux联盟 char *string2; ZqULinux联盟 int size, i; ZqULinux联盟 size = strlen (string); ZqULinux联盟 string2 = (char *) malloc (size + 1); ZqULinux联盟 for (i = 0; i < size; i++) ZqULinux联盟 string2[size - i] = string[i]; ZqULinux联盟 string2[size+1] = `%content%'; ZqULinux联盟 printf ("The string printed backward is %sn", string2); ZqULinux联盟 } |
用下面的命令编译它:
gcc -o test test.c
这个程序执行时显示如下结果:
The string is hello thereZqULinux联盟
The string printed backward is
输出的第一行是正确的, 但第二行打印出的东西并不是我们所期望的。 我们所设想的输出应该是:
The string printed backward is ereht olleh
由于某些原因, my_print2 函数没有正常工作。 让我们用 gdb 看看问题究竟出在哪儿, 先键入如下命令:
gdb greeting
注意: 记得在编译 greeting 程序时把调试选项打开。 ZqULinux联盟
ZqULinux联盟
如果你在输入命令时忘了把要调试的程序作为参数传给 gdb , 你可以在 gdb 提示符下用 file 命令来载入它: ZqULinux联盟
ZqULinux联盟
(gdb) file greeting
这个命令将载入 greeting 可执行文件就象你在 gdb 命令行里装入它一样。
这时你能用 gdb 的 run 命令来运行 greeting 了。 当它在 gdb 里被运行后结果大约会象这样:
(gdb) run ZqULinux联盟 ZqULinux联盟 Starting program: /root/greeting ZqULinux联盟 ZqULinux联盟 The string is hello there ZqULinux联盟 ZqULinux联盟 The string printed backward is ZqULinux联盟 ZqULinux联盟 Program exited with code 041 |
这个输出和在 gdb 外面运行的结果一样。 问题是, 为什么反序打印没有工作? 为了找出症结所在, 我们可以在 my_print2 函数的 for 语句后设一个断点, 具体的做法是在 gdb 提示符下键入 list 命令三次, 列出源代码:
(gdb) list ZqULinux联盟
ZqULinux联盟
(gdb) list ZqULinux联盟
ZqULinux联盟
(gdb) list
技巧: 在 gdb 提示符下按回车健将重复上一个命令。
第一次键入 list 命令的输出如下: ZqULinux联盟
ZqULinux联盟
1 #include ZqULinux联盟 ZqULinux联盟 2 ZqULinux联盟 ZqULinux联盟 3 main () ZqULinux联盟 ZqULinux联盟 4 { ZqULinux联盟 ZqULinux联盟 5 char my_string[] = "hello there"; ZqULinux联盟 ZqULinux联盟 6 ZqULinux联盟 ZqULinux联盟 7 my_print (my_string); ZqULinux联盟 ZqULinux联盟 8 my_print2 (my_string); ZqULinux联盟 ZqULinux联盟 9 } ZqULinux联盟 ZqULinux联盟 10 |
如果按下回车, gdb 将再执行一次 list 命令, 给出下列输出: ZqULinux联盟
ZqULinux联盟
11 my_print (char *string) ZqULinux联盟 ZqULinux联盟 12 { ZqULinux联盟 ZqULinux联盟 13 printf ("The string is %sn", string); ZqULinux联盟 ZqULinux联盟 14 } ZqULinux联盟 ZqULinux联盟 15 ZqULinux联盟 ZqULinux联盟 16 my_print2 (char *string) ZqULinux联盟 ZqULinux联盟 17 { ZqULinux联盟 ZqULinux联盟 18 char *string2; ZqULinux联盟 ZqULinux联盟 19 int size, i; ZqULinux联盟 ZqULinux联盟 20 |
再按一次回车将列出 greeting 程序的剩余部分:
21 size = strlen (string); ZqULinux联盟 ZqULinux联盟 22 string2 = (char *) malloc (size + 1); ZqULinux联盟 ZqULinux联盟 23 for (i = 0; i < size; i++) ZqULinux联盟 ZqULinux联盟 24 string2[size - i] = string[i]; ZqULinux联盟 ZqULinux联盟 25 string2[size+1] = `%content%'; ZqULinux联盟 ZqULinux联盟 26 printf ("The string printed backward is %sn", string2); ZqULinux联盟 ZqULinux联盟 27 } |
根据列出的源程序, 你能看到要设断点的地方在第24行, 在 gdb 命令行提示符下键入如下命令设置断点:
(gdb) break 24
gdb 将作出如下的响应:
Breakpoint 1 at 0x139: file greeting.c, line 24
(gdb)
现在再键入 run 命令, 将产生如下的输出: ZqULinux联盟
ZqULinux联盟
Starting program: /root/greeting ZqULinux联盟 ZqULinux联盟 The string is hello there ZqULinux联盟 Breakpoint 1, my_print2 (string = 0xbfffdc4 "hello there") at greeting.
Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论 |
|
|
|
|