GDB全称GDB Debugger。GDB具备各种调试功能,使用GDB的调试人员可以查看及修改程序的内部变量值。
本文转自内网同学整理。
1. 绑定进程
1 | gdb <bin> # GDB运行一个二进制,用于调试使用 |
2. 查看代码
2.1 查看程序代码
1 | dir <source_directory> # 添加cpp原文件目录 |
2.2 查看汇编指令
1 | disass # 显示当前汇编指令 |
3. 断点
3.1 断点设置
1 | b <file:line> # 设置文件中某行断点 |
3.2 断点查看
1 | info b # 查询所有断点 |
3.3 断点删除/启用/禁用
1 | d <break-id> # 删除某断点 |
3.4 断点设置自动执行命令
1 | command <break-id> |
4. 打印变量
4.1 打印普通变量
1 | p <expr> # 打印变量<var> |
display
display和print区别在于,display会一直打印某个值
1 | display <expr> # 打印某个变量或表达式,expr 表示要查看的目标变量或表达式 |
/fmt | 功 能 |
---|---|
/x | 以十六进制的形式打印出整数。 |
/d | 以有符号、十进制的形式打印出整数。 |
/u | 以无符号、十进制的形式打印出整数。 |
/o | 以八进制的形式打印出整数。 |
/t | 以二进制的形式打印出整数。 |
/f | 以浮点数的形式打印变量或表达式的值。 |
/c | 以字符形式打印变量或表达式的值。 |
4.2 打印protobuf message
1 | p <var>.DebugString() # 使用DebugString()将proto对象内部结构打印出来 |
4.3 打印内存地址
1 | n:为正整数,表示需要打印的内存单元个数 |
4.4 dump内存内容至文件
1 | 将start_addr至end_addr的内存内容以二进制形式dump到file文件,file文件名自定义即可 |
4.5 打印长字符串
gdb会限制打印字符串的最大长度。使用下列命令可修改限制。
1 | show print elements # 显示字符串最大打印长度 |
4.6 打印CPU寄存器的值
1 | i r # 打印所有寄存器的值 |
5. 线程调试
1 | 可事先dump某个进程下所有线程的thread id和backtrace,方便gdb调试 |
6. 运行控制
1 | r arg1 arg2 ... # 重新开始运行二进制,如果需要传入参数内需要arg1 arg2... |
7. 结束调试
1 | gdb二进制时,使用q/quit退出 |
8. 调试core
一般情况下,当设置了ulimit -c unlimited
之后,当程序遇到异常时,会自动转储core文件(即crash时会dump core文件),方便开发者查看分析现场。
但是,如果想对一个正常运行的进程进行转储, 可使用gcore
命令:
1 | gcore <pid> # 将进程<pid>转储到core文件中 |
调试core文件
1 | 调试core文件,两个gdb命令都可 |
9. 代码窗口
gdb命令行中输入CTRL + X或者CTRL + A,即可调出代码窗口,再按一次退出代码窗口。
注意: 在tui模式下,无法使用方向键获取上一条或下一条命令,可使用ctrl+p和ctrl+n替代
P.S. Mac下没有调出来
10. 开启日志
gdb默认不开启日志。可使用如下命令开启
1 | set logging on # 设置gdb日志开启,gdb会在当前目录下生成gdb.txt记录gdb命令行所有输出结果,方便回溯历史。 |