序
从网上找到的资料,整理一下。
实验
gdb带源码调试, 给被调试程序带上参数.
给gdb带上-tui参数,有dos调试器的感觉,很喜欢:)
修改变量值
bool b_rc = false; // 源码的内容
// 在gdb中修改变量值
(gdb) set variable b_rc = true
在gdb中用16进制显示变量的内容
p/x var
如果p 不带参数,就是按照10进制显示变量内容
p var
用gdb附加调试进程
先将工程编译成debug版,换到目标目录正常运行起来.
进入到工程源码目录, 运行以下下命令, 然后设置合适的断点, c跑起来,等待断点命中。
gdb -tui -p the_obj_pid
条件断点
如果要断在循环内的某个条件,下条件断点实用。
break 435 if i > 29
break 86 if (true == b_find)
运行中修改变量值
如果在一个循环中,要改变条件,跳出循环。那修改循环次数就很实用。
set i = 100
p i
打印一个结构指针
(gdb) p pw
$4 = (const struct passwd *) 0x611470
(gdb) p * pw
$6 = {pw_name = 0x612250 "root", pw_passwd = 0x6113d0 "x", pw_uid = 0, pw_gid = 0, pw_gecos = 0x6113f0 "root", pw_dir = 0x610010 "/root", pw_shell = 0x610030 "/bin/bash"}
断点断住后,刷新gdb窗口
refresh
gdb带窗口调试的命令
gdb -tui --args ./myprog para1 para2 para3
(gdb) break main
(gdb) run
(gdb) display argc
3: argc = 4
(gdb) display argv[0]
1: argv[0] = 0x7fffffffedb1 "/home/lostspeed/test/src/myprog"
(gdb) display argv[1]
2: argv[1] = 0x7fffffffedd4 "para1"
(gdb) display argv[2]
4: argv[2] = 0x7fffffffedd7 "para2"
(gdb) display argv[3]
5: argv[3] = 0x7fffffffedda "para3"
当在gdb中被调试程序结束后,或调试到中间,想从头开始完,可以在gdb中直接从头开始带参数调试。
(gdb) run /home/lostspeed/test/src/myprog param1 param2 param3
将gdb当作一个计算器
(gdb) print 9224
$6 = 9224
(gdb) print /x 9224
$6 = 0x2408
(gdb) print /x (9224 + 1)
$7 = 0x2409
设置断点
break 文件名:行号
break x.cpp:56
break 函数名
break main
当断点命中后,如果要继续跑到下一个断点,执行continue命令.
删除断点
clear 文件名:行号
clear x.cpp:298
重复上一次的命令执行
在单步时,经常需要输入n + 回车.
gdb如果没有输入命令回车时,执行的是上一次的命令。
这样在单步时,就方便了。只需要输入一次n +回车,如果不需要跟进函数(s), 就一直按回车就可以单步程序流程了.
跳出函数
如果不小心按s键步入了一个不关心的函数,可以输入finish+回车,返回上一级函数。
查看内存值
按照16进制打印缓冲区
x/[要打印的字节数量][显示格式(单字节,双字节,4字节,8字节)] 内存地址或变量名称
x/16ba p_my_data
ref
GDB 进行调试 使用心得
http://www.cnblogs.com/shipfi/archive/2008/08/04/1260293.html