我们的应用程序在嵌套目录中有一些 DLL 形式的附加组件。我们正在使用在后台运行的 DbgView 实例运行测试,通过该实例获取日志。问题是我们在与我们构建构建的计算机不同的计算机上运行测试。这会导致 PE 标头(通过 Dumpbin 工具提取)中的调试目录条目非常无效。
我们没有类似的符号服务器。然而,所有 PDB 文件都放置在调试版本中的二进制文件旁边,并具有正确的名称,因此我们希望可以毫无问题地找到它们。
加载项通过 LoadLibrary Windows 函数加载,然后使用 SymLoadModule64 函数加载符号表。根据返回值是正确的,但是当我们使用 SymGetModuleInfo64 检查实际加载的 PDB 时,它显示实际上什么都没有。这从导致我们深入修复应用程序的这一部分的原始问题也很明显,即上述调试日志中的调用堆栈,更准确地说是它们处理附加组件的部分被搞砸了。
尝试了各种版本的功能,并检查了 DbgHelp 库的版本,但无济于事。
从 VS 附加显示 VS 确实可以找到 PDB,而我们的符号加载机制和输出窗口中的日志仍然显示有问题的行为。VS 可以修复的只是混乱的调用堆栈。
DbgHelp 的符号加载使用应用程序的根目录初始化为“SymSearchPath”并启用了 DEFERRED_LOAD。后者我们需要删除,前者被设置为包含附加组件的目录。另一种解决方案是将 PDB 文件移至此根目录。
根据MSDN 上 SymInitialize的参考,递归搜索“SymSearchPath”以查找 PDB 文件,但实际上并非如此。另一件事是,每次我在网上浏览订单时,如何找到 PDB 文件的方法,它读取为第 1 或第 2 行,即从加载二进制文件的目录中搜索 PDB 文件,但作为我在上面已经解释过,这种情况也不会发生。
总而言之,虽然问题似乎解决了,但这里有很多令人困惑的事情。
所以..
1. 如果有人知道加载 PDB 文件的正确方式,那将会很有启发性。.. ?
2. DbgHelp 从根本上来说有问题吗?
3.为什么MSDN上说“SymSearchPath”没有递归搜索?
另外,如果您还有其他要添加的内容,也将受到欢迎。
感谢您阅读这么长的帖子。