1.gdb调试调用
测试程序名为test.c
,生成的可执行文件名为test
,这两个名字都可以自定义。
插入调试信息有两种方式:
gcc -g test.c -o test
gcc -o test -g test.c
这里加上-g是为了在编译时把调试信息加到可执行文件里。因为调试是对最后的可执行文件进行处理而不是对其它文件(比如说.c文件)
2.启动gdb
gdb test
出现(gdb)开头,说明进入调试界面了。
3.调试操作指令
3.1 查看帮助
(gdb) help
3.2 查看文件
命令l(代表list,列出源码的意思), l 1,23 表示列出从第一行到第22行的源码(l 是小写L不是大写i,要注意)。
(gdb) l
3.3 插入断点
断点设置可以是行号也可以是函数入口。
命令b(代表break,设置断点的意思),除了上图的行数断点和函数断点外(前后鼻音口语区分一下),还有个条件断点。比如上图的示例:b 18 if i == 10 表示当i == 10 的时候才出现断点。
(gdb) b 18
(gdb) b 18 if i == 10
3.4 查看和删除断点
在设置完断点后可以通过info break来查看设置断点情况。(下面几个都可以,结果一样)
(gdb) info break
(gdb) info b
(gdb) i b
获取断点信息后,删除断点。删除指令后的数字为上图中的Num值,不是当初b进去的行号。
(gdb) d 2
3.5 运行代码
GDB默认是从首行开始运行代码,直接输入r;若想在指定行开始运行,在r后面加上行号。
(gdb) r
(gdb) r 18
3.6 单步执行
输入n (next)或者s (step)。
这两个的区别在于:如果有函数调用,s 会进入该函数而n 不会。
(gdb) n
(gdb) s
3.7 查看变量值
键入代码中存在的变量,即可查看,例如:查看i变量值。
(gdb) p i
3.8 恢复程序运行
执行c (continue),会跳到下个断点,如果后续没断点了就会执行完剩余程序。
若该断点在循环中,可以输入clear 断点行号 清除该设置的断点然后再跳往下个断点。
(gdb) c
(gdb) clear
3.9 查看函数堆栈
(gdb) bt
3.10 退出调试
执行finish 是退出函数,执行q 是退出gdb。
(gdb) q
补充
1.查看线程信息
info threads
2.回车键
重复上一条指令。