Debugging 调试符号问题

Debugging 调试符号问题,debugging,windbg,symbols,crash-dumps,Debugging,Windbg,Symbols,Crash Dumps,我感兴趣的是,当我们使用Windbg或visualstudio分析转储文件时,使用哪个符号文件。假设我的应用程序正在使用一个实用程序库,该实用程序库具有相关的私有符号文件。当我的应用程序中出现崩溃转储时,我需要实用程序库的符号来分析完整的调用堆栈。但是,有时构建/运行时/调试环境安装了不同版本的实用程序库——当然是不同版本的实用程序库符号 假设我们有一个用于构建(链接)我的应用程序的实用程序库(和相关符号)版本(例如a版本),在崩溃时在运行时使用另一个版本(例如B版本)的实用程序库(和相关符号)

我感兴趣的是,当我们使用Windbg或visualstudio分析转储文件时,使用哪个符号文件。假设我的应用程序正在使用一个实用程序库,该实用程序库具有相关的私有符号文件。当我的应用程序中出现崩溃转储时,我需要实用程序库的符号来分析完整的调用堆栈。但是,有时构建/运行时/调试环境安装了不同版本的实用程序库——当然是不同版本的实用程序库符号

假设我们有一个用于构建(链接)我的应用程序的实用程序库(和相关符号)版本(例如a版本),在崩溃时在运行时使用另一个版本(例如B版本)的实用程序库(和相关符号),并使用另一个不同版本(例如C版本)的实用程序库(和相关符号)在Windbg中,当我分析崩溃转储时

我的问题是,当崩溃在运行时生成时,版本B symbol用于生成崩溃转储(用符号信息填充转储)?但在Windbg调试环境中使用不同版本的符号C时,会出现符号不匹配问题吗?使用哪个版本的库来构建并不重要?我的理解都正确吗

提前感谢,,
George

通常,符号应与代码位于同一文件中(这就是调试版本通常更大的原因)。我不记得调试器在运行另一个二进制文件时会从一个二进制文件中提取符号的情况——但是,这是从一般知识中获取的,而不是从有关您的环境的任何专门信息中获取的

通常,符号应与代码位于同一文件中(这就是调试版本通常更大的原因)。我不记得调试器在运行另一个二进制文件时会从一个二进制文件中提取符号的情况——但是,这是从一般知识中获取的,而不是从有关您的环境的任何专门信息中获取的

听起来您想使用,以便WinDBG或VS可以下拉与正在调试的库的构建相对应的符号。如果它是第三方组件,并且您有专用符号,您可以将它们放在您自己的服务器中,或者查看第三方是否有公共符号服务器


Windbg不会加载符号,如果它们与您正在调试的dll不匹配,您可以使用!sym Noise以了解有关符号加载过程的更多信息。如果您选择不使用符号服务器,您可以手动管理所有pdb并将其手动加载到windbg中(使用lm v获取有关在您的过程中加载的模块的详细信息)

听起来您希望使用符号服务器,以便windbg或VS可以下拉与正在调试的库的构建相对应的符号。如果它是第三方组件,并且您有专用符号,您可以将它们放在您自己的服务器中,或者查看第三方是否有公共符号服务器


Windbg不会加载符号,如果它们与您正在调试的dll不匹配,您可以使用!sym Noise以了解有关符号加载过程的更多信息。如果您选择不使用symbol server,您可以手动管理所有pdb,并将其手动加载到windbg中(使用lm v获取有关流程中加载的模块的详细信息)

Hi MarkusQ,由于非技术原因(构建/运行/调试由不同方执行,尚未同步),使用不同的二进制文件。我的问题是,当生成转储时,转储是否依赖于运行时库符号来填充转储信息?@George——我只是泛泛而谈。有关详细信息,请参见马特·埃利斯的答案。(我向他投票)嗨,MarkusQ,我没有从他的帖子中找到我的答案——如果环境(生成崩溃转储)使用不同版本的symbol,但用于运行windbg分析转储的环境使用另一版本的symbol,为什么会出现符号不匹配(或报告错误信息)?(续)你有什么想法吗?嗨,MarkusQ,由于非技术原因(构建/运行/调试由不同的方执行,尚未同步),使用了不同的二进制文件。我的问题是,当生成转储时,转储是否依赖于运行时库符号来填充转储信息?@George——我只是泛泛而谈。有关详细信息,请参见马特·埃利斯的答案。(我向他投票)嗨,MarkusQ,我没有从他的帖子中找到我的答案——如果环境(生成崩溃转储)使用不同版本的symbol,但用于运行windbg分析转储的环境使用另一版本的symbol,为什么会出现符号不匹配(或报告错误信息)?(续)你有什么想法吗?我想知道,如果环境(生成崩溃转储)使用不同版本的符号,为什么会出现符号不匹配(或报告错误信息),但用于运行windbg分析转储的环境使用的是另一个版本的symbol?我同意您使用symbol server是解决此类symbol错误的一个很好的解决方案,但在我的环境中,由于非技术原因,运行时/构建/调试由不同的人运行,有时他们很难立即同步代码。:-)在第一个示例中,如果使用调试问题的计算机上的符号与转储时使用的dll不匹配,则会出现未匹配。在这种情况下,您应该将符号复制到本地计算机,将它们添加到sympath的目录中,然后执行.reload/f注意,未匹配将在调试时发生,而不是在发生故障的计算机生成转储时发生。如果具有正确的符号,则在调试问题时,可以在本地计算机上轻松解决此问题。也许您可以在自己的机器上运行符号服务器:-)谢谢Matt,我认为不匹配的根本原因是,在故障机器上,转储需要符号信息,对吗?以前我认为转储只是记录内存的过程,不依赖于任何符号信息。任何com