我试图在Visual Studio中调试w3wp进程的'release'部署中的转储文件。如何在Visual Studio中调试“释放”转储?
当我尝试进入代码时,它说'PDB与图像不匹配',即使它在过去工作(我在我的机器上重建了确切的提交并指向那些生成的PDB)。
任何线索我如何调试此转储/确保我可以调试未来的转储?
感谢
我试图在Visual Studio中调试w3wp进程的'release'部署中的转储文件。如何在Visual Studio中调试“释放”转储?
当我尝试进入代码时,它说'PDB与图像不匹配',即使它在过去工作(我在我的机器上重建了确切的提交并指向那些生成的PDB)。
任何线索我如何调试此转储/确保我可以调试未来的转储?
感谢
不能普遍使用不同的构建产生PDBS,即使源代码是相同的 - 调试放置一个GUID和年龄(计数器),其得到改变每一个版本。在调试器尝试使用pdb之前,这两个值必须匹配。
话虽如此,你可以试着用chkmatch来强制这样做。如果你幸运的话,你的新版本会有足够的布局来发布。为了确保构建环境尽可能相似 - 包括源代码位置(源文件绝对路径的长度可能影响二进制文件中的内部布局)。
如果您在原始版本中没有调试信息,那么将无法工作。
为了确保您将来没有这些问题,请始终使用调试信息构建发行版,然后保存这些发布版本的pdbs。
编辑:
对于C#项目,PDBS在项目属性进行控制 - >构建 - >高级构建设置 - >调试信息。在发布版本上将其设置为“仅限pdb”,在调试时将其设置为“全部”(应为默认值)。仅限Pdb不会影响发布版本的性能。
如果您控制部署环境,可以使用发行版二进制文件部署pdbs - 可以提高转储(不确定)。
如果您将二进制文件提供给最终用户,如果您想限制逆向工程,通常最好自己保留pdbs。
如果有任何情况下保留它们,只要你关心你的二进制文件的特定版本。
PDB是每个版本的,所以如果你想调试旧的版本,你需要使用PDB服务器或类似的东西来保持PDB。也就是说,托管代码具有足够的元数据,您可以在没有PDB的情况下调试很多场景,但您必须为SOS使用WinDbg。 –