前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用gdb调试程序

使用gdb调试程序

作者头像
yifei_
发布2022-11-14 14:19:19
6690
发布2022-11-14 14:19:19
举报
文章被收录于专栏:yifei的专栏

gdb调试C/C++程序命令速记…

运行gdb

想要调试程序,在编译程序的时候需要添加-g参数.

代码语言:javascript
复制
g++ test.cpp -g -o test
gdb test #调试程序
gdb test -tui #显示代码窗口

另一种方式:

代码语言:javascript
复制
gdb #启动gdb
file test #用file命令来启动对test的调试

gdb调试没有链接源码

代码语言:javascript
复制
gdb> set directories pathname

设置参数

代码语言:javascript
复制
方法1:
(gdb)> set args xxx1 xxx2
(gdb)> show args
方法2:
(gdb)> b 22
(gdb)> run xxx1 xxx2
方法3:
root@~# gdb --args xxx1

断点管理

代码语言:javascript
复制
b <行号>	#添加断点,b:breakpoint的简写
b <函数名>	#添加断点
b <行号> if 表达式		#添加条件断点(好用)
d <断点编号>	#根据编号删除断点,d:delete(不好用啊)
d				#删除所有断点,delete也可以(可能会用到)
clear <行号>	#删除某行断点(好用)
i b		#查看断点

运行程序

代码语言:javascript
复制
r	#run的简写
list	#显示代码,如果显示不全再点个回车
list 行号	#显示以该行为中心的一段代码

控制调试进程

代码语言:javascript
复制
n	#单步执行,不跳入函数,next的简写(vs中F10)
s	#真正的单步执行,跳入函数,step(vs中F11)
continue	#继续运行程序到下一个断点(vs中F5)
until	#跳出当前循环或语句块
until <行号>	#继续运行到某一行
finish	#跳出函数

打印\监视变量

代码语言:javascript
复制
display 变量1   #推荐这种,每步都会输出要查看的变量
print <变量或者表达式>
print 地址@数字n	#打印从该地址开始的n个变量,例如:
	print a[0]@20
watch 变量名	#监视某变量,当变量的值发生变化时就打印该值

nb功能

代码语言:javascript
复制
set (i=0)	#设置i=0
set var key=value	#也可以,例如:
	set var i=10
print key=value		#三种形式,感觉这个是最方便的
call function()	#直接调用某函数,手动传值,例如:
	call sum(11,20)

快照管理

调试到某个地方时:

代码语言:javascript
复制
ch	#添加当前状态的快照,checkpoint的简写(nb啊)
i ch	#查看快照信息
restart 1	#运行1号快照
d c <ID>	#删除编号为ID的快照

窗口设置

代码语言:javascript
复制
layout src	#显示源码窗口
layout asm	#显示反汇编窗口
layout regs	#显示源码\反汇编\寄存器窗口
layout split	#显示源码和反汇编窗口

调试coredump

core文件相关设置

代码语言:javascript
复制
#查看资源相关限制信息
ulimit -a

#设置core文件大小为无限大,设置0则不会产生core文件
ulimit -c unlimited

#查看core文件存储位置
cat /proc/sys/kernel/core_pattern

#修改core文件位置
echo "/data/coredump/core.%e.%p" > /proc/sys/kernel/core_pattern
/data/coredump是自己指定的存放coredump文件的路径
%e表示程序的文件名
%E:程序文件的完整路径
%p表示进程的ID
%t:进程奔溃的时间戳
%s:哪个信号让进程奔溃

#永久设置core文件大小和存储位置
vim /etc/profile
ulimit -c unlimited
echo "/data/coredump/core.%e.%p" > /proc/sys/kernel/core_pattern

gdb调试core文件

代码语言:javascript
复制
#启动gdb调试core
gdb test core.xxx.xxx

#查看堆栈
bt 或 where

#跳转到1号栈帧
f 1

#打开该帧函数的反汇编代码
disassemble

调试多线程

几个常用命令

代码语言:javascript
复制
#打印线程信息
info threads

#查看所有线程的堆栈信息
thread apply all bt

#查看指定线程的堆栈信息
thread apply 5 bt

#进入指定线程栈空间
thread 5

代码语言:javascript
复制


代码语言:javascript
复制

其他

PS:只要没有歧义,大部分命令都可以只输入第一个字母.

代码语言:javascript
复制
q		#退出gdb
bt		#查看堆栈,backtrace简写
info locals	#显示当前函数中的所有变量值
cgdb test	#一个可视化调试工具.
(gdb) wi	#可视化调试
(gdb) whatis a	#查看变量类型
  • 调试时重定向 run < test.txt

问题记录

1.No frame is currently executing in specified block Command aborted. 问题原因:使用watch监视变量tmp,但是程序运行到tmp未定义的地方了. 解决方法:info watch查看变量tmp的编号,delete <编号> 就可以了.

参考

https://www.xuebuyuan.com/1855384.html https://www.cnblogs.com/TianFang/archive/2013/01/20/2868889.html https://www.cnblogs.com/rosesmall/archive/2012/04/13/2445527.html https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/gdb.html https://www.jianshu.com/p/08de5cef2de9

欢迎与我分享你的看法。 转载请注明出处:http://taowusheng.cn/

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-12-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 运行gdb
  • 设置参数
  • 断点管理
  • 运行程序
  • 控制调试进程
  • 打印\监视变量
  • nb功能
  • 快照管理
  • 窗口设置
  • 调试coredump
  • 调试多线程
  • 其他
  • 问题记录
  • 参考
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档