一直忙著調試代碼,寫伺服器的代碼,有時候真叫人鬱悶,鬱悶的是要高效能的保持程式繼續運行n多天還沒有事情,本來這也是程式員該做的事情,但是有時候一些長期積累下來的問題會造成程式指明性的打擊~~~
在寫這個程式的時候,本機調試代碼的時候都沒有遇到任何記憶體流失的問題,調試的時候都很清晰,但是到客戶那裡運行一天到兩天就沒名的掛掉,真讓人鬱悶
而且沒有任何報錯~~無奈,
開啟了drwtsn32來檢測程式的運行報錯情況
drwtsn32是windows調試的利器,調試不常見錯誤的程式的時候,累積錯誤的時候,都可以用它.
在命令列視窗,輸入drwtsn32
然後就可以看到drwtsn32的運行介面
然後設定"轉存到符號表"
"轉儲全部線程上下文"會在出錯的時候把程式啟動並執行上下文都記錄下來,如果只想知道出錯那個地方的記錄,就不要選這個,看起來方便很多
然後確定儲存這些資訊
相應的windows程式產生的時候,也得做一些改動,要產生map檔案,這樣好找到出問題的代碼地方
vc設定:
1、配置屬性-〉c/c++-〉常規-〉調試資訊格式, 選擇“程式資料庫(/Zi)”
2、配置屬性-〉c/c++-〉最佳化,選擇“禁用(/Od)”
3、配置屬性-〉連接器-〉調試-〉產生調試資訊,選擇 “是(/DEBUG)”
4、配置屬性-〉連接器-〉調試-〉產生影射檔案,選擇 “是(/MAP)”
5、配置屬性-〉連接器-〉調試-〉影射檔案名稱,選擇“$(OutDir)/$(ProjectName).map”
6、配置屬性-〉連接器-〉調試-〉影射匯出,選擇“是(/MAPINFO:EXPORTS)”
7、配置屬性-〉連接器-〉調試-〉影射行,選擇“是(/MAPINFO:LINES)”
8、配置屬性-〉連接器-〉進階->固定基址,選擇“產生重定位節(/FIXED:NO)”
然後命令列運行drwtsn32
等待程式出錯~~
程式出錯以後會把log和一個dmp檔案儲存體到故障轉存 和記錄檔路徑 那個目錄下面,這個目錄可以自己設定.
在log資訊裡面有這樣的資訊
Microsoft (R) Windows 2000 (TM) Version 5.00 DrWtsn32
Copyright (C) 1985-1999 Microsoft Corp. All rights reserved.
發生應用程式意外錯誤:
應用程式: (pid=1248)
時間: 2006-4-27 @ 09:49:29.613
意外情況編號: c0000005 (訪問侵犯)
*----> 系統資訊 <----*
電腦名稱: F6B2548C83754CF
使用者名稱: Administrator
處理器數量: 1
處理器類型: x86 Family 6 Model 8 Stepping 6
…………
0041e6bb 8b45e0 mov eax,[ebp+0xe0] ss:00d9907e=????????
錯誤 ->0041e6be 8b500c mov edx,[eax+0xc] ds:00c69ee6=????????
0041e6c1 52 push edx
0041e6c2 ff1518af4300 call dword ptr [0043af18] ds:0043af18=7c177c00
…………………………
很多資訊
然後對應的去找你vc 產生的map檔案的地方~~
找到代碼出現那樣情況的地方~~
~~~然後讓你的程式VC調試,反組譯碼,找到對應的地方~~
ps:這隻是一種最簡單的方法:)
更多的方法,看《windows程式調試》