2012-09-05 14 views
1

我需要C程序在其執行過程中修改的所有內存位置的日誌。由於我沒有開始結束地址的內存區域,使用gdb/valgrind觀看內存區域的問題有點多。基本上,無論何時何地程序進行內存更新(以的推送形式移至內存操作數等),我需要該內存地址以及寫入該地址的值。獲取由C程序修改的所有內存位置的日誌

有沒有人有任何建議或意見?

謝謝!

+0

您是否曾嘗試在每次分配虛擬內存時添加斷點,然後觀察這些地址? – DanZimm

+0

您是否嘗試過將電線焊接到您的RAM芯片並將它們連接到邏輯分析儀? – TJD

+0

@DanZimm號我之所以沒這麼做是因爲我相信使用斷點會很慢,特別是如果我們有很多內存更新的話。其次,我不知道是否可以通過這種方式捕獲像_push_這樣的指令更新的內存。 – shigoel

回答

3

您可以使用由英特爾創建的工具Pin監控內存存儲,讀取,寄存器內容等。這是一個project from MIT that simulates a processor cache(指令和/或數據)。 Pin用於創建詳細的指令跟蹤,然後將跟蹤用作緩存模擬器的輸入。

+0

謝謝!與Pin庫捆綁在一起的示例(pinatrace in/source/tools/ManualExamples)是我想要的很好的一部分。我可以輕鬆編輯它以適應我的需求。此外,使用Pintools的儀器似乎不太慢,這總是一個加號。 – shigoel

+0

不客氣,我很高興你覺得它有用。 – amdn

1

如果你可以在模擬器下運行你的程序,你可以用模擬器來記錄你想要的數據。你可以找到幾個X86 emulators listed on Wikipedia,包括Bochs和QEMU。

我可以想象使用mprotect()SIGSEGV處理程序的一半解決方案:受保護的內存將在您訪問它時生成信號。如果處理程序記錄地址並重新啓用訪問,則錯誤指令將恢復(併成功)。不過,我不明白你是如何再次獲得細分受保護的。

你可以編寫你自己的調試器(看看ptrace()手冊頁,它並不那麼複雜),它只存在於你的程序中的PT_STEP。您可能必須解析暫停的指令,以確定它是否是內存訪問,然後自己計算有效地址(通過PT_ GETREGS獲取任何必要的寄存器)。

+0

感謝您使用_ptrace_編寫我自己的調試器的建議。最終,我認爲這是我想要做的。 – shigoel