linux下程序的调试感觉不太方便,没办法,硬着头皮也要弄一下了。主要参考书籍:
- 《软件调试实战》
- 《软件调试的艺术》
- 《Debug Hacks中文版——深入调试的技术和工具》
其中第三本较为实用,但较之前两本稍显复杂,前两本适合快速入门。
ulimit -c查看我们是否开启了调试,显示0表示没有开启。
ulimit -c unlimit表示不限制内核转储文件的大小。
这里我们首先创建一个会造成core dump的c文件。我这里是null_pointer_gdb.c代码如下:
#include<stdio.h>
int main(void)
{
int *a = NULL;
*a = 0x1;
return 0;
}
然后编译
gcc -g -o null_pointer null_pointer_gdb.c
-g表示生成调试信息
执行编译好的文件
./null_pointer
就会生成core文件了一般和可执行文件放在一个目录中。
要用GDB调试生成的转储文件用指令
gdb -c core.7569 ./null_pointer
参数是core文件和可执行文件
2.gdb调试可执行文件
gcc -Wall -O2 -g null_pointer_gdb.c
gdb a.out
3.断点调试
break main(在main函数处添加断点)(缩写:b main)
break 13(在13行添加断点)(缩写:b 13)
info break (查看断点信息)(缩写:i b)
run(启动调试)(缩写:r)
4.步进,step-over与finish
step单步调试(缩写:s)
next(执行到函数调用后的那一行,不进入调用)(缩写:n)
finish(单步进入后,快速从调用中退出来)(缩写:fin)
后记
GDB 传入命令行参数
start learn10.pcd
continue
===================2018.06=========================
基本
r
从头开始运行程序直到断点。在一次debug中你可以通过用 r 来多次重新运行程序,而不必重新rosrun 或 roslaunch.
q
退出debug。
查看代码/导航
l
列出当前所在文件的前10行。
l 50
列出当前所在文件从第50行开始的10行。
l functionName
列出当前所在文件从某函数开始的10行。
bt
“Backtraces”,列出调用堆栈。
up/down
在堆栈中向上/向下移动一级。可以简写为u和d
查看/修改内存
p x
相当于“print x”。显示当前变量 x 的值。
x address
查看指针所指位置的值。
set x = 12
set x = y
修改变量x的值。
call function()
调用某函数。这个函数可以是你程序里定义的函数,甚至是标准库函数,我的理解是只要在当前位置可访问到的函数都可以调用。这是一个极其有用的功能,生生把c++用成Matlab 。
display x
和print的区别是,x不是只显示一次就消失,而是一直显示,每次继续运行程序都会刷新。相当于VS的“watch”功能。
undisplay x
停止对变量x的display。
断点
b
b即break。在当前行设置断点。
b 45
b functionName
在某行/某函数开始处设置断点。常用:b main 在程序开始设置断点。
watch x == 3
设置条件断点。这个比VS的条件断点更方便,因为它不需要设置在哪一行!时刻监控!
info break
查看当前存在的所有断点。每个断点都有自己的编号。
delete N
删除编号为N的那个断点。
调试运行
n
“next”。运行一行代码。 相当于VS的step over。
s
“step”。运行一个指令。相当于VS的step in。
n和s都可以一次运行多行,比如n 5
c
“continue”。继续运行直到下一个断点。
f
“finish”,运行完当前程序。相当于VS的 step out。