最近刚刚开始学会使用gdb,之前一直以为很难用,但是用了之后才发现,这真的是个好东西,比手动printf方便多了。
这篇文章会记录我用到过的gdb命令,后续会随时补充。
首先,我们使用如下源代码来作为测试的例子:
int main() { int a; a = 10; return 0; }
使用gdb调试一个程序前,我们需要使用-g选项编译源文件,产生调试信息,这样我们就可以在gdb中使用l命令列出源文件的代码,并使用b命令打断点了
g++ -g test.c -o test
OK,编译完毕后,我们使用gdb来调试生成的可执行文件
gdb ./test
接着,我们可以使用l命令列出源文件的代码
(gdb) l 1 int main() { 2 int a; 3 a = 10; 4 return 0; 5 }
然后,我们接下来就可以使用b命令给程序打断点了
(gdb) b 2 Breakpoint 1 at 0x5fe: file test.c, line 2. (gdb) b 3 Note: breakpoint 1 also set at pc 0x5fe. Breakpoint 2 at 0x5fe: file test.c, line 3. (gdb) b 4 Breakpoint 3 at 0x605: file test.c, line 4.
这样,我们就给程序的2、3、4行打上了断点。
这时,我们就可以开始运行这个程序了,需要使用的命令是r
(gdb) r Starting program: /home/mtl/code/cpp/HttpServer1/src/test Breakpoint 1, main () at test.c:3 3 a = 10;
可以看到程序开始运行,并停在了断点1处,此时,我们可以用p命令来打印a的值,如下:
(gdb) p a $1 = 0
这表示此时a的值是0。
c命令是从断点处继续运行程序,我们使用多次c命令继续运行程序直到程序结束,并依次打印a的值:
(gdb) c Continuing. Breakpoint 3, main () at test.c:4 4 return 0; (gdb) p a $2 = 10 (gdb) c Continuing. [Inferior 1 (process 6235) exited normally]
可以注意到断点2并没有出现,而是直接到了断点3,而且前面打断点的时候也可以看到,提示了断点1和断点2相同,手册中说断点所在行是不执行的,
而且声明变量似乎在指令之前就执行了,所以我们的断点1和断点2就重复了。
最后可以看到程序正常结束了。
另外,使用info命令可以查看很多信息,具体的可以使用无参数的info,查看选项列表。