【GDB】GDB动态打印不修改源码printf|打印类Class的成员|定义变量
目录
GDB动态打印命令dprintf来实现print消息的输出,
dprintf原理
dprintf命令会设置一个特殊的断点,这可以通过info break查看,dprintf设置了类型为dprintf的特殊断点,当程序执行到该断点时,GDB将按照template和expression打印消息,打印完成后继续执行程序。这个过程非常短暂(和仿真器的速度有关),人是感觉不出程序停顿的,所以看起来就跟是目标程序在打印消息一样。
dprintf用法
dprintf location,template,expression [,expression ...]
location:为需要打印消息的位置,可以是函数名、行号、文件名:行号等。
template:打印的格式,相当于printf函数的第一个参数。
expression:格式化消息的数据源。
在指定行打印
dprintf perf_msgr_client.cc:133,"Test send i = %d,ops = %d,inflight = %d\n",i,ops,inflight
在指定函数打印
dprintf perf_msgr_client.cc:ready,"In fun ready:c= %d,jobs=%d\n",c,jobs
详细说明和例子:
http://www.voidcn.com/article/p-psihlpzk-bam.html
用GDB动态打印快速实现嵌入式系统的调试输出_zoomdy's blog-CSDN博客_gdb动态打印
打印类Class的成员
p this 错误
p *this 正确
p this->opp 正确
动态修改变量的值
(gdb) print n=10 修改
(gdb) print n 显示
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。
自定义变量
set $ThrIdx=1
例子:
可是当要对数百个线程进行查看时,可以设定一个变量来进行遍历,简化操作。
1、初始化
set $ThrIdx=1
2、遍历(复制5遍是为了一次可以查看5个线程的堆栈)时,只需要点击鼠标右键。
thread $ThrIdx++
bt
thread $ThrIdx++
bt
thread $ThrIdx++
bt
thread $ThrIdx++
bt
thread $ThrIdx++
bt
dmesg
打印环形缓冲区的内容。这些信息还会实时发送到syslogd
或klogd
(在它们运行时),最终以形式发送给/var/log/messages
;什么时候dmesg
最有用是捕获之前syslogd
和/或klogd
开始的启动时消息,以便将它们正确记录。