本文介绍gdb一些常用命令。

1 GDB的一些实用的文档

2 gdbinit文件的简单配置方法

  1. 在当前用户目录下创建文件:touch ~/.gdbinit

  2. ~/.gdbinit文件中添加常用的gdb命令即可。常用的配置如下:

    1
    2
    3
    4
    
    directory /usr/src/glibc/glibc-2.27/ # 指定源码所在目录
    layout src                           # 显示源码模式
    set pagination off                   # 输出信息较多时不会暂停输出
    set confirm off                      # gdb退出时不显示提示信息
    

3 GDB常用命令

3.1 界面配置

命令 功能
layout src 显示源代码
layout asm 显示汇编代码
layout regs 显示寄存器内容
layout split 显示源代码和汇编窗口
layout next 显示下一个layout
layout prev 显示上一个layout
tui enable 显示layout窗口
tui disable 退出layout窗口
Ctrl + x -> o 在多个窗口间切换

3.2 单步执行

命令 功能
next/n 单步执行,不进入函数内部
step/s 单步执行,是函数则进入函数内部
until line-number 执行到指定行号
where 显示当前行号和当前所在的函数

3.3 断点调试

命令 功能
break/b <where> 在函数入口设置断点
enable <breakpoint> 打开断点
disable <breakpoint> 关闭断点
delete <breakpoint> 删除断点
clear 删除所有断点
info breakpoints [n] 查看断点
break <where> if <condition> 设置条件断点

示例:

1
2
# 条件断点:第10行中,若变量i等于101则停止。
b 10 if i==101

3.4 观察点

命令 功能
watch <where>/variable 设置观察点
enable <breakpoint> 打开断点
disable <breakpoint> 关闭断点
delete <breakpoint> 删除断点
info watchpoints [n] 查看观察点
watch <where> if <condition> 设置条件观察点
rwatch/rw variable 设置读观察点
awatch/aw variable 设置读写观察点
watch expr thread threadnum 设置指定线程上的观察点

3.5 断点/观察点位置

命令 功能
function_name 函数名
line_num 行号
filenaem:line_num 文件+行号
addr 地址

3.6 打印信息

命令 功能
print <what> 打印指定内容
print /x $rbp-0x8 将计算结果按照16进制输出
print /x ($ebp+8) 将ebp+8内存中的内容按照16进制输出
info proc mappings 打印内存映射信息
x/nfu 0xaddr Examine the contents of memory and specify formatting.
n: number of display items to print
f: specify the format for the output
u: specify the size of the data unit (eg. byte, word, …)
Example: x/4dw var
  • n:输出单元的个数。

  • f:是输出格式。比如 x 是以16进制形式输出, o 是以8进制形式输出,等等。

  • u:标明一个单元的长度。

    • b 是一个Byte(8 bit)

    • h 是两个Byte (halfword)

    • w 是四个Byte (word)

    • g 是八个Byte (giant word)。

3.7 查看栈帧

命令 功能
backtrace/bt 打印栈帧
frame/f <frame#> 显示指定栈帧
info frame 显示当前栈帧的信息
info locals 显示当前帧的局部变量信息

3.8 调试线程

命令 功能
set scheduler-locking on 只允许一个线程运行
set follow-fork-mode child 调试子进程
set detach-on-fork off 调试父子进程
show scheduler-locking 查看当前的调试模式
info threads 查看进程中的线程信息
thread <thread#> 切换调试线程

温馨提示
使用线程的调试模式,需要先使用start/run将程序运行起来后才可以设置。否则会提示Target 'exec' cannot support this command错误。

3.9 修改程序中的值

命令 功能
set var <variable_name>=<value> 修改变量的值
return <expression> 强制将当前函数按照指定值返回

3.10 汇编运行

命令 功能
info line number 显示指定位置的汇编代码
stepi/si 单步运行汇编指令
nexti/ni 单步运行汇编指令
disassemble 0xstart 0xend 反汇编指定地址的代码
info registers 显示当前寄存器的值
info registers rip 仅显示pc的值
info registers rbp rsp 仅显示rbp, rsp的值

3.11 GDB打印C++ STL中常见结构的内容的方法

3.11.1 通用方法

1
2
3
//vector<int> vec = {1, 2, 3, 4, 5};
 print *(vec._M_impl._M_start)@vec.size()
 print *(vec._M_impl._M_start)@n   	       //print first n element

3.11.2 使用gdb脚本进行打印

使用方法见文章:GDB打印STL中各种容器的内容的方法