【vc++精品源码栏目提醒】:网学会员,鉴于大家对vc++精品源码十分关注,论文会员在此为大家搜集整理了“gdb的调试方法 - 其它资料”一文,供大家参考学习!
gdb 的调试方法1. gdb 的编译方法:一般来说GDB 主要调试的是C/C程序。
要调试C/C程序,首先在编译时,我们必须要把调试信息加到可执行文件中。
使用编译器(cc/gcc/g)的-g 参数可以做到这一点,如: cc –g hello.c –o hello g -g hello.cpp –o hello2. 启动GDB 的方法有以下几种:■gdbprogram 也就是你的执行文件,一般在当前目录下。
■ gdb core用gdb 同时调试一个运行程序和core 文件,core 是程序非法执行后core dump 后产生的文件。
■gdb如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。
gdb会自动attach 上去,并调试它。
program 应该在PATH 环境变量中搜索到。
详细的开关可以用gdb –help3. 启动GDB ,进入调试环境。
gdbhelp4. 搜索源代码不仅如此,GDB 还提供了源代码搜索的命令:forward-searchsearch向前面搜索。
reverse-search全部搜索。
其中就是正则表达式,也可以是一个字符串的匹配模式,关于正则表达式,我就不在这里说了,还请各位查看相关资料。
5. 源代码的内存可以使用info line 命令来查看源代码在内存中的地址。
Info line 后面可以跟“行号”,“函数名”,“文件名:行号”,“文件名:函数名”,这个命令会打印出所指定的源代码在运行时的内存地址,如:gdbinfo line tst.c:funcLine 5 of tst.c starts at address 0x8048456 and ends at 0x804845d.还有一个命令(disassemble)你可以查看源程序测当前执行时的机器码,这个命令会把目前内存中的指令dump 出来。
如下面的示例表示查看函数func 的汇编代码。
查看运行时数据在你调试程序时,当程序被停住时,可以使用print 命令(简写命令为p),或是同义命令inspect 来查看当前程序的运行数据。
print 命令的格式是:printprint/是表达式,是你所调试的程序的语言的表达式(GDB 可以调试多种编程语言),是输出的格式,比如,如果要把表达式按16 进制的格式输出,那么就是/x。
可以通过这种形式指定你想查看的变量,是哪个文件中的或是哪个函数中的。
例如,查看文件f2.c 中的全局变量x 的值:gdbp ‘f2.c’::x当然,“::”操作右边则是你想查看的内存的长度。
例如,你的程序中有这样的语句:int array intmalloclensizeofint于是,在GDB 调试过程中,你可以用如下命令显示出这个动态数组的取值:p arraylen的左边是数组的首地址的值,也就是变量array 所指向的内容,右边则是数据的长度,其保存在变量len 中,其输出结果,大约是下面这个样子:gdbp arraylen1 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 按浮点数格式显示变量。
gdbp i21 101gdbp/a i22 0x65查看内存你可以使用examine 命令(简写是x)来查看内存地址中的值。
X 命令的语法如下所示:x/n、f、u 是可选参数。
n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。
f 表示显示格式,参加上面。
如果地址所指的是字符串,那么格式是s,如果地址是指令地址,那么格式也可以是i。
u 表示从当前的地址往后请求的字节数,如果不指定的话,GDB 默认是4 个bytes。
u 参数可以用下面的字符来代替,b 表示单字节,h 表示双字节,w 表示四字节,g 表示八字节。
当我们指定了字节长度后,GDB 会从指定的内存地址开始,读写指定字节,并把其当作一个值取出来。
表示一个内存地址。
n/f/u 三个参数可以一起使用。
例如:命令:x/3uh 0x54320 表示,从内存地址0x54320 读取内容,h