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
文件,和正常调试动态库或者可执行文件一样。