GDB 使用技巧总结

GDB 使用技巧总结

常用命令

set print pretty on # 格式化打印
n                   # 命令执行完成后显示的命令是即将执行的下一条命令
info b              # 显示断点
delete number       # 删除给定编号的断点
p                   # print打印变量 p *(pointer)
c                   # continue继续执行指令
finish              # 跳出当前函数
help printf         # 打印 printf 函数的使用说明
bt                  # 查看当前调用栈
list n              # 得到 n 前后 10 行的代码
until num           # 执行到一个比当前循环行号大的行号 num
source              # source 命令后,GDB 会读取并加载指定的源文件,使得该文件成为调试环境的一部分。
                    # 这意味着你可以在调试会话中使用 break、run、next 等命令来调试这个源文件。
shell               # 退回到命令行界面
save breakpoints breakpoints.txt # 保存断点到 brakpoints.txt
source breakpoints.txt           # 加载断电文件

# break [location] if condition 条件断点
1 int i;
2 int k = 0;
3 for(i = 0; i < 10; i++) {
4     k = i * i;
5 }
6 return 0;

break 4 if i == 5 # 此处的  为行号

x                   # 用于查看内存中的数据内容
x/<n/fmt> <address> # 其中,<n> 是要显示的连续内存单元数量,<fmt> 是数据的显示格式,<address> 是要查看的起始地址。
                    #以下是一些常用的 <fmt> 格式选项:
x:十六进制格式
d:十进制格式
u:无符号十进制格式
o:八进制格式
t:二进制格式
c:字符格式

(gdb) x/s 0x400a30    // 查看从内存地址 0x400a30 开始的字符串

GDB 的退出

在 GDB 中另一种的退出方式是按 [Ctr+D] 组合命令,在 Linux 中 [Ctr+D] 组合键通常表示文件结束EOF,而这将使GDB退出命令输入循环。需要注意的是,在 GDB 命令行中按 [Ctr+C] 组合键并不会使 GDB 退出,而只会中断正在执行的被调试程序。比如,被执行程序进入一个很耗时的循环,那么就可以用 [Ctr+C] 组合键将其中断。

GDB 调试多线程

info threads # 显示 GDB 为每个线程所编序号
thread ID    # 用来切换当前调试的线程为指定的 ID 号的线程,ID为 GDB 为线程所分配的ID
thread apply ID1 ID2 .... IDn command # 指定多个线程执行 command 指令,其中 command 为gdb中的指令。
thread apply all command # 指定所有线程执行command指令
set scheduler-locking off | on
# 线程锁
# off: 不锁定任何线程,当程序继续运行的时候如果有断点,那么就把所有的线程都暂停下来,直到你指定某个线程继续执行,如果在当前线程下使用 continue 的话那么会启动所有线程( GDB 默认)
# on: 打开线程锁,锁定其他线程,只有当前线程执行

GDB non-stop 模式

为了对上面的这种一个线程中断在一个断点上,其他所有的线程都会被 GDB v7.0 引入了non-stop 模式,在这个模式下:

  1. 当某个或多个线程在一个断点上,其他线程仍会并行运行
  2. 你可以选择某个被中断的线程,只让他运行。
  3. non-stop 模式表示不停止模式,除了断点有关的线程会被停下来,其他线程会继续执行。

设置 non-stop 模式,打开 GDB 后,在开始 r 之前,首先连续输入下面的指令。

set target-async 1
set pagination off
set non-stop on

GDB 输出结果到文件

break main
run
set logging file threads.txt
set logging on
thread apply all bt
set logging off
quit

posted on 2022-10-01 13:48  LambdaQ  阅读(172)  评论(0编辑  收藏  举报