看板 C_and_CPP 關於我們 聯絡資訊
開發平台:VC++ 2010 問題是這樣的,在下目前在研究一個open source 研究的目的是要在這份code中塞入一個演算法 這個演算法可以降低儲存臨時資料的記憶體使用量 舉個簡單的例子: [版本一] 未使用演算法 int temp_data[256]; //某個用來暫存資料的陣列 // computing.. // 把計算出來的值一個一個放入temp_data中存起來 [版本二] 使用演算法 char* compressed_temp_data; // computing // 把把計算出來的值,壓縮成binary後放進compressed_temp_data 所以說,在下的任務就是要找出所有在open source code內 有對temp_data[]做存取的code 把它從版本一改成版本二這樣 現在的問題是,這個temp_data[]是某一個class的private成員 在整份code中,要存取這個temp_data的話 會先透過這個class內部的一個 get_pointer_at(address)之類的函式 取得temp_data[address]的記憶體位置後,再開始處理 所以我要對temp_data[]進行壓縮演算法時 根本不知道被取出去的temp_data[]中,是那些element被讀取或被寫入 (也就是說我無法明確知道外部的code,是寫入temp_data[0]? 或是讀取temp_data[15]..etc) 我必須確切的知道外部的程式是access哪一個明確的位置 也必須明確的知道外部的程式是對這塊記憶體Read還是Write 目前唯一想到的方法只有暴力法... 就是去搜尋整份code中有出現get_pointer_at(address)的地方 然後一行一行的看他是動到那些位置,看他是讀還是寫。接著一行一行的改 但是整份open source大的很誇張,要人工暴力trace實在是太花時間 所以我想請問有沒有辦法可以偵測某一塊記憶體 被access的次數,以及這個access是read或write嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.37.135.88 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1441435767.A.66B.html
stupid0319: HOOK含式啊,把含式位置指向你的,再轉回去 09/05 14:53
LiloHuang: 要偵測記憶體被讀寫可以朝實作 memory debugger 的方向 09/05 16:01
LiloHuang: https://goo.gl/Wwjtc7 可參考類似這篇文章的做法 09/05 16:01
LiloHuang: 也可以使用 VirtualAllocEx 來配置一塊不能讀寫的區塊 09/05 16:06
LiloHuang: 再透過 Structured Exception Handling 攔截存取違規 09/05 16:08
LiloHuang: 的 EXCEPTION_ACCESS_VIOLATION (0xC0000005) 09/05 16:09
LiloHuang: 而且此方法也可以知悉是讀取的違規還是寫入的違規 09/05 16:11
LiloHuang: https://goo.gl/BMdqcC 看完官方文件就會有想法了 :) 09/05 16:12
LiloHuang: 另外這篇 CodeProject http://goo.gl/MPJFdk 也可看看 09/05 16:30
LiloHuang: 至少他有提到 SetMemoryBreakpoint 的部分 :P 09/05 16:30
hank821017: 感謝...我來仔細的研究看看 09/05 16:31
LiloHuang: 如果不想寫 Code 還有一招就是用 windbg 寫 script 09/05 16:32
LiloHuang: 這樣就不用改 C/C++ code,windbg 可以攔截記憶體存取 09/05 16:32
LiloHuang: Good luck! 09/05 16:33
kevingwn: 這通常不都假設整個temp_data都會被access嗎? 09/06 12:03