[轉] 靜態庫的PDB相關知識

本文轉自:http://blog.sina.com.cn/s/blog_41299a9701018bs8.html

今天遇到一個Crash,Crash在第三方庫中,由於好奇,就看了一下。發現代碼沒有,我們只能看到頭文件,只有別人的Crash Call Stack,連Dump文件也沒有,所以只能手動模擬重現。

  發現Crash的目標模塊是A.dll它是我們自己的代碼,但是Crash的第三方庫是通過靜態鏈接到它裏面的。也就是說Crash的實際代碼是第三方庫寫的,沒有源碼,但是VS竟然能顯示出行號!反彙編竟然能顯示出文件名,這就奇怪了,它的信息哪裏來的?VS不可能自己產生,所以研究了一下。

  這裏有兩種可能

  1. 它用第三方提供的庫文件的PDB,找了一下,還真有。但VS調試時,能刪除這個文件,說明沒有在被用。

  2. 它把這個PDB的內容拷貝到A.pdb裏了。實際也是這樣,找了一下A.pdb果然如此。問題又來了,那它拷貝的東西的來源是誰呢?我們知道lib包括代碼,那它裏面也包括PDB的信息嗎?是不是PDB信息也是Link的時候通過從Lib裏拷貝出來的嗎?查了一下Lib,裏面果然有源文件信息和PDB信息,但還是不能肯定。

  準備做如下實驗證實PDB信息到底在Lib自已,還是通過它找到庫的PDB,再從庫的PDB裏拷貝到A.pdb。把目標的PDB改名,重新編譯A工程,如果還帶第三方庫的PDB信息,那就是在Lib裏。如果沒有,那就是在PDB裏。

 

  經過驗證,我想我已經找到答案了,通過lib找到PDB,再拷貝。

d.lib(1.obj) : warning LNK4099: PDB 'd.pdb' was not found with 'd.lib(1.obj)' or at 'C:\d.pdb'; linking object as if no debug info

  另外就是驗證了一下,如果在沒有源碼情況下,看出RCX代表哪個類,根據類型信息,要加上模塊偏移量。然後根據虛表偏移,判斷出是幾第個虛函數,再配合頭文件,找出函數名,或者直接F11,PDB信息顯示的CALL Stack也會告訴我們這些,有些東西是相互印證的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章