gdb安装
gdb的layout功能依赖于curses,安装curses包
https://ftp.gnu.org/pub/gnu/ncurses/
下载gdb包,安装
http://ftp.gnu.org/gnu/gdb/gdb-10.1.tar.gz
1. G++调试相关编译选项
G++在编译时需要将调试信息加到可执行文件中,编译时添加选项-g,将调试信息加载到可执行文件中。如果没有添加-g选项,将看不到程序的函数名和变量名,全是运行时的内存地址,不利于调试。
gdb命令使用
(1) 启动gdb
调试可执行程序 gdb 可执行程序名
调试服务程序 gdb 程序名 进程id
调试core文件 gdb 程序名 core文件名
(2) 交互命令
run 运行程序,遇到断点后停止,等待用户输入下一步的命令。
continue 继续执行,到下一个断点停止。
step 单步调试,如果遇到函数则进入函数。
next 执行下一条指令
until + 行号 运行到指定行
finish 运行程序,直到当前函数返回
call 函数名(参数)
quit 退出gdb
(3) 设置断点
break n 在第n行设置断点
break func 在函数func入口处设置断点
info break 显示当前程序的断点设置情况
disable 断点号 禁用断点
enable 断点号 启用断点
delete 断点号 删除断点
(4) 查看源代码
list 列出程序的源代码,默认每次显示10行
list 行号 显示当前文件以行号为中心的前后10行代码
list 函数名 显示函数源码
disas 反汇编当前函数
(5) 输出变量和表达式
print 表达式 表达式可以是当前正在测试程序的有效表达式。
print 变量 打印变量的值
print ++a(a是整数类型) 将a加1,并打印出来
print func(a) 以变量a为参数调用func函数
print $rax 十进制形式打印%rax
print /x $rax 十六进制形式打印%rax
print /t $rax 二进制形式打印%rax
print /x ($rsp + 8) 十六进制形式打印(%rsp + 8)
print *(long *)0x7fffffffffffe818 打印内存中0x7fffffffffffe818的长整数
print *(long *)($rsp + 8) 打印内存中($rsp + 8)的长整数
display 变量 单步运行后紧接着输出该变量的值
undisplay 变量号 取消显示变量
info locals 显示当前堆栈中所有的局部变量
info registers 显示寄存器的值
(6) 查询运行信息
where 当前的运行函数堆栈列表
set args 数值 指定运行时参数
show args 查看设置的参数
例:
#include <stdio.h>
int main(int argc, char* argv[]){
int i;
for (int i = 0; i < argc; i++){
printf("The %ith argument is %s ", i, argv[i]);
}
return 0;
}
(gdb) set args hello world (或者直接运行 ./argsTest hello world)
(gdb) run
Starting program: /home/wangjian/workspace/cpp/test/argsTest hello world
The 0th argument is /home/wangjian/workspace/cpp/test/argsTest
The 1th argument is hello
The 2th argument is world
[Inferior 1 (process 10036) exited normally]
(7) 分割窗口
layout:用于分割窗口,可以一边查看代码,一边测试。主要有以下几种用法:
layout src:显示源代码窗口
layout asm:显示汇编窗口
layout regs:显示源代码/汇编和寄存器窗口
layout split:显示源代码和汇编窗口
layout next:显示下一个layout
layout prev:显示上一个layout
Ctrl + L:刷新窗口
Ctrl + x,再按1:单窗口模式,显示一个窗口
Ctrl + x,再按2:双窗口模式,显示两个窗口
Ctrl + x,再按a:回到传统模式,即退出layout,回到执行layout之前的调试窗口。