GDB常用命令和一些实用方法
文章目录
本文介绍gdb一些常用命令。
1 GDB的一些实用的文档
2 gdbinit文件的简单配置方法
-
在当前用户目录下创建文件:
touch ~/.gdbinit -
在
~/.gdbinit文件中添加常用的gdb命令即可。常用的配置如下:1 2 3 4directory /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> |
设置条件断点 |
示例:
|
|
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 通用方法
|
|
3.11.2 使用gdb脚本进行打印
使用方法见文章:GDB打印STL中各种容器的内容的方法