2012-05-22 89 views
3

我想問問,如果有人有任何想法如何檢測寫入分配內存地址。內存塊C寫入/讀取檢測

起初我使用mprotect和sigaction一起進行寫/讀操作時強制出現分段錯誤。

用在幾個這種方法

兩個負面因素:

  • 是很難通過分段故障
  • 在mprotect的內存地址傳遞必須對齊到一個頁面邊界,即它無法處理這個內存地址用一個簡單的malloc。

爲了闡明問題:

我構建的應用程序中下集羣環境。在某些時候,我分配內存,我在本地主機調用緩衝區並分配一些數據。該緩衝區將被髮送到遠程節點並具有相同的過程。在同一點上,這個緩衝區將在遠程節點中被寫入/讀取,但是我不知道什麼時候(它將被用於DMA寫入/讀取緩衝區),必須通知本地主機關於緩衝區修改。就像我上面說過的,我已經使用了一些機制,但其中沒有一個能夠以其能力處理它。現在我只想要一些想法。

每個不同的想法在這裏受到歡迎。

謝謝

回答

1

您可以使用硬件斷點。缺點是這是硬件特定的,只能設置有限數量的斷點。此外,大多數情況下這些設施並非特定於任務,所以如果您運行該程序的多個實例,他們將共享可用'插槽'的數量。

x86架構具有可用於設置硬件內存斷點的調試寄存器(請參閱:http://en.wikipedia.org/wiki/X86_debug_register)。

如果你想測試這個,你可以使用GDB設置硬件斷點。您可以使用GDB的'watch'命令將硬件內存斷點放在變量上。

請注意,使用調試寄存器和mprotect()只是完成您所要求的工作的方法,我不認爲它們是進行內存管理(您可能試圖在此執行的操作)的良好工程實踐。也許你可以解釋一下更多關於你想要在更高層次上做什麼:http://catb.org/esr/faqs/smart-questions.html#goal

+0

感謝您的建議。也許我沒有表達得很好,但這裏的想法並不是調查什麼可能是錯誤的特定內存塊,但是是捕獲一個內存地址的時候執行讀/寫操作在這個內存地址和處理它像一個事件。這個所有操作中最重要的事情必須是執行時間。 – Majao

+0

@Majao:我想我確實瞭解你。應該可以從應用程序本身設置調試寄存器,正如我寫的那樣,有一些缺點。我認爲針對您的問題(檢測特定內存訪問)的唯一解決方案是硬件設施,並且超出頁面級訪問限制,X86調試寄存器是您唯一的選擇。 – Bart