通过DIA SDK查看pdb中的符号信息

Mirror 0.2的x86版本已经膨胀到了793KB了,这让我觉得很好奇,到底是什么东西在疯狂的膨胀呢?实在想一探究竟。
于是杯具的事情发生了:Mirror的方向终于还是跑歪了,偏离了窗口,朝着编译器的方向走了弱弱的一小步。

加载pdb,就可以看到代码段大小的分布。
mirror-pdb

发现还是stl膨胀的比较猛,特别是map和vector。但是没有想想中的那么多,代码只有400多k,还有300多k估计是资源什么的,这个可能要等写完pe分析了之后才能知道了。

当时在写这个功能的时候,我想到的方法有两种:

  1. 使用dbghelp.dll提供的Symbol Api使用这种方法来写的话,需要将dll加载起来才能进行分析,但是实际上,我们需要的内容在pdb文件里面就已经都有了,所以这么做就有点多此一举了。
  2. 自己手写pdb的分析类
    虽然较为简单的分析代码,应该可以从breakpad中找到,但是我还是觉得这种方法太蛋疼,难道就没有现成的库来使用么?这不像是Windows的风格啊。

正当我纠结的蛋疼的时候,幸运的事情发生了,无意中在vs中发现了一个的pdb分析库:Debug Interface Access SDK。这个库随着vs的发布而发布,反正Mirror也只有开发人员才会用,所以基本上机器上应该都有vs,所以就直接使用这个SDK来实现了。

这个库里面有两个最主要的类:

  • IDiaDataSource:提供通过Exe,dll和Pdb加载调试信息的接口。功能类似于IDiaSession的类厂。
  • IDiaSession:通过IDiaDataSource创建,通过这个Session可以获取文件内部各种详细的调试信息。

关于这个SDK,微软已经给出了非常好的使用方法,所以这里就不罗列代码了,大家可以照着这个step by step来学习使用。
另外微软还提供了一个完整的实例程序Dia2dump展示Dia的方方面面:http://msdn.microsoft.com/en-us/library/b5ke49f5