1.使用gcc时,需要使用gcc -g选项
2.如果想要把生成的可执行文件的调试信息去掉,可以使用strip命令.
3.调试程序时,最好把编译器的优化给关掉
gdb调试程序的三种方式:
1.gdb filename
2.gdb attach pid # 分离可以用detach
3.gdb filename corename
gdb常用的命令:
命令(简写) | 含义 |
help command | 救命啊,命令 |
list(l) | 列出附近的代码,l -表示前面的. |
break(b) | 打断点 b funcname b LineNo b filename:LineNo |
run(r) | 运行 |
continue(c) | 运行到下一个断点处 |
print(p) | 打印, 可以查看错误p strerror(errorno) 也可以用来修改变量,比如p a = 3. 也可以计算表达式, p 1+2 |
ptype | 打印类型,也可以打印结构体内容 |
info thread | 打印线程的信息 切换用thread + 线程序号 |
info args | 打印参数信息 |
backtrace(bt) | 调用堆栈,可以使用 f 堆栈号 来切换 |
frame(f) | 切换到某个堆栈 |
info break(info b) | 查看断点信息 |
enable | +断点编号(可以多个):表示对某个起作用; 不加表示对所有起作用 |
disable | |
delete | |
next(n) | 单步步过 |
step(s) | 单步步入 |
util | util LineNo 执行到某行 |
jump(j) | j LineNo或者函数地址 跳转到某处 |
finish | 执行完当前层函数,返回到上一层 |
return | 当前层函数后面的直接不执行,返回到上一层.可以带返回值,返回值会赋给函数调用方. |
disassemble | 反汇编, set disassembly-flavor intel 可以设置为intel风格,就是VS下的那种风格 |
tb | 临时断点,只第一次起作用 |
set args | 设置参数 |
watch | watch监视变量,当变量发生变化时就会自动中断,很神奇是不是~ 删除watch的方式: 先info watch,然后删除对应的编号. |
display | 显示你添加进去的变量,每一次中断的位置都会显示 |