[GNU/Linux]gdb调试

在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

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注