作者hank821017 (港督嘟助教)
看板C_and_CPP
標題[問題] C++ 陣列存取次數 之計量
時間Sat Sep 5 14:49:24 2015
開發平台: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: 也可以使用 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: 至少他有提到 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