[問題] C++ 陣列存取次數 之計量

看板C_and_CPP (C/C++)作者 (港督嘟助教)時間10年前 (2015/09/05 14:49), 編輯推噓5(5010)
留言15則, 4人參與, 最新討論串1/1
開發平台: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

09/05 14:53, , 1F
HOOK含式啊,把含式位置指向你的,再轉回去
09/05 14:53, 1F

09/05 16:01, , 2F
要偵測記憶體被讀寫可以朝實作 memory debugger 的方向
09/05 16:01, 2F

09/05 16:01, , 3F
https://goo.gl/Wwjtc7 可參考類似這篇文章的做法
09/05 16:01, 3F

09/05 16:06, , 4F
也可以使用 VirtualAllocEx 來配置一塊不能讀寫的區塊
09/05 16:06, 4F

09/05 16:08, , 5F
再透過 Structured Exception Handling 攔截存取違規
09/05 16:08, 5F

09/05 16:09, , 6F
的 EXCEPTION_ACCESS_VIOLATION (0xC0000005)
09/05 16:09, 6F

09/05 16:11, , 7F
而且此方法也可以知悉是讀取的違規還是寫入的違規
09/05 16:11, 7F

09/05 16:12, , 8F
https://goo.gl/BMdqcC 看完官方文件就會有想法了 :)
09/05 16:12, 8F

09/05 16:30, , 9F
另外這篇 CodeProject http://goo.gl/MPJFdk 也可看看
09/05 16:30, 9F

09/05 16:30, , 10F
至少他有提到 SetMemoryBreakpoint 的部分 :P
09/05 16:30, 10F

09/05 16:31, , 11F
感謝...我來仔細的研究看看
09/05 16:31, 11F

09/05 16:32, , 12F
如果不想寫 Code 還有一招就是用 windbg 寫 script
09/05 16:32, 12F

09/05 16:32, , 13F
這樣就不用改 C/C++ code,windbg 可以攔截記憶體存取
09/05 16:32, 13F

09/05 16:33, , 14F
Good luck!
09/05 16:33, 14F

09/06 12:03, , 15F
這通常不都假設整個temp_data都會被access嗎?
09/06 12:03, 15F
文章代碼(AID): #1Lwf1tPh (C_and_CPP)
文章代碼(AID): #1Lwf1tPh (C_and_CPP)