[转] 静态库的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也会告诉我们这些,有些东西是相互印证的。

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