问题标签 [crash-dumps]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
21868 浏览

c++ - windows故障转储文件详细内存使用分析?

我们收到了来自客户的本机(完整)故障转储文件。在 Visual Studio (2005) 调试器中打开它显示我们遇到了由试图分配 ~10MB 块的 realloc 调用引起的崩溃。转储文件异常大(1,5 GB - 通常它们更像 500 MB)。

因此,我们得出结论,我们有一个内存“泄漏”或失控分配,它们要么完全耗尽了进程的内存,要么至少将其碎片化到足以使 realloc 失败。(请注意,此 realloc 用于分配日志缓冲区的操作,我们并不惊讶它在这里失败,因为除了一些非常大的不可更改的缓冲区之外,一次性 10MB 将是我们所做的更大的分配之一——问题本身可能与此特定分配无关。)

编辑:在下面与 Lex Li 进行评论交流后,我应该补充:这对我们来说是不可复制的(目前)。这只是一个客户转储清楚地显示失控的内存消耗。

主要问题:

现在我们有了一个转储文件,但是我们如何才能找到导致内存使用过多的原因呢?

到目前为止我们所做的:

我们使用了DebugDiag 工具来分析转储文件(所谓的内存压力分析器),这是我们得到的:

这只是为了获得一些背景信息。我认为更有趣的是:

现在,看看堆0x01040000(1,5 GB),我们看到:

这个段信息到底是什么?

查看列出的分配:

我们可以看到,显然 MSVCR80 堆在 336 字节处拥有 3.760.923 个分配。这很清楚我们用大量的小分配清理了我们的内存,但是我们如何才能获得更多关于这些分配来自哪里的信息呢?

如果我们能以某种方式对这些分配地址中的一些进行采样,然后检查这些地址在进程映像中的哪些位置被使用,那么——假设这些分配的很大一部分是造成我们的“泄漏”的原因——我们也许可以找出在哪里这些失控的分配来自。

不幸的是,我现在真的不知道如何从转储中获取更多信息。

我如何检查这个堆以查看一些“336”分配地址?

如何在转储中搜索这些地址,然后如何找出转储中的哪个指针变量(如果有)保存在这些地址上?

有关使用 DebugDiag、WinDbg 或任何其他工具的任何提示都可以真正提供帮助!另外,如果您不同意我上面的任何分析,请告诉我们!谢谢!

0 投票
2 回答
23377 浏览

windbg - 崩溃转储 - 使用 WinDbg 解决 .NET 应用程序中的非托管代码崩溃

我正在尝试发现 WinDbg 工具来分析我们在生产服务器上的故障转储。

当我运行时!analyze -v,我得到:

我真的很难弄清楚什么是什么。据我了解,这里是有趣的部分:

我是 WinDbg 的新手,这是我第一次使用这个工具。我一直在为我的谷歌搜索而苦苦挣扎,所以我想我没有在寻找正确的东西。

我想做的是:

  1. 了解stack_text的输出格式
  2. 试试看各个函数的输入参数

这是解决这个问题的正确方法吗?

0 投票
1 回答
2679 浏览

debugging - Mac上有没有minidump的库?

MiniDump 是在 Windows 上调试崩溃的一个很好的功能,特别是因为它很小,所以它可以通过崩溃报告发送。(窗口错误报告)。

但似乎 Mac OS X 和其他 BSD 系统只支持完整的核心转储。

Mac 或 BSD 系统上是否有任何 mini-dump 实现?或者 Mac 软件开发人员如何分析客户的崩溃报告?

谢谢!-强尼

0 投票
2 回答
2429 浏览

.net - 如何使用 procdump (或类似的)从 .Net 应用程序中捕获未处理的异常?

漫长(无聊)的故事

目前我有一个应用程序只在一台电脑上导致异常。经过一番挖掘,我可以用一个小示例应用程序封装问题,但真正的原因仍然隐藏。

由于在这台电脑上没有安装 Visual Studio,我们也无法这样做,我搜索了另一种解决方案来找到真正的原因。

在第一种方法中,我通过仔细阅读异常消息来越来越多地剥离我的小应用程序,与代码进行比较并尝试错误以解决具体的问题。但这无助于获取有关所有已使用变量的当前值等的所有信息。

所以我寻找另一种更好的方法来获取我需要的信息。我已经阅读了关于DumpsMinidumps的文章很长时间了,但从来不需要它们,因为直到现在我总是可以在我的开发人员或测试机器上重现用户描述的场景。

但这次似乎只有一台电脑出现问题,不幸的是,更换整台机器或安装所有新机器都没有选择。

为了熟悉如何使用转储,我只编写了一个简单的 c# 测试应用程序,其中包含一个按钮,它只做throw new ArgumentException("Test");

现在我需要在按下恶意按钮后创建这样一个神奇的转储文件,将其读入 Visual Studio 2008 Professional 并可以像在 VS 中正常运行的应用程序一样查看它,除了Step next等不起作用。

据我所知,在特定时间点创建转储的最佳工具是procdump,因为您可以定义何时进行一个或多个转储。

所以我只是下载它并通过调用启动它procdump -o -e MyApp.exe d:\MyApp.dmp。它声称MyApp.exe不存在。好吧,我的错。只需先启动 MyApp,然后再启动 procdump。

Procdump 现在正在运行,向我展示了它使用的所有选项,并且似乎在等待未处理的异常。没有比这更容易的了,我只是按下我的恶意按钮......并且在 procdump 中没有任何反应。

相反,我的应用程序会弹出一个对话框窗口,说明发生了未处理的异常(意外、意外)以及我想要做什么(详细信息、继续、退出)。但无论我选择什么,procdump 都无法自动创建转储文件。

