【GDB】GDB动态打印不修改源码printf|打印类Class的成员|定义变量

目录

dprintf原理

在指定行打印

在指定函数打印

打印类Class的成员

动态修改变量的值

自定义变量


【GDB】GDB调试总目录_bandaoyu的笔记-CSDN博客【GDB】GDB 调试多线程和多进程总结报错记录(gdb) b mps_guide_db.c:1699No source file named mps_guide_db.c.可能是因为调用了动态库,要打断点的文件是动态库的可以通过 以下方式得到解决:(gdb) set breakpoint pending on(gdb) b db_subscr_no_lookupFunction "db_subscr_no_lookup" not defined.Breakpoint 1https://blog.csdn.net/bandaoyu/article/details/120537228

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打印环形缓冲区的内容。这些信息还会实时发送到syslogdklogd(在它们运行时),最终以形式发送给/var/log/messages;什么时候dmesg最有用是捕获之前syslogd和/或klogd开始的启动时消息,以便将它们正确记录。

posted on 2022-10-04 01:24  bdy  阅读(102)  评论(0编辑  收藏  举报

导航