1、 Dump文件放在哪里?
Dump文件不用非要放在你編譯出來(lái)的位置,你完全可以建立一個(gè)新的文件夾來(lái)放它。但若不是存放在編譯出來(lái)的位置,需要將編譯生成的PDB文件拷貝到Dump文件目錄,或是利用VS2005打開Dump文件后,設(shè)置PDB文件路徑。
2、 如何恢復(fù)當(dāng)時(shí)的現(xiàn)場(chǎng)?
可能你要問(wèn),怎么可能,這個(gè)dump文件可是用戶發(fā)給我的,我不可能去用戶家里調(diào)試吧?這個(gè)恢復(fù)現(xiàn)場(chǎng)可不是指的非要到那臺(tái)機(jī)器上去,而是要把產(chǎn)生dump文件對(duì)應(yīng)的二進(jìn)制文件拿到。
但是恢復(fù)現(xiàn)場(chǎng)需要所有的二進(jìn)制文件都要對(duì)應(yīng),你一定要有導(dǎo)致用戶崩潰的那些Exe和DLL。既然是你發(fā)布的程序,Exe文件當(dāng)然你會(huì)有。所以這里只考慮DLL就行了。
Dump文件中記錄了所有DLL文件的版本號(hào)和時(shí)間戳,所以你一定可以同過(guò)某種途徑拿到它。如果你能從用戶那里拿到最好,如果不方便,用戶不可能用的是我們平常不常用的操作系統(tǒng),所以找個(gè)有對(duì)應(yīng)系統(tǒng)的機(jī)器一般都會(huì)有。但是記住不僅是文件名稱要一致,還要核對(duì)版本和時(shí)間戳,如果不同一樣沒(méi)有辦法用。
如果客戶用了某個(gè)特殊的補(bǔ)丁怎么辦?
其實(shí)這個(gè)問(wèn)題也很好解決,只要它不阻礙閱讀堆棧,就不用管它,調(diào)試Dump和運(yùn)行程序不一樣,缺少一兩個(gè)DLL沒(méi)有任何問(wèn)題。
3、 如果真的需要怎么辦?
符號(hào)文件現(xiàn)在主要是指PDB文件。
如果沒(méi)有符號(hào)文件,那么調(diào)試的時(shí)候可能導(dǎo)致堆棧錯(cuò)誤。
如果你丟失了這個(gè)發(fā)布版本中你編譯出來(lái)的那些exe和DLL的PDB,那么這個(gè)損失是嚴(yán)重的,重新編譯出來(lái)的版本是不能使用的。
我自己的DLL都有了,可是缺的是系統(tǒng)的DLL的對(duì)應(yīng)PDB文件怎么辦?圖1.4中已經(jīng)介紹了方法。微軟在它的符號(hào)數(shù)據(jù)庫(kù)上為我們提供了所有的PDB文件,還有部分非關(guān)鍵DLL。設(shè)置好后程序?qū)⒆詣?dòng)下載需要的PDB及DLL文件。
4、 拿到需要的文件了,這些文件應(yīng)該放在哪里?
符號(hào)數(shù)據(jù)庫(kù)中的文件不用動(dòng),把其它的exe和DLL、PDB文件放在dump文件目錄里就行了。
5、 我用的是VS2005,明明有源代碼,為什么顯示不了?
這個(gè)是dump調(diào)試的最頭痛問(wèn)題,代碼可能已經(jīng)改過(guò)了,即使你從SVN拿到當(dāng)時(shí)的版本,時(shí)間戳也是錯(cuò)的,VS2005就是不讓你顯示代碼。其實(shí)只要在
Tools/Options,Debugging/General中去掉
Require source files to exactly match the original version的復(fù)選就行了。