1.GDB中将需要的过长的调试信息输出到文件
下面的例子是用GDB将进程中所有的线程的堆栈信息输出到文件threadinfo.txt中:
# (gdb) set logging file threadinfo.txt
# (gdb) set logging on
# (gdb) thread apply all bt
# (gdb) set logging off
# (gdb) quit
详细说明:
1.# (gdb) set logging file threadinfo.txt
设置输出的文件名称
2.# (gdb) set logging on
输入这个命令后,此后的调试信息将输出到文件threadinfo.txt
3.# (gdb) thread apply all bt
打印所有线程栈信息(可以是任何其他调试指令,这里以此为例)
4.# (gdb) set logging off
输入这个命令,关闭到指定文件的输出
5.# (gdb) quit
退出gdb调试
之后打开threadinfo.txt就可以看到调试进程的所有的线程的堆栈信息.
2. GDB中对输出内容自动翻页
set pagination off
3. GDB中对"..."中的内容进行展开
gdb调试打印完整字符串-关于set print element
对于gdb时想要查看长的字符串有时候会显示不全,怎么办呢,gdb参看数组字符串时默认只是显示部分的数据,
通过这个命令可以修改:
set print elements 0
默认这里设置是200,设置为0表示没有限制
4.记一次打印550个元素的map到文件中
gdb attach 31543
# (gdb) show print elements # 显示默认输出元素个数?
# (gdb) set logging file g_mapDeviceDesc.txt # 设置输出文件的名字
# (gdb) set print element 0 # 将文本长度设置成不限制长度
# (gdb) set logging on # 打开日志记录到文件中
# (gdb) set pagination off # 设置自动翻页
# (gdb) p g_mapDeviceDesc # 打印变量
# (gdb) set logging off # 关闭日志记录到文件中
# (gdb) quit # 退出
5.待学习
1.
gdb -ex "set pagination 0" -ex "thread apply all bt" -batch -p 13347 # 命令行
2.
continue N # 反复执行
3.
rwatch
awatch
4.
thread apply all command # 所有线程都执行命令打印栈桢
比如:thread apply all bt //所有线程都打印栈桢
5.set non-stop on
6.小总结
首先,程序编译后如果要加上gdb调试信息,要加上编译选项-g,如:gcc -g test.c -o test
载入到gdb:执行gdb test。或者直接gdb,进入gdb后,执行file test,样的效果。
常用命令:
list(l):查看载入程序
break(b):设置断点,如:在main函数处设置断点:break main;break 行号,在制定行添加断点;break 文件名:行号,在指定文件的指定行添加断点;break 行号 if 条件 当条件问真时,指定行号处断点生效,例:b 5 if i=10,当i等于10时第5行断点生效。
info break: 查看所有设置的断点
delete 断点编号:删除断点
run(r):运行程序。
next(n):单步运行程序(不进入子函数)
step(s):单步运行程序(进入子函数)
continue(c):继续运行程序
print(p)变量名:查看指定变量值
finish 运行程序,直到当前函数结束
watch 变量名:对指定变量进行监控
quit(q):推出gdb
gdb调试程序的时候打印变量值会出现 情况,
可以在gcc编译的时候加上 -O0参数项,意思是不进行编译优化,调试的时候就会顺畅了,
运行流程不会跳来跳去的,发布项目的时候记得不要在使用 -O0参数项,gcc 默认编译或
加上-O2优化编译会提高程序运行速度.
转自: http://www.360doc.com/content/11/0121/16/1964482_88118508.shtml
用gdb调试程序时,常常很困惑一些命令的使用,要么是不知道这个命令,要么忘了命令的使用方法。
呵呵,有时迷茫了自己处在什么堆栈的深处,这时使用where命令能够清晰的看到自己的位置,有时在
循环太多让人受不了了,可使用u或者finish或者jump命令来跳出去。
gdb常用:
run 启动程序运行
next 单步执行(不到函数内部)
step 单步执行,跟踪到函数内部
finish 继续执行,直到当前函数结束
continue 继续执行,直到下一个断点
jump 9 直接跳到指定行
list 显示源码
l 3,10 显示特定范围的源码 l main显示函数的源码
set listsize 50 修改源码显示行数
break 设置断点
b main设置函数断点
b 9 设置指定行断点
b 将下一行设置为断点
b test if a == 10 设置条件断点
delete 删除断点
d 3 删除指定的断点
condition 修改条件 condition 4 a == 90
info 查看信息
info threads 查看线程信息
info breakpoints 查看断点信息
info locals 显示局部变量
info args 显示函数变量
info registers 显示寄存器数据
thread 2 切换线程
where 查看调用堆栈(bt 或者 info s)
frame 查看当前堆栈帧
frame 8 查看指定堆栈帧信息
info frame 查看当前堆栈帧更详细的信息
print a 打印变量信息
print/x a 十六进制输出变量信息
print a + b 可以进行表达式计算
print $eax 显示某个寄存器的数据
x/nfu 0×300098 显示指定地址的内存数据
n 显示内存单位,长度
f 格式(除了 print 格式外,还有 字符串s 和 汇编 i)
u 内存单位(b: 1字节; h: 2字节; w: 4字节; g: 8字节)
set vairiable a = 100 可以修改变量的值
commands 指定到了特定断点后执行的命令序列
whatis buf 显示变量的类型
dump memory 输出文件名 内存起始地址 内存终止地址
restore 文件名 binary 起始位置
watch buf buf的值一旦改变,会触发watchpoint
奇淫技巧:
cat ~/.gbinit gdb会从这个文件读取配置
cat ~/.gdb_history
对于gdb时想要查看长的字符串有时候会显示不全,怎么办呢,gdb参看数组字符串时默认只是显示部分的数据,通过这个命令可以修改:
set print elements 0
默认这里设置是200,设置为0表示没有限制
还有其它一些set命令可以试试:
set print address
set print address on
打开地址输出,当程序显示函数信息时,GDB会显出函数的参数地址。系统默认为打开的
set print object
在C++中,如果一个对象指针指向其派生类,如果打开这个选项,GDB会自动按照虚方法调用的规则显示输出,如果关闭这个选项的话,GDB就不管虚函数表了。这个选项默认是off
show print pretty
查看GDB是如何显示结构体的
set print array
set print array on
打开数组显示,打开后当数组显示时,每个元素占一行,如果不打开的话,每个元素则以逗号分隔。
这个选项默认是关闭的
set print null-stop
如果打开了这个选项,那么当显示字符串时,遇到结束符则停止显示。这个选项默认为off
set print pretty on
如果打开printf pretty这个选项,那么当GDB显示结构体时会比较漂亮
set print union
设置显示结构体时,是否显式其内的联合体数据。例如有以下数据结构
p string+n显示偏移n后的字符串内容,这个使用起来也是比较方便的
set pagination
set pagination off
设置不需要手动翻页,当我们需要翻页才能看接下来的内容的时候,可以通过将set pagination off
其设置成自动翻页。
多进程下的跟踪调试:
http://www.cnblogs.com/zhenjing/archive/2011/06/01/2065693.html