2011-04-01 21 views
2

有人可以告诉我在gdb中使用进程记录/重放功能时,执行日志将存储在何处?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; 
}  

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

+0

http://stackoverflow.com/questions/35288759/very-simple-example-log-文件录制程序执行 – user5821164 2016-02-09 11:17:35

回答

4

我想你不得不手动指定与

record save filename 

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

更新

关于你的额外问题上的insn数-MAX:

info record 

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

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

我不确定,但这可能表明,整体保留在记忆中。 当然,64位系统和大量的交换(和的ulimit无限制)将使这个“虚拟”限制

+0

感谢您的回复。你能告诉我执行缓冲区存储在哪里(RAM或磁盘),而执行仍在记录中。我想知道这一点,因为我想将insn-number-max设置为零(将记录大小设置为无限制)。 – Raj 2011-04-02 17:10:16

+0

我不确定你的意思。你可以简单地执行(gdb)'set record insn-number-max 0',不是吗?如果您担心内存使用情况,我真的真的希望记录在内存映射文件中,并且只锁定主动使用的页面。我没有证据,但我相信你会发现:) – sehe 2011-04-02 19:25:12

+0

感谢您的回复。最后一个问题。请参阅我更新的问题中的代码。总之,我想知道即使在段错误之后,记录/重放功能是否可以用于执行历史记录? – Raj 2011-04-03 02:18:19