【问题标题】:Gdb process record/replay execution loggdb进程记录/回放执行日志
【发布时间】:2011-04-01 15:05:59
【问题描述】:

有人能告诉我在gdb中使用进程记录/重放功能时,执行日志会存储在哪里吗?

谢谢 拉杰

更新

#include <stdio.h>

int main (int argc, char const *argv[])
{
    printf("Hello World\n");
    printf("How are you?\n");
    char *c = NULL;
    printf("%c\n", *c);
    return 0;
}      

当我取消引用 c 时,上面的代码段错误。我想用这个例子来弄清楚如何使用 reverse-next/reverse-continue 在段错误后返回。我能够执行 reverse-next 并到达第一个 printf 语句,在该语句处我在记录执行时放置了一个断点。在此之后,当我在 gdb 中尝试“下一个”命令时,我看到光标在 printf 语句中移动,但我没有看到终端上打印出任何输出。总之,我想知道即使在段错误之后,是否可以使用记录/重放功能来查看执行历史?

【问题讨论】:

标签: gdb record


【解决方案1】:

我以为你必须手动指定

record save filename

默认文件名是gdb_record.process_id,其中process_id是被调试进程的进程ID。这意味着,如果您不指定它,请查看调试器的 CWD

更新

关于您对 insn-number-max 的额外问题:

info record 

显示有关进程记录状态及其内存中的各种统计信息 执行日志缓冲区,包括:

  • 无论是录制模式还是回放模式。
  • 最低记录指令数(从当前执行日志开始记录指令开始计数)。
  • 记录的最高指令号。
  • 即将重播的当前指令(如果处于重播模式)。
  • 执行日志中包含的指令数。
  • 执行中可能包含的最大指令数 记录。

我不确定,但这可能表明整个内容毕竟保存在内存中。 当然,一个 64 位系统和大量的交换(和 ulimit 无限制)将使这成为一个“虚拟”限制

【讨论】:

  • 感谢您的回复。你能告诉我执行缓冲区存储在哪里(RAM 或磁盘),而仍在记录执行。我想知道这一点,因为我想将 insn-number-max 设置为零(将记录大小设置为无限制)。
  • 我不确定你的意思。你可以简单地做(gdb)set record insn-number-max 0,不是吗?如果您担心内存使用情况,我真的希望记录位于内存映射文件中,并且只有活跃使用的页面被锁定。我没有证据,但我相信你会发现:)
  • 感谢您的回复。最后一个问题。请参阅我更新的问题中的代码。总之,我想知道即使在段错误之后,是否可以使用记录/重播功能来查看执行历史?
  • 当然可以 (see here e.g.)
  • 是的。 gdb 恢复程序状态。程序状态不包括外围设备(如屏幕)。想象一下:如果您的程序刚刚发送了一封电子邮件,是否会反向继续使电子邮件未发送? (换句话说,仔细阅读手册并调整您的期望!)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-24
  • 2018-06-21
  • 2016-10-16
  • 2020-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多