基本介绍
gdb是Linux下常用的命令行调试器,在Debian下使用如下命令安装:
1 | sudo apt install gdb -y |
可以使用如下三种方式运行gdb程序,对目标二进制文件进行调试:
gdb <file_name>:运行目标文件,从头开始调试。gdb <file_name> <core_name>:根据core文件对目标文件进行调试。gdb <file_name> <pid>:远程调试,调试目标文件的对应正在运行的进程。
在进入调试界面后,可以使用一些调试命令以更好地对程序进行调试,其主要分为以下几类:
流程控制:按照使用者想法运行程序。
断点管理:管理断点,使得程序在运行时满足某种条件时能够暂停。
信息输出:输出使用者希望输出的信息。
环境设置:动态改变程序内部或外部的执行环境。
流程控制
| 指令 | 缩写 | 作用 |
|---|---|---|
| run [<arg>] | r | 运行未运行的程序 |
| cotinue [<ignore_num>] | c | 在程序被中断后继续运行 |
| step [<inst_num>] | s | 执行inst_num条指令,遇到函数时进入函数(如果该函数有调试信息) |
| next [<inst_num>] | n | 执行inst_num条指令,遇到函数视为一条指令,不会进入函数内部 |
| finish | fin | 执行直到当前函数返回,并打印返回值 |
| until [<target>] | u | 执行完当前循环,若目标位置被指定则执行到目标位置,除非函数返回 |
断点管理
断点
断点用于观察控制流的运行位置,当控制流运行到断点时停止程序。
| 指令 | 缩写 | 作用 |
|---|---|---|
| break [<pos> [if <cond>]] | b | 设置断点在pos,如设置了cond,则当条件未达成时不触发断点 |
其中pos的设置如下:
<file_name>:<line_num>:在进入指定文件对应行号的指令前设置断点。<file_name>:<func_name>:在进入指定文件对应函数的指令前设置断点。*<inst_addr>:在进入指定地址对应的指令前设置断点。
观察点
观察点用于观察目标表达式的值是否发生变化。目标表达式的值发生变化时停止程序。
| 指令 | 缩写 | 作用 |
|---|---|---|
| watch [<expr> [if <cond>]] | w | 若目标表达式的值发生变化,则停止程序 |
| rwatch [<expr> [if <cond>]] | rw | 若目标表达式被读,则停止程序 |
| awatch [<expr> [if <cond>]] | aw | 若目标表达式被读或写,则停止程序 |
捕捉点
捕获点用于捕获当前程序发生的行为,当指定行为发生时停止程序。
| 指令 | 缩写 | 作用 |
|---|---|---|
| catch <event> | cat | 发生event对应事件时停止程序 |
| tcatch <event> | tc | 发生event对应事件时停止程序,只会触发一次 |
其中event如下:
| event | 事件 |
|---|---|
| throw | C++抛出异常时 |
| catch | C++捕获异常时 |
| exec | 调用exec时,只在HP-UX下有用(修改进程运行程序) |
| fork | 调用fork时,只在HP-UX下有用(创建进程) |
| vfork | 调用vfork时,只在HP-UX下有用(创建进程) |
| load | 调用load时,只在HP-UX下有用(加载动态库) |
| unload | 调用unload时,只在HP-UX下有用(卸载动态库) |
停止点控制
| 指令 | 缩写 | 作用 |
|---|---|---|
| clear [<pos_range>] | cl | 删除指定位置范围的停止点 |
| delete [<id_list>] | del | 根据停止点ID删除对应停止点 |
| disable [<id_list>] | dis | 根据停止点ID停用对应停止点 |
| enable [<id_list>] | en | 根据停止点ID启用对应停止点 |
| condition <id> <cond> | cond | 给对应停止点添加触发条件 |
| ignore <id> <ign_num> | ig | 忽略对应停止点指定次数 |
信息输出
| 指令 | 缩写 | 作用 |
|---|---|---|
| print <expr> | p | 打印指定变量或表达式的值 |
| display <expr> | disp | 追踪目标表达式的值,每次停止时打印追踪的表达式值 |
| info <sign> | i | 打印gdb内部信息 |
| x <addr> | 打印内存信息 |
环境设置
| 指令 | 缩写 | 作用 |
|---|---|---|
| set <context> | 设置环境变量或gdb状态等 |