我需要C程序在其執行過程中修改的所有內存位置的日誌。由於我沒有開始或結束地址的內存區域,使用gdb/valgrind觀看內存區域的問題有點多。基本上,無論何時何地程序進行內存更新(以的推送形式,將移至內存操作數等),我需要該內存地址以及寫入該地址的值。獲取由C程序修改的所有內存位置的日誌
有沒有人有任何建議或意見?
謝謝!
我需要C程序在其執行過程中修改的所有內存位置的日誌。由於我沒有開始或結束地址的內存區域,使用gdb/valgrind觀看內存區域的問題有點多。基本上,無論何時何地程序進行內存更新(以的推送形式,將移至內存操作數等),我需要該內存地址以及寫入該地址的值。獲取由C程序修改的所有內存位置的日誌
有沒有人有任何建議或意見?
謝謝!
您可以使用由英特爾創建的工具Pin監控內存存儲,讀取,寄存器內容等。這是一個project from MIT that simulates a processor cache(指令和/或數據)。 Pin用於創建詳細的指令跟蹤,然後將跟蹤用作緩存模擬器的輸入。
如果你可以在模擬器下運行你的程序,你可以用模擬器來記錄你想要的數據。你可以找到幾個X86 emulators listed on Wikipedia,包括Bochs和QEMU。
我可以想象使用mprotect()
和SIGSEGV
處理程序的一半解決方案:受保護的內存將在您訪問它時生成信號。如果處理程序記錄地址並重新啓用訪問,則錯誤指令將恢復(併成功)。不過,我不明白你是如何再次獲得細分受保護的。
你可以編寫你自己的調試器(看看ptrace()
手冊頁,它並不那麼複雜),它只存在於你的程序中的PT_STEP
。您可能必須解析暫停的指令,以確定它是否是內存訪問,然後自己計算有效地址(通過PT_ GETREGS
獲取任何必要的寄存器)。
感謝您使用_ptrace_編寫我自己的調試器的建議。最終,我認爲這是我想要做的。 – shigoel
您是否曾嘗試在每次分配虛擬內存時添加斷點,然後觀察這些地址? – DanZimm
您是否嘗試過將電線焊接到您的RAM芯片並將它們連接到邏輯分析儀? – TJD
@DanZimm號我之所以沒這麼做是因爲我相信使用斷點會很慢,特別是如果我們有很多內存更新的話。其次,我不知道是否可以通過這種方式捕獲像_push_這樣的指令更新的內存。 – shigoel