- 1、本文档共13页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
gdb调试方法
gdb的调试方法
1. gdb的编译方法:
一般来说GDB 主要调试的是C/C++程序。要调试C/C++程序,首先在编译时,我们必须
要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的-g 参数可以做到这一点,如:
$ cc –g hello.c –o hello
$ g++ -g hello.cpp –o hello
2. 启动GDB 的方法有以下几种:
■gdb program
program 也就是你的执行文件,一般在当前目录下。
■ gdb program core
用gdb 同时调试一个运行程序和core 文件,core 是程序非法执行后core dump 后产生的文件。
■gdb program PID
如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach 上去,并调试它。program 应该在PATH 环境变量中搜索到。
详细的开关可以用gdb –help
3. 启动GDB ,进入调试环境。
(gdb)help
4. 搜索源代码
不仅如此,GDB 还提供了源代码搜索的命令:
forward-searchregexp
searchregexp
向前面搜索。
reverse-searchregexp
全部搜索。
其中regexp就是正则表达式,也可以是一个字符串的匹配模式,关于正则表达式,我
就不在这里说了,还请各位查看相关资料。
5. 源代码的内存
可以使用info line 命令来查看源代码在内存中的地址。Info line 后面可以跟“行号”,“函
数名”,“文件名:行号”,“文件名:函数名”,这个命令会打印出所指定的源代码在运行时
的内存地址,如:
(gdb)
info line tst.c:func
Line 5 of tst.c starts at address 0x8048456 func+6 and ends at 0x804845d
func+13.
还有一个命令(disassemble)你可以查看源程序测当前执行时的机器码,这个命令会把
目前内存中的指令dump 出来。如下面的示例表示查看函数func 的汇编代码。
查看运行时数据
在你调试程序时,当程序被停住时,可以使用print 命令(简写命令为p),或是同义命令
inspect 来查看当前程序的运行数据。print 命令的格式是:
printexpr
print/fexpr
expr是表达式,是你所调试的程序的语言的表达式(GDB 可以调试多种编程语言),
f是输出的格式,比如,如果要把表达式按16 进制的格式输出,那么就是/x。
可以通过这种形式指定你想查看的变量,是哪个文件中的或是哪个函数中的。例如,查看
文件f2.c 中的全局变量x 的值:
(gdb)
p ‘f2.c’::x
当然,“::”操作
右边则是你想查看的内存的长度。例如,你的程序中有这样的语句:
int *array = (int*)malloc(len*sizeof(int))
于是,在GDB 调试过程中,你可以用如下命令显示出这个动态数组的取值:
p *array@len
@的左边是数组的首地址的值,也就是变量array 所指向的内容,右边则是数据的长度,
其保存在变量len 中,其输出结果,大约是下面这个样子:
(gdb)
p *array@len
$1 = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40}
输出格式
一般来说,GDB 会根据变量的类型输出变量的值。但你也可以自定义GDB 的输出格式。
例如,你想输出一个整数的十六进制,或是二进制来查看这个整形变量的位的情况。要做到
这样,你可以使用GDB 的数据显示格式:
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。
(gdb)
p i
$21 = 101
(gdb)
p/a i
$22 = 0x65
查看内存
你可以使用examine 命令(简写是x)来查看内存地址中的值。X 命令的语法如下所示:
x/n/f/uaddr
n、f、u 是可选参数。
n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。
f 表示显示格式,参加上面。如果地址所指的是字符串,那么格式是s,如果地址是指令
地址,那么格式也可以是i。
u 表示从当前的地址往后请求的字节数,如果不指定的话,GDB 默认是4 个bytes。u 参
数可以用下面的字符来代替,b 表示单字节
文档评论(0)