自动化 GDB 调试会话的最佳方法是什么?

2023-11-27

GDB 是否有内置的脚本机制,我应该编写一个 Expect 脚本,还是有更好的解决方案?

我每次都会发送相同的命令序列,并将每个命令的输出保存到一个文件中(很可能使用 GDB 的内置日志记录机制,除非有人有更好的主意)。


基本上,在这个例子中,我想在代码的特定位置获取一些变量值;并让它们输出直到程序崩溃。所以这里首先是一个小程序保证会崩溃只需几步,test.c:

#include <stdio.h>
#include <stdlib.h>

int icount = 1; // default value

main(int argc, char *argv[])
{
  int i;

  if (argc == 2) {
    icount = atoi(argv[1]);
  }

  i = icount;
  while (i > -1) {
    int b = 5 / i;
    printf(" 5 / %d = %d \n", i, b );
    i = i - 1;
  }

  printf("Finished\n");
  return 0;
}

程序接受命令行参数的唯一原因是能够在崩溃之前选择步骤数 - 并表明gdb忽略--args在批处理模式下。我用这个编译:

gcc -g test.c -o test.exe

然后,我准备以下脚本 - 这里的主要技巧是分配一个command每一个breakpoint,最终将continue(也可以看看自动化 gdb:在每次调用函数 put 时显示回溯)。这个脚本我称之为test.gdb:

# http://sourceware.org/gdb/wiki/FAQ: to disable the
# "---Type <return> to continue, or q <return> to quit---"
# in batch mode:
set width 0
set height 0
set verbose off

# at entry point - cmd1
b main
commands 1
  print argc
  continue
end

# printf line - cmd2
b test.c:17
commands 2
  p i
  p b
  continue
end

# int b = line - cmd3
b test.c:16
commands 3
  p i
  p b
  continue
end

# show arguments for program
show args
printf "Note, however: in batch mode, arguments will be ignored!\n"

# note: even if arguments are shown;
# must specify cmdline arg for "run"
# when running in batch mode! (then they are ignored)
# below, we specify command line argument "2":
run 2     # run

#start # alternative to run: runs to main, and stops
#continue

请注意,如果您打算在批处理模式下使用它,则必须在最后“启动”脚本run or start或类似的东西。

有了这个脚本,我就可以调用gdb在批处理模式下 - 这将在终端中生成以下输出:

$ gdb --batch --command=test.gdb --args ./test.exe 5
Breakpoint 1 at 0x804844d: file test.c, line 10.
Breakpoint 2 at 0x8048485: file test.c, line 17.
Breakpoint 3 at 0x8048473: file test.c, line 16.
Argument list to give program being debugged when it is started is "5".
Note, however: in batch mode, arguments will be ignored!

