GDB 常用调试命令

常用命令

run® , contiue©, break xxx, info break, next , step,
打印: p xxx, x /s(x,b) p (class) addr, p *array@len,
查看:info local, info symbol, info threads, info xxxx, show xxxx
监视:watch expr[thread threadnum] :设置一个表达式监视点,在表达式expr被改写和值改变时GDB会中断程序。

**

多线程调试:

**
thread apply all command: eg . thread apply all bt / breadk TestConnect.cpp:25
thread apply threadid1 threadid2 command //让一个或者多个线程执行command
info threads
thread number / t number
finish
info local
p my_mutex
通过日志或者其他方式打印超时锁,然后pstack +进程 ID 查看堆栈信息
用GDB:
1.设置断点
2.p pthread_mutex_t
用Valgrind的helgrind工具也可以检测到死锁,用法:valgrind -tool-helgrind ./deadlocks
开启GDB日志功能:
set logging on/off
set logging file file /改变当前的logfile 的name ,默认 gdb.txt
show logging //显示当前GDB日志的设置
path directory
show paths 显示程序可执行程序的搜索路径列表
show environment[varname]:打印varname环境变量的值,如果没提供,则打印全部环境变量的值
set environment varname[=value] 设置环境变量的值
unset environment varname 从环境变量中删除变量
attach: gdb在准备好要调试的进程后第一件事就是中断这个进程
如果你希望进程继续执行, 你可以在attach之后continue命令来继续
detach:在完成调试之后, 可以用detach来释放GDB对进程的控制,detach进程后,
进程继续执行, 如果你是用run命令启动的,detach之后会kill这个进程。
set print thread-events 控制线程开始和结束时打印消息。
set print thread-events on/off
show print thread-events
断点:
info breadk[n]//指定断点信息
break …if cond//当cond 为真时, 打断点。
rbreak regex :在所有匹配正则表达式regex的函数上设置断点,这个命令会在所有匹配的函数上设置无条件的断点
比如:foo
匹配开头是foo, ^foo只想匹配foo开头的函数。
rbreak :在程序里所有的函数上设置断点。
break linespec thread threadnum if cond //执行一个或多个线程的条件断点
watch expr[thread threadnum] :设置一个表达式监视点,在表达式expr被改写和值改变时GDB会中断程序。
info watchpoints:打印监视点
打印全局变量:file::var ; function::var
这里的fun或者file是这个静态变量的上下文的名字, 对于文件名, 可以用两个单引号将文件名包起来以GDB将其作为一个单词分析
p ‘f2.c’::x 打印f2.c文件里定义的全局变量x;
p/x (short[2])0x12345678(p/x不需要空格)
p/x (short[])0x12345678
int array = (int)malloc(len * sizeof(int));
p *array@len
print格式字符说明:
/x :16进制
/c : 字符常量
/d :整型
/s :字符串(如果可以)

gdb日志

比如要用info functions输出所有函数,结果往往有一大坨,所以可以将之输出到文件。
(gdb) set logging file <file name>
(gdb) set logging on
(db) info functions
(gdb) set logging off

gdb 设置动态库加载路径:

**
set solib-search-path设置动态库的搜索路径,该命令可设置多个搜索路径,路径之间使用“:”隔开(在linux中为冒号,DOS和Win32中为分号)。
set solib-absolute-prefix 与 set solib-search-path 的区别:
总体上来说solib-absolute-prefix设置库的绝对路径前缀,只对绝对路径有效;而solib-search-path设置库的搜索路径,对绝对路径和相对路径均起作用。(编译器自动链接的so库多采用绝对路径)。
详细规则有:
set solib-search-path由于是路径前缀,所以只能设置一个路径,而solib-search-path可以设置多个搜索路径

**

使用gcore工具产生core文件而不杀死进程
$ gcore pid (进程号)
gdb的generate-core-file命令
(gdb) generate-core-file
Saved corefile core.19388
(gdb) detach

gdb 调试工具dump出可疑内存:
gdb attach #先连接到进程中
gdb dump memory /path/dump.bin 0x0011 0x0021 # dump 出内存段的信息,具体要 dump 的内存段地址,可以借助之前pmap 排查的结果,以及 cat /proc//maps 中指示的地址段得出
strings /path/dump.bin | less # 查看内存内容, 相信你能从中发现一些不一样的东西

**GDB开启日志及设置显示格式:**
		(gdb) set height 0
		(gdb) set logging on
		
**打印指针:**
p *(TypePoint*)addr
当需要查看一段连续内存空间的值的时间,可以使用GDB的“@”操作符,“@”的左边是第一个内存地址,“@”的右边则是想查看内存的长度。
p *array@len
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值