2011-04-01 156 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