Breakpoint 1, main (argc=2, argv=0xbffff424) at test.c:10
10    if (argc == 2) {
$1 = 2

Breakpoint 3, main (argc=2, argv=0xbffff424) at test.c:16
16      int b = 5 / i;
$2 = 2
$3 = 134513899

Breakpoint 2, main (argc=2, argv=0xbffff424) at test.c:17
17      printf(" 5 / %d = %d \n", i, b );
$4 = 2
$5 = 2
 5 / 2 = 2 

Breakpoint 3, main (argc=2, argv=0xbffff424) at test.c:16
16      int b = 5 / i;
$6 = 1
$7 = 2

Breakpoint 2, main (argc=2, argv=0xbffff424) at test.c:17
17      printf(" 5 / %d = %d \n", i, b );
$8 = 1
$9 = 5
 5 / 1 = 5 

Breakpoint 3, main (argc=2, argv=0xbffff424) at test.c:16
16      int b = 5 / i;
$10 = 0
$11 = 5

Program received signal SIGFPE, Arithmetic exception.
0x0804847d in main (argc=2, argv=0xbffff424) at test.c:16
16      int b = 5 / i;

请注意,当我们指定命令行参数 5 时,循环仍然只旋转两次(正如run in the gdb脚本);如果run没有任何参数,它只旋转一次(程序的默认值),确认--args ./test.exe 5被忽略。

但是,由于现在这是在单个调用中输出,并且无需任何用户交互,因此可以使用以下命令轻松地将命令行输出捕获在文本文件中bash重定向,说:

gdb --batch --command=test.gdb --args ./test.exe 5 > out.txt

还有一个使用 python 自动化 gdb 的示例c - GDB 自动步进 - 自动打印行,同时自由运行?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自动化 GDB 调试会话的最佳方法是什么? 的相关文章

随机推荐

  • 从父级导航嵌入的 Google Apps 脚本 iFrame

    我有一个多页网络应用程序 我希望登录后 用户可以看到他的队友列表并标记他们的出勤状态 我的问题是我无法在 iFrame 中显示这一点 而不是在 google 脚本原始框架中显示这一点 例如 我想将其 iFrame 到我自己的网页上 这两天我
  • 使用 ASP.NET MVC 2 上传文件的最佳方式是什么?

    上传可变大小的文件 对于 ASP NET MVC 2 应用程序文件系统来说非常大或非常小 的最佳方法是什么 到目前为止我的理解是这样的 人们似乎有两种处理这个问题的方法 假设文件可能非常大或非常小 1 在控制器操作中处理上传Request
  • jQuery:同一事件有多个处理程序

    如果我将两个事件处理程序绑定到同一元素的同一事件 会发生什么情况 例如 var elem elem click elem click 最后一个处理程序 获胜 还是两个处理程序都会运行 两个处理程序都将运行 jQuery 事件模型允许在一个元
  • Angular 4:日期管道,UTC 时间到本地时间:如何告诉 Angular 当前时区?

    我们将 Angular 4 与用 net core 编写的 MVC 应用程序一起使用 使用 SignalR 服务接收数据 集线器是用 C 编写的 数据库提供 Datetime2 7 字段 T SQL 收到的内容如下所示 对于日期字段 due
  • SQL FileStream + Entity Framework 存储大文件

    当我想将文件存储在文件流列中时 我总是需要将整个二进制文件读入内存 using MemoryStream memoryStream new MemoryStream sourceStream CopyTo memoryStream bina
  • 在 PHP 中解析 javascript 数组

    我似乎不知道如何将 JS 数组放入 PHP 中 我必须处理的事情看起来像这样 var arrLow e 495864 rank 8678591 rankmove p img src up php uStyle 144 UP 495864 e
  • “Create VIEW”必须是批处理中的唯一语句

    我有以下 SQL ALTER PROCEDURE dbo usp gettasks ID varchar 50 AS declare PDate Date WHILE DATEPART DW PDate 1 OR DATEPART DW P
  • 有没有办法从 C# 调用 RDTSC 汇编指令?

    我想要为我的 C 应用程序提供一个非常高分辨率的计时器 我想访问 RDTSC 汇编指令 有没有办法做到这一点 编辑 我正在移植一些 C 代码并尝试保留与原始代码相同的功能 我可能会切换到更 NET 的东西 但想要评估 RDTSC 指令 以便
  • 下一个js图像组件错误“url”参数有效但上游响应无效

    我正在从 tmdb api 获取数据 但是图像未加载 所以我在新选项卡中打开图像 然后它显示 url 参数有效 但上游响应无效那么如何解决这个问题 您是否已将图像的域添加到下一个配置中 下面是一个例子 next config js modu
  • 使用 AngularJS 和 Asp.Net MVC 通过 FormData 上传多个文件

    我想使用 Angular js 上传多个文件 为此我使用 FormData 这是我的表单字段
  • 是否可以更改虚拟内存页面大小?

    是否可以更改虚拟内存页面大小 我问这个是因为在维基百科上 MMU 文章的 X86 64 部分 它讨论了不同的页面大小 如果页面大小确实可以改变 那么如何改变呢 在 x86 64 上 您可以在以下命令的帮助下显式请求 2 MiB 页面 而不是
  • 如何在 App Engine Nodejs Standard 上访问内存缓存

    如何从node js标准环境访问memcached 该文档显然没有提到 App Engine 内存缓存可用于 Node JS 标准环境 至少目前没有 没有Node JS语言选项卡中内存缓存概述 page s 没有Caching Applic
  • NumPy 读取文件并动态过滤行

    我在 CSV 文件中写入了大量数字 只需加载该数组的一部分 从概念上讲我想打电话np genfromtxt 然后对结果数组进行行切片 但是 该文件太大 RAM 可能无法容纳 相关行的数量可能很小 因此不需要解析每一行 MATLAB有函数te
  • EXTENDS 挑战:预处理器函数宏和类类 oop

    背景 我一直在使用 C 预处理器来管理和 编译 具有多个文件和构建目标的半大型 JavaScript 项目 这提供了对 C 预处理器指令的完全访问 例如 include define ifdef等来自 javascript 的内容 这是一个
  • 使用 Xcode 8 创建通用框架?

    我公司的 iOS 框架旨在在真正的 iOS 设备上运行 所述框架当前作为 Xcode 项目中的附加目标生成 该项目也生成应用程序 这使得调试框架相对容易 我们最近收到了要求让它在模拟器中也能运行的请求 我现在可以让它这样做 下一步是创建一个
  • 使用 Python MoviePY 连接视频太慢

    我正在使用 MoviePY 加入 50 多个或更多 1 2 3 分钟的视频 但它只给了我 20 个小时 尽管我有 64 GB 内存 i7 和 GTX 670 虽然不是顶级但还算合理 无论如何我可以加快这个过程吗 padding 10 pad
  • 解释 dumpsys cpuinfo

    我正在寻找 android shell 中命令 dumpsys cpuinfo 结果的解释 dumpsys cpuinfo Load 17 78 16 97 16 29 CPU usage from 35983ms to 21604ms a
  • 跨多个页面保留提供程序数据不起作用

    我在用着Provider在我的 flutter 应用程序中 当我进入新页面时 提供给Provider第 1 页的内容无法在第 2 页中访问 我所理解的方式Provider有效的一点是 有一个中心位置可以存储所有数据 并且可以在应用程序中的任
  • 低选择性色谱柱的索引和替代方案

    可用于在低选择性列上选择记录的策略范围有哪些 一个示例可能是订单表 多年来 您在其中建立了大量已完成的订单 但通常需要选择活动订单 订单可能会经历一个生命周期 例如下单 库存分配 从仓库挑选 发送给客户 开具发票和付款 订单还可能被取消 保
  • 自动化 GDB 调试会话的最佳方法是什么?

    GDB 是否有内置的脚本机制 我应该编写一个 Expect 脚本 还是有更好的解决方案 我每次都会发送相同的命令序列 并将每个命令的输出保存到一个文件中 很可能使用 GDB 的内置日志记录机制 除非有人有更好的主意 基本上 在这个例子中 我