在Linux使用gdb命令行进行单步调试
准备工作:在compile这一步,添加选项 ‐g
g++ ‐g main.cpp ‐o helloworld
或
%.o: %.cpp
g++ ‐c ‐g ‐MMD $< ‐o $@
进入gdb界面后,使用命令来操纵调试过程。
gdb ./helloworld 进入gdb界面
b (break) : 添加断点
r (run): 重头开始运行程序
n (next): 下一步
c (continue): 程序继续运行,直到下一处断点,
或者程序运行结束
q (quit): 退出程序界面
(注:可以输入全称break,也可以只输入b)
添加断点:
b main (加上函数名)
b main.cpp:12 (文件名+行号)
b 12 (当前文件的行号)
b Object::Create (类名 + 成员函数)
显示断点 info break
删除断点 del break 2 (后面的2是编号)
next 执行下一步
n 执行下一步
n 3 执行下面三步
p (print) 显示表达式的值
p a
p a+b
p (Object*)p1‐>a
更特殊的用法,像函数一样调用显示
p (“%d”, 12)
disp (display) 监视变量,相当于VC下的watch
x 显示内存的值
x/16xb buf
其中,
16: 显示16个单位
x: 以十六进制显示 (x d u f s …)
b: 单位是1字节 (可选 b h w g )
byte, half‐word, word, giant
help x
help info
可以查看某个子命令的帮助
bt (backtrace) 查看错误时刻的栈信息
内存转储
1. 在运行该程序的shell里运行命令
ulimit ‐c unlimited
(注:在shell关闭重启后,要重新运行一次)
2. 运行程序
程序发生段错误时,程序退出,同时当发生错误
时的信息转储(dump)到一个core.*文件。
3. 用gdb来查看发生段错误的代码位置
gdb helloworld core.***
那么,如何判断一个程序是否带有“调试信息”呢?
第一种方法: (直接查看)
objdump ‐h helloworld
(注:gcc g++ gdb objdump nm ar ld …是一套工具)
第二种方法:
gdb helloworld
如果调试信息,会提示:
Reading symbols from helloworld…(no debugging
symbols found)…done