作者:fbysss msn:[email protected] blog:blog.csdn.net/fbysss 声明:本文由fbysss原创,转载请注明出处 关键字:GDB
gdb真是个好东西,linux下开发必不可少的调试工具,今日一见,相见恨晚!
char * data;
…
4.用
p
命令可以查看动态指针指向的区域数据
p
data@len len
为要显示的区域长度
5.x
可以查看地址中的值,假设rgbValue是一个DWORD值,
x/d &rgbValue
表示以整数方式显示
x/x &rgbValue
表示以十六进制方式显示
#define RGB(r,g,b) ((DWORD) (((BYTE) (r)|((WORD) (g) << 8)) | (((DWORD) (BYTE) (b)) << 16)))
rgbValue = rgb(0,255,1);
(gdb)x/4t &rgbValue
表示打印四个字节,以二进制显示 显示结果:00000000 11111111 00000001 00000000
x
按十六进制格式显示变量。
d
按十进制格式显示变量。
u
按十六进制格式显示无符号整型。
o
按八进制格式显示变量。
t
按二进制格式显示变量。
a
按十六进制格式显示变量。
c
按字符格式显示变量。
f
按浮点数格式显示变量。
x/<n/f/u> <addr>
n
、
f
、
u
是可选的参数。
n
是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。
f
表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是
s
,如果是指令地址,那么格式可以是
i
。
u
表示从当前地址往后请求的字节数,如果不指定的话,
GDB
默认是
4
个
bytes
。
u
参数可以用下面的字符来代替,
b
表示单字节,
h
表示双字节,
w
表示四字节,
g
表示八字节。当我们指定了字节长度后,
GDB
会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。
<addr>
表示一个内存地址。
n/f/u
三个参数可以一起使用。例如:
命令:
x/3uh 0x54320
表示,从内存地址
0x54320
读取内容,
h
表示以双字节为一个单位,
3
表示三个单位,
u
表示按十六进制显示。
print
出来的结果
并不是最真实的,比如
255
这个字节就是显示一个空值。
6.man gdb可以看到如下常用命令
break [file:]function
Set a breakpoint at function (in file).
break n
设置断点在某行
clear n
删除断点
run [arglist] --
假如命令行有参数,写在后面
Start your program (with arglist, if specified).
bt Backtrace: display the program stack.
print expr -- 打印表达式,可以在此动态改变变量值,对调试很有好处
Display the value of an expression.
c Continue running your program (after stopping, e.g. at a breakpoint). --继续运行
next Execute next program line (after stopping); step over any function calls in the line. --单步跳出
edit [file:]function --编辑文件,这次我没能成功,edit的时候,源文件和目录之间少了“/”不知为何
look at the program line where it is presently stopped.
list [file:]function --列出当前语句附近的代码
type the text of the program in the vicinity of where it is presently stopped.
step Execute next program line (after stopping); step into any function calls in the line.--执行下一步
help [name]
Show information about GDB command name, or general information about using GDB.
7.display命令可以持续跟踪变量 参考了如下日志:http://oss.lzu.edu.cn/blog/blog.php?do_showone/tid_599.html
1.在编译时要首先加上
-o outfile -g
参数才能调试,注意不要写成
-o –g outfile
,会出错
2.要记得,
step
之后,断点处看到的语句才会执行。
3.print
表达式
比如
x=1
可以动态在调试时改变变量值