gdb命令,随着使用慢慢补充

最近刚刚开始学会使用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,查看选项列表。

猜你喜欢

转载自www.cnblogs.com/mtl6906/p/10699361.html
今日推荐