如果我procdump -o MyApp.exe d:\MyApp.dmp在对话框显示转储文件似乎没用时去调用它,因为在 VS 中打开它后,调用堆栈只是在某个地方徘徊,ntdll.dll但在我的代码中没有任何地方(我猜这是消息队列对话框等待一些鼠标点击)。

如果我仔细查看详细信息,您会发现一些有关如何将未处理的异常委托给 JIT 调试器的信息。但我不想要 JIT 调试器,我想使应用程序崩溃以获取转储文件。

在这些尝试之后,我找到了 ClrDump,但这并没有产生任何更好的转储(如果我将它加载到 VS 并查看调用堆栈)。

考虑到这些信息,您现在(希望)能够为我的 .Net 应用程序提供(工作)解决方案:

(短)问题

当 .net 应用程序中发生未处理的异常时,我如何能够创建转储文件,我能够加载 MyApp .pdb 文件并查看在什么情况下引发了异常?

答案

在 Naveen 和 Lex Li 的帮助下,我可以更深入地了解如何使用故障转储进行调试。现在我想回顾一下所有的东西,这是让它工作所需要的:

每当您想获得一个进程的转储时,您可以在几个工具之间进行选择来完成工作:

  • 过程转储
    • 简单的命令行工具,可以在复杂的场景中创建转储,但它不能捕获 .net 未处理的异常。
  • 调试诊断
    • 简单的图形工具,可以在崩溃时创建转储(甚至是 .net 异常),但它不能在 Procdump 等高级场景中创建转储。

如您所见,您将获得两种能够在不同情况下创建转储的工具,因此在所需时间点创建转储方面,两者都是合作伙伴而不是竞争对手。

使用上述工具之一创建转储后,是时候分析转储以找出问题的原因了。为了进行分析,您可以获取 WinDbg。它是Windows 调试工具的一部分,可以从 Microsoft 获得。不幸的是,WinDbg 的入门门槛相当高,但它确实很强大。也许看看这个博客,以更好地了解如何使用这个工具。

如果您有一个 .Net 4 应用程序并使用 Visual Studio 2010,您也可以使用它进行分析。由于更好的图形用户界面,它更易于使用,但它没有 WinDbg 的强大功能。为了获得更好的比较,您应该查看这篇文章

最后但并非最不重要的一点是,您还可以在 Visual Studio 2008 中使用 sos.dll。这是描述您可以使用它做什么的文章。

0 投票
2 回答
4657 浏览

iphone - 如何解决iOS上的“未能及时恢复”

0 投票
1 回答
2849 浏览

windbg - 解析 WinDbg 中的故障转储以获取私有字节(托管堆除外)?

我想解析完整的故障转储 (*.dmp) 文件并获取私有字节数据。我知道 SysInternals 的 VMMap 可以告诉我有多少私有字节、堆等,但我需要的是,如果我有转储,我应该能够解析它并获取堆(托管堆)结构和数据堆。通过阅读 PEB 然后遍历堆,我已经完成了这项工作。

我无法弄清楚的是如何读取私有字节(除了堆,它应该是本机代码的进程数据)。谁能指出我正确的方向,以便我能够解析崩溃转储中的堆以外的私有字节。

谢谢。

0 投票
2 回答
308 浏览

iphone - 有没有办法自动将控制台输出包含在 ios 上的崩溃日志中

当您的应用程序在 iOS 上出现错误时返回的崩溃日志非常棒,但是如果它包含您的应用程序启动时的控制台输出作为日志的一部分,它会好 100 倍。有没有办法在崩溃日志中自动获取该信息,或者有一个半自动系统,测试人员可以在发送崩溃日志时使用?

0 投票
2 回答
14832 浏览

debugging - 什么是 0x%08lx?

我最近在工作时在我的 XP 盒子上遇到了很多蓝屏。事实上,我下载了 Windows(x86) 的调试工具并一直在分析故障转储。事实上,我已经将转储改为迷你转储,否则我可能会每周花费半个工作日等待蓝屏完成详细的崩溃日志记录。

几乎无一例外,每个转储都告诉我蓝屏的原因是某种内存分配错误或错误引用,并且 0x%08lx 处的内存引用了 0x%08lx 并且不能是 %s。

出于好奇,我将“0x%08lx”放入谷歌,发现不少故障转储都包含这条奇怪的消息。我是否认为 0x%08lx 是应该有意义的东西的占位符?“%s”是结论句“内存不可能是 %s”的一部分,它看起来肯定缺少变量或其他东西。

有谁知道这条消息的出处?它实际上应该有用吗?它应该是什么样子?

这不是我一直在解决的主要问题。奇怪的是,这么多人会在这么多故障转储中看到这一点,而没有人说:“哦,故障转储没有正确完成它应该读取的消息......”

我只是好奇是否有人知道这个奇怪的错误消息伪影的目的。

0 投票
3 回答
30195 浏览

crash-dumps - 转储文件分析入门

我正在使用一个旧的 VB6/COM 应用程序,它有时会导致 Windows 7 崩溃。我现在使用 Sysinternals 的 ProcDump 工具生成了其中一个崩溃的 .dmp 文件。但是,我以前从未使用过转储文件。对于转储文件分析入门,您会推荐哪些资源?

0 投票
2 回答
5295 浏览

android - Android 故障转储数据在设备上访问

这可能是一个显而易见的问题,但我真的不知道如何访问测试时在我的三星设备上发生的故障转储。我看到核心转储,然后是一些选项喜欢 # 9900来访问它。它告诉文件去了哪里,但是我如何从我的 PC 访问目录和/或将其复制到我的 PC。我安装了 kies 我也尝试切换到大容量存储,但我只是看不到如何访问文件系统。谢谢