gdb安装和使用

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之前的调试窗口。

原文地址:https://www.cnblogs.com/feng-ying/p/14624064.html