查看完整版本: 偵測特定記憶體位址寫入
頁: [1]

itri980010 發表於 2011-9-16 01:10 PM

偵測特定記憶體位址寫入

我的程式不知道是link到錯誤的library還是怎樣
導致某些資料被寫入錯誤的值
                                                                                
像是在construtor設好了,之後應該也沒任何函數會動到他,
可是內容卻莫名其妙的跑掉
(資料存在heap裡)
                                                                                
請問有沒有任何方法讓debbuger在特定記憶體位址被寫入的時候break,
然後可以做stacktrace之類的來找出問題的根源?
                                                                                
或是有什麼原因可能導致這樣的問題?
我相信應該是沒有陣列超界之類的
                                                                                
謝謝...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><div></div>

kaworucloud 發表於 2011-9-16 03:06 PM

其他 compiler 我不清楚,但我知道 Visual Studio 系列可以

1.以 debug mode 執行程式
2.選單 Debug->Break All 進入 break mode
3.選單 Debug->New Breakpoint->New Data Breakpoint
接著會出現 data breakpoint 的設定視窗
可以指定從特定 address 起 n bytes 內的資料異動時觸發
address 除了可以填 0x12345678 型式的絕對位置之外,也可以填 &x 之類的表述式

goodbye_mylove 發表於 2011-9-16 09:00 PM

回復 1# itri980010


洽巧這陣子有寫 vs debug 操作
edisonx . pixnet . net / blog / post / 79163003    =>壹、 設定變數變更中斷
edisonx . pixnet . net / blog / post / 79656815    =>貮、 變更式中斷
edisonx . pixnet . net / blog / post / 79657885    => Visual C++ Debug 技巧
避免敏感內容,所以加上空白,貼上時記得把空白全拿掉。

如果記憶體內容是 new / malloc 出來而放在 heap 裡的話 (不含 container) ,
你可能還要再參考這篇
edisonx . pixnet . net / blog / post / 79372149
有興趣學 Visual C++ (我所知道) Debug 技巧的話,這裡有目錄
edisonx . pixnet . net / blog / post / 79657885
其實還有很多 debug class / debug tool 可以用,
但要多花些時間去找一下、摸一下。...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>
頁: [1]