- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这些年来,我在许多游戏项目中都使用了小型转储,它们似乎有50%的机会拥有有效的调用堆栈。我该怎么做才能使它们具有更好的调用堆栈?
我尝试将最新的dbghelp.dll放在exe目录中。这似乎有所帮助。
Visual Studio 2008或2010更好吗? (我仍在使用VS 2005)。
我使用的代码看起来像this sample。
最佳答案
要提高转储中调用堆栈的准确性,您可以做的一件事是使用Visual Studio以外的调试器-具体来说,请使用WinDbg或使用dbgeng.dll中提供的“ Windows Debugger”调试引擎的另一种工具(相对于(Visual Studio使用的“ Visual Studio Debugger”调试引擎)。
根据我们的经验,WinDbg在从相同的转储中生成良好的调用堆栈方面具有100%的可靠性,在这些转储中,Visual Studio会生成不可用或非常不准确的调用堆栈。据我所知,如果未处理的异常是崩溃的根源,WinDbg会自动执行tricky process of reconstructing/recovering the exception callstack,但Visual Studio不会(或不能?)。这两个调试器使用different heuristics for interpreting stacks
首先,WinDbg可能令人生畏,因此,这是我的快速指南,介绍如何使其更容易甚至避免直接使用它。
提取良好的调用栈的纯粹的凡人指南
这些从“最快/最容易”到“最慢/最难以解释”进行排序。
最简单的选择:使用DbgDiag from Microsoft
这是一个鲜为人知的工具,它可以自动执行许多常见问题的分析,并且非常简单,可以提供给非程序员甚至客户。它快速且几乎万无一失,并且已成为我快速分析传入的崩溃转储的“入门工具”。
启动“ DebugDiag Analysis”应用程序
选中主页上的“ CrashHangAnalysis”复选框
将转储拖放到主页上的“数据文件”窗格中
点击“开始分析”
几秒钟到几分钟后,它将吐出一个不错的.mhtml文件,其中包含问题分析,有关所有相关线程的信息,完整的调用堆栈等。所有超链接都易于使用。
DebugDiag甚至可以自动化一些可能但在WinDbg中痛苦的复杂分析(例如,跟踪应用程序中350个线程中的哪个导致死锁)。
注意:出于安全原因,Chrome不会下载或打开.mhtml文件,因此您必须在Internet Explorer或Microsoft Edge中打开它才能使用。这很烦人,我已经向DebugDiag小组(dbgdiag@microsoft.com)提出了将格式更改为纯HTML的请求。
中间选项:安装WinDbg作为Visual Studio的备用调试引擎
如果尚未安装,请安装Visual Studio。这需要在下一步之前完成。
安装Windows Driver Kit (WDK)
启动Visual Studio,(这部分很重要!)使用新的“文件->打开->故障转储...”选项打开转储。这将使用Windows调试器调试故障转储(如果您改为在Visual Studio上拖放转储,或使用标准的“文件->打开->文件...”选项打开转储,则会对其进行调试使用旧的Visual Studio调试引擎...,因此请小心使用正确的选项)。
现在,您应该能够看到正确的调用堆栈并使用Visual Studio GUI进行导航,尽管有些工作原理有所不同(监视窗口要求使用不熟悉的WinDbg语法,线程ID有所不同,等等)。注意:Visual Studio UI可能非常缓慢,尤其是在涉及许多线程并且“线程”或“并行堆栈”窗口打开的情况下。
核心选项:直接使用WinDbg
启动WinDbg.exe
将转储拖放到WinDbg窗口中
输入!analyze -v
并按Enter。一段时间后,WinDbg会吐出一个崩溃调用堆栈,并估算出问题的根源是什么。如果要分析死锁,可以尝试使用!analyze -v -hang
,WinDbg通常会向您显示所涉及的依赖关系链。
此时,您可能已拥有所需的所有信息!但是,如果您随后要在Visual Studio调试器中检查进程状态,则可以执行以下附加步骤:
在Visual Studio中打开故障转储
在调用堆栈窗口中右键单击,然后选择“转到反汇编”
将WinDbg的输出调用堆栈顶部的十六进制地址粘贴到“反汇编”窗口的“地址”栏中,然后按Enter。您现在在崩溃的位置,查看反汇编的代码。
在反汇编窗口中右键单击,然后选择“转到源代码”以转到该位置的源代码。现在,您在崩溃站点上查看源代码。
注意:以上所有要求都配置了正确的符号服务器路径,否则您将无法解析调用堆栈中的符号。我建议设置_NT_SYMBOL_PATH environment variable,以便Visual Studio,WinDbg和DebugDiag自动使用它。
关于debugging - 为什么小型转储不能提供良好的调用堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1552788/
嗨,我正在考虑开发一种文件传输程序,想知道我是否想要尽可能好的加密,我应该使用什么? 我会用 C# 开发它,所以我可以访问 .net 库 :P在我的 usb 上有一个证书来访问服务器是没有问题的,如果
我创建的这个计算两个数组的交集是线性的方法的复杂度(在良好、平均、最差的情况下)? O(n) public void getInt(int[] a,int[] b){ int i=0; int
我已经能够使用 RTCPeerConnection.getStats() API 获得 WebRTC 音频调用的各种统计信息(抖动、RTT、丢包等)。 我需要将整体通话质量评为优秀、良好、一般或差。
基本问题: 如果我正在讲述/修改数据,我应该通过索引硬编码索引访问文件的元素,即 targetFile.getElement(5);通过硬编码标识符(内部翻译成索引),即 target.getElem
在 Linux 上,我想知道要调用什么“C”API 来获取每个 CPU 的统计信息。 我知道并且可以从我的应用程序中读取 /proc/loadavg,但这是系统范围的负载平均值,而不是每个 CPU 的
在客户端浏览器中使用 fetch api,GET 或 POST 没有问题,但 fetch 和 DELETE 有问题。它似乎将 DELETE 请求方法更改为 OPTIONS。 大多数研究表明是一个cor
我是一名优秀的程序员,十分优秀!