linux 调试工具 GDB 使用

gdb是linux下常用的代码调试工具,本文记录常用命令。

被调试的应用需要使用 -g 参数进行编译,如不确定可使用如下命令查看是否支持debug

cpp 复制代码
readelf -S filename | grep "debug"

启动调试

cpp 复制代码
gdb binFile

例如要调试sshd:

调试带参数的应用

有些应用需要携带参数使用,此时gdb要增加--args参数指定命令行参数属于应用,如下示例,--args后的参数均属于应用sshd

cpp 复制代码
gdb --args /usr/sbin/sshd -f /etc/ssh/sshd_config -ddd

调试正在运行的进程

cpp 复制代码
gdb --pid=PID

调试进程的子进程

退出调试

输入quit 或缩写 q 进行退出

查看源码

list 列出当前文件的源代码,默认列出前10行 (list 可以简写为 l)

选项

list [n], +:从指定行号n开始,列出该行后面的源代码

list [function_name]:列出指定函数的源代码

list [sline], [eline]:列出指定行号范围内的源代码,比如list 10 20 显示10-20行之间的代码

list -:列出上一个list命令列出的源代码的下一部分

list +:列出当前行后面的源代码

如果源码是在某些库中或其他不在调试范围内的位置,是查看不到的

全速运行

cpp 复制代码
run 缩写 r

设置断点在某行

cpp 复制代码
break linenum 缩写 b linenum

设置断点在某文件某行

cpp 复制代码
break filename:linenum 缩写 b filename:linenum

设置断点在某函数

cpp 复制代码
break functionName 缩写 b functionName

设置条件断点

所谓条件断点,就是当满足一定条件时,断点才会命中。只要代码执行到断点处,普通的断点就会被命中并暂停下来,而条件断点必须要满足设置的条件,才能够被命中并暂停。

cpp 复制代码
break functionName if a=1 缩写 b functionName if a=1

查看断点信息

cpp 复制代码
info break 缩写 info b

使能或禁用断点

cpp 复制代码
disable breakpoint_number
enable breakpoint_number

breakpoint_number为断点编号,可通过info b查看,可在enable和disable加once参数,表明禁用或使能一次

删除断点

cpp 复制代码
delete breakpoint_number

设置观察点

在为变量或者一个表达式设置观察点后,当该变量或者表达式的值发生变化时,程序会发生中断,并且在变量或者表达式发生改变的地方暂停。

cpp 复制代码
watch variable

继续运行

当程序运行到断点处后会停止,使用countinue继续执行直到下一次断点

cpp 复制代码
countinue 缩写 c

continue n  //跳过当前断点n次

单步运行

cpp 复制代码
next 缩写 n    //如果遇到函数,不会进入函数内部,会一次性执行
step 缩写 s    //会进入函数内部执行

调用堆栈

cpp 复制代码
backtrace 缩写 bt

返回堆栈

当进入到另一个函数体之后,如果想跳出这个函数体回到调用的地方,使用如下命令

cpp 复制代码
finish

查看变量值

cpp 复制代码
print 缩写 p

print var_name    // var_name是要查看的变量名称

print *array@len   // 显示数组array的前len个元素的值
print struct_name  // 显示结构体struct_name的成员变量值

print *pointer_name // 查看指针指向的值
print pointer_name  // 查看指针本身

修改变量值

cpp 复制代码
set variable_name = new_value 

跳转

cpp 复制代码
until line_number (line_number是要执行到的行号)

以上只列举了部分gdb常用命令,更详细的介绍可查阅gdb使用手册。

相关推荐
爱吃生蚝的于勒13 分钟前
【Linux】零基础深入学习动静态库+深入学习地址
linux·运维·服务器·c语言·数据结构·c++·学习
不甘平凡的小鸟14 分钟前
libcurl+vs2017+openssl编译
linux·运维·服务器
知识分享小能手28 分钟前
Ubuntu入门学习教程,从入门到精通, Ubuntu 22.04中的任务计划详解(16)
linux·学习·ubuntu
oMcLin33 分钟前
CentOS 7.9 使用 SELinux 时无法访问特定目录:如何配置 SELinux 策略允许访问
linux·运维·centos
QT 小鲜肉41 分钟前
【Linux命令大全】001.文件管理之whereis命令(实操篇)
linux·运维·服务器·网络·笔记
oMcLin44 分钟前
CentOS 7.9 上运行 Docker 容器内存溢出问题:如何优化容器资源限制与监控配置
linux·docker·centos
徐sir(徐慧阳)1 小时前
WebLogic 更换服务器后java segmentation fault错误解决记录
linux·服务器·中间件·jdk
名誉寒冰1 小时前
AI云存储学习笔记:小文件优化 / 大文件分片 / 分享与 AI 搜索
linux·人工智能·笔记·学习
kubernetes-k8s1 小时前
计划开始学习:OpenStack从入门到精通
linux·运维·服务器
天码-行空1 小时前
【大数据环境安装指南】ZooKeeper搭建spark高可用集群教程
大数据·linux·运维·zookeeper·spark