本文主要是介绍初学GDB(1),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
以The C Programming Language 1.5.1节中的程序copy.c为例:
#include <stdio.h>
main()
{int c;while ((c = getchar()) != EOF){putchar(c);}
}
用gcc进行编译gcc -g copy.c -o copy
,-g表示生成调试信息。
然后就可以用gdb进行调试了gdb copy -q
,-q用于忽略gdb的版本信息等。
输入命令l
可以显示代码。
在第5行插入断点b 5
开始调试r
程序运行到第5行的断点出停止,此时加入观察变量c的命令watch c
单步调试n
此时可以输入一些字符,例如abc,然后回车,发现变量c的值发生了改变,变为了97,即a的ascii码。
继续运行至断点处c
,可以看到c的值从97变为98,即b的ascii码。
输入命令c
继续运行,看到c的值由98变为99,即c的ascii码。
输入命令c
继续运行,看到c的值由99变为10,即换行符\n的ascii码。
输入kill
终止程序。
命令info b
可以看到所有的断点信息,delete
删除断点。
最后用命令q
退出gdb调试。
以上的完整版记录如下:
xxx@xxx-VirtualBox:~/test$ gdb copy -q
Reading symbols from copy...done.
(gdb) l
1 #include <stdio.h>
2 int main()
3 {
4 int c;
5 while ((c = getchar()) != EOF){
6 putchar(c);
7 }
8 return 0;
9 }
(gdb) b 5
Breakpoint 1 at 0x804845c: file 1-5-1-copy.c, line 5.
(gdb) r
Starting program: /home/ant/test/copy Breakpoint 1, main () at 1-5-1-copy.c:5
5 while ((c = getchar()) != EOF){
(gdb) watch c
Hardware watchpoint 2: c
(gdb) n
abcHardware watchpoint 2: cOld value = 134513841
New value = 97
0x08048474 in main () at 1-5-1-copy.c:5
5 while ((c = getchar()) != EOF){
(gdb) c
Continuing.Hardware watchpoint 2: cOld value = 97
New value = 98
0x08048474 in main () at 1-5-1-copy.c:5
5 while ((c = getchar()) != EOF){
(gdb) c
Continuing.Hardware watchpoint 2: cOld value = 98
New value = 99
0x08048474 in main () at 1-5-1-copy.c:5
5 while ((c = getchar()) != EOF){
(gdb) c
Continuing.Hardware watchpoint 2: cOld value = 99
New value = 10
0x08048474 in main () at 1-5-1-copy.c:5
5 while ((c = getchar()) != EOF){
(gdb) kill
Kill the program being debugged? (y or n) y
(gdb) info b
Num Type Disp Enb Address What
1 breakpoint keep y 0x0804845c in main at 1-5-1-copy.c:5breakpoint already hit 1 time
(gdb) delete
Delete all breakpoints? (y or n) y
(gdb) q
这篇关于初学GDB(1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!