废话以后有时间再加。

首先编译时开启调试选项:

1
g++ main.cpp -g -O0

-O0指定编译器的优化级别为 0,即不优化。

然后编译出来的可执行文件,默认名字是a.out. 直接了当,用 gdb 打开之,

1
gdb a.out

要调试必然要打断点,两种方式:指定行数;指定函数。

1
2
(gdb) break 10  // create breakpoint at line 10
(gdb) break main  // create breakpoint at the entrance of main

使用list在 gdb 中查看代码块以确定你要在哪一行设置断点(这就很麻烦,所以一般直接在 main 函数打个断点,然后单步去 run)。

设好断点以后,使用run启动程序,程序会在断点处停顿,等待你的输入指令。 gdb-demo

使用next进行单步执行,使用step步入。所谓步入就是如果有函数调用,程序会跟踪到所调用的函数内部的代码,而单步的话,则会直接完成函数调用,获得返回值(如果有的话)。

使用info locals查看栈变量的值,使用info args查看函数传入参数的值。使用print <variable>查看指定变量的值。

备注

  • GDB 里面的命令都有缩写(break=b, next=n, step=s, …)
  • 什么命令也不敲直接回车默认执行上一条命令
  • 使用help <command>来获取相关命令的使用帮助