1. 程式人生 > >windows關於程式release 加上除錯資訊 利用pdb dump定位的問題

windows關於程式release 加上除錯資訊 利用pdb dump定位的問題

本來release預設一般是刪除所有的除錯資訊,然後編譯時帶有優化的引數,然後實現附帶資訊的減少,程式執行效能的提高。 但是可能你突然有想法需要在程式release版中加入資訊,然後通過第三方庫(crashrpt ,gppgle breakpad..)或者自己利用系統api去實現在使用者使用的時候,能夠在程式crash時,生成一個dump檔案,然後上傳給你,利用它來進行程式的除錯,這樣更方便找到問題。

當然不需要除錯資訊,你也可以通過其他的方法來獲得錯誤的資訊,程式碼的位置。但是這裡討論的是最方便的方法,就是拿到dump利用pdb然後用vs之類的進行除錯馬上就能定位到程式碼位置。

其實release debug差別的也就是一點點的選項,編譯器的選項關於除錯資訊的貼一下官網的:

/Z7、/Zi、/ZI(除錯資訊格式):

編譯器將程式資料庫命名為 project.pdb。 如果編譯沒有專案的檔案,則編譯器將建立名為 VCx0.pdb. 的資料庫,其中 x 是正在使用的 Visual C++ 的主版本。 編譯器將 PDB 的名稱嵌入每個使用此選項建立的 .obj 檔案中,從而使偵錯程式瞭解符號和行號資訊的位置。 當使用此選項時,.obj 檔案將較小,因為除錯資訊儲存在 .pdb 檔案中而不是 .obj 檔案中。

如果從使用此選項編譯的物件建立庫,則在將庫連結到程式時,關聯 .pdb 檔案必須可用。 因此,如果分發此庫,就必須分發 PDB。

若要不使用 .pdb 檔案建立包含除錯資訊的庫,必須選擇編譯器的 C 7.0 相容 (/Z7

) 選項。 如果使用預編譯頭選項,則預編譯頭和其他原始碼的除錯資訊都放在 PDB 中。 指定了“程式資料庫”選項時將忽略 /Yd 選項。

然後就是連結器的選項了,連結器需要啟用/DEBUG 還有 /PDB ,之前自己嘗試,在編譯選項里加上zi 之後,制定了pdb位置,然後如果同時存在優化選項o是無法定位到行的。然後重新是了一下在連線選項裡 加入了/PDB , 這時候生成的pdb是和編譯選項zi fd生成的不同的,這個卻可以和優化選項同在,除錯定位正常。後來查了一下。

http://msdn.microsoft.com/zh-cn/library/kwx19e36.aspx只有官方資料大概有提。 就是說到LINK時實際上是會把之前生成的pdb當成一個輸入,然後更新後會有不同的pdb生成,但具體修改了什麼,我還沒弄清楚。不過暫時的問題是解決了的。其實也就這個有點小疑惑,其他的資料上都說的很清楚了。