VC静态库的调试

VC静态库的调试

背景

对于动态库或者可执行程序而言,如果想要调试只要将对应的pdb文件和动态库或者可执行文件放在一起即可自动加载符号。
众所周知静态库在最终链接的时候是把代码直接链接到最终的生成文件里的。这就决定了不可能把静态库的pdb文件和生成文件放在一起来调试。所以我们想要调试静态库,肯定需要一些特殊的操作。
那么,对于静态库调试,具体该怎么做呢?

静态库的pdb文件

首先我们确定一件事,静态库有没有pdb文件。答案当然是有的,但是动态库或者可执行文件的pdb文件都是在生成目录里,和生成文件放在一起,而在静态库的生成目录里是找不到pdb文件的,静态库的pdb文件是在中间目录里的,和obj文件在一起。
还有一点要注意的是静态库pdb文件的名字,一般默认都是叫vcxxx.pdb,而不是像动态库或者可执行文件那样和生成文件名字一样。

静态库的调试信息

静态库的pdb文件不能直接加载,那么静态库的调试信息到底是怎么使用的呢?
众所周知静态库的代码直接链接到最终的生成文件里的,那么是不是调试信息也合并到最终的生成文件的pdb文件里呢?

的确如此,链接器在连接的过程中会将静态库的pdb文件中被用到的调试信息解析出来然后合并到最终的生成文件的pdb文件里。

那么链接器是怎么找到静态库的pdb文件的呢?是因为编译器在编译静态库的时候直接将pdb文件的绝对路径写在了obj文件里。链接器通过这个信息就可以找到静态库的pdb文件。

但是这就有个问题,如果把静态库发给别人使用,那么pdb文件路径不就失效了吗?没关系,链接器链接的时候如果找不到绝对路径的pdb文件还会搜索和静态库lib文件放在一起的和原pdb文件同名的pdb文件。
这就引出了一个新的问题,所有的静态库的默认pdb文件名字都是一样的,如果把几个静态库放在一起pdb文件就会冲突。所以我们要设置静态库的pdb文件名。通常我们设为和库名一致。

一种设置方法是在VS的c/c++选项里设置输出文件设置页的程序数据库名项。

另一种设置方法是使用命令行参数里使用/Fd选项设置。

调试方法

综上所述,想要调试静态库只要保持静态库的pdb文件位置不变或者将静态库的pdb文件和静态库lib文件放在一起,然后正常链接。调试信息就被包含到了最终生成的文件的pdb文件里,需要调试的时候直接加载最终生成的文件的pdb文件,和正常调试动态库或者可执行文件一样。

说人话

就是把lib库对应的pdb文件放在lib库目录,然后正常链接就可以。pdb文件如果在VS2015下为vc140.pdb

posted @ 2019-12-08 18:44  老耗子  阅读(588)  评论(0编辑  收藏  举报