问题标签 [minidump]

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 投票
6 回答
7339 浏览

debugging - 在调用堆栈为空的 Visual Studio 中调试小型转储

我有一个客户遇到了 100% 可重现的崩溃,我无法在 Visual Studio 2005 中编译的程序中复制该崩溃。我向他们发送了我的程序的调试版本,并将所有 PDB 和 DLL 文件放在手边。他们向我发送了 minidump 文件,但是当我打开它时,我得到:

“MiniDump.dmp 中 0x00000000 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000000。”

然后调用堆栈只显示“0x00000000()”,反汇编显示0x0处的内存转储。我已经设置了符号服务器,加载了我的 PDB 符号等。但是我看不出有任何方法可以知道许多 DLL 中的哪一个实际上导致了跳转到 null。这是一个具有许多依赖项的大型项目,其中一些是我没有源或 PDB 的二进制文件,因为我使用 API 作为第 3 方。

那么这个小型转储到底有什么用呢?如何查看导致崩溃的 DLL?我以前从未真正使用 minidump 进行调试,但我读过的所有教程似乎至少显示了一个函数名称或其他可以在调用堆栈中为您提供线索的内容。我只是得到指向空值的一行。

我还尝试使用“Depends”来查看是否存在一些未解决的 DLL 依赖项;但是在我的三台装有各种 Windows 操作系统的测试机器上,我似乎得到了三组不同的操作系统 DLL 依赖项(但无法复制崩溃);所以这似乎也不是诊断问题的特别可靠的方法。

还有哪些其他方法可以确定此问题的原因?有什么方法可以退回一条指令以查看哪个 DLL 跳转到空值?

0 投票
2 回答
3156 浏览

minidump - minidump 文件是否包含崩溃的时间戳?

minidump 文件中的 MiscInfoStream 包含进程创建时间。我想知道崩溃前该进程运行了多长时间。minidump 文件是否在任何地方都包含异常时间戳?

此转储文件上的 WinDbg 显示以下内容,这意味着它在某处...

(DumpChk 显示相同的信息,在流列表的末尾)

请注意,今天是 3 月 15 日,所以这几乎可以肯定是崩溃的时间戳。我想要一种编程方式来检索该值和“Process Uptime”值。

我找到了MINIDUMP_MISC_INFO_3包含一些时区信息的结构,但它似乎不包含异常时间。

一些转储文件似乎有一个 ThreadInfoListStream,其中包含进程中每个线程的时间戳,但这不包含在我看到的小型转储中。

0 投票
4 回答
1192 浏览

c++ - 如何基于 WinDbg 扩展中的转储文件内存创建对象?

我在一个大型应用程序上工作,并且经常使用 WinDbg 根据客户提供的 DMP 文件来诊断问题。我已经为 WinDbg 编写了一些小扩展,这些扩展对于从 DMP 文件中提取信息非常有用。在我的扩展代码中,我发现自己以同样的方式一遍又一遍地手动取消引用 c++ 类对象。例如:

这很好用,但是随着我编写了更多的扩展,具有更强大的功能(并在我们的应用程序 DMP 文件中访问更复杂的对象),我渴望有一个更好的解决方案。我当然可以访问我们自己的应用程序的源代码,所以我认为应该有一种方法可以将对象从 DMP 文件中复制出来,并使用该内存在调试器扩展中创建一个实际的对象,我可以在该对象上调用函数(通过从我们的应用程序中链接 dll)。这将省去我用手从 DMP 中取出东西的麻烦。

这甚至可能吗?我尝试了一些显而易见的事情,比如在扩展中创建一个新对象,然后直接从 DMP 文件中用一个大的 ReadMemory 覆盖它。这似乎将数据放在正确的字段中,但当我尝试调用函数时吓坏了。我想我错过了一些东西......也许c ++会带来一些我不知道的vtable funky-ness?我的代码与此类似:

跟进:看起来可能来自 EngExtCpp 的 ExtRemoteTyped 是我想要的?有没有人成功使用过这个?我需要谷歌搜索一些示例代码,但运气不佳。

跟进 2:我正在对此进行两种不同的调查。
1) 我正在研究 ExtRemoteTyped,但看起来这个类实际上只是 ReadMemory/GetFieldOffset 调用的助手。是的,这将有助于加快速度,但在从 DMP 文件重新创建对象时并没有真正的帮助。虽然文档很薄,所以我可能会误解一些东西。2) 我也在考虑尝试使用 ReadMemory 用 DMP 文件中的数据覆盖在我的扩展中创建的对象。但是,我没有像上面那样使用 sizeof(*thisClass) ,而是认为我只会挑选数据元素,而保持 vtables 不变。

0 投票
2 回答
5248 浏览

c++ - 创建正在运行的进程的 MiniDump

我试图为我的最终用户制作一个工具,如果它挂起(即在应用程序外部),它可以创建我的应用程序的 MiniDump。我使用与内部 MiniDumper 相同的代码,但使用应用程序的句柄和 processid,但在调用 MiniDumpWriteDump 时我不断收到错误代码 0xD0000024。有任何想法吗?

此代码在进程内部(即使用 SetUnhandledExceptionFilter)时 100% 工作

0 投票
1 回答
370 浏览

minidump - 如何使用 WER 请求其他数据?

我是 WER 的新手(其实是几天前才注册的)。

我设法建立了一个帐户并将我的测试应用程序映射到它。

但是,当我调用未处理的异常时,我看到没有收集其他文件(解决方案中心有正确的报告,BucketID <> 8,尚未到达 winqual,但至少已发送)。

我希望将收集诸如 Version.txt、AppCompat.txt 和 minidump.mdmp 之类的文件。我还尝试使用WerRegisterFile 函数添加文件。没有错误,但也没有发送文件。

我读过这个线程- 它说只有在服务器要求时才会收集额外的数据。所以,我的问题是(可能听起来很愚蠢,但是......):我怎样才能请求额外的数据?我已经扫描了我的个人资料中的所有内容,但唯一有用的选项与产品/文件映射有关。

我觉得这应该很明显(帮助中没有讨论),但是......我被卡住了:(一个屏幕截图表明在哪里看会很好:)

0 投票
1 回答
565 浏览

visual-studio-2008 - SetUnhandledExceptionFilter 功能

谁能解释一下SetUnhandledExceptionFilter方法在小型转储中的工作原理?

0 投票
3 回答
4967 浏览

.net - 发生某些第一次机会异常时如何创建.NET进程的小型转储

我的应用程序在 QA 环境中抛出 InvalidCastException,这是我在开发中无法重现的。

我希望在异常时刻获得小型转储。我知道 adplus,但我不确定如何使用它,以便在引发 InvalidCastException 时创建小型转储。显然,它不能将一个 .NET 异常与另一个区别开来。可能是我错了,有办法。或者,还有另一个工具可以做到这一点。最好是免费的。

无论如何,任何人都可以建议如何处理这个问题?

谢谢。

更新

  1. 该构建是 QA 和开发中的 Debug 构建。然而,QA 运行在实验室中可能实现的复杂场景,开发人员无法重现这些场景。因此,我需要在 QA 中运行时进行转储。
  2. 我可以修改代码并从代码创建小型转储。但是,我希望有一个更灵活的解决方案,这种解决方案不需要每次发生此类问题时都修改代码。

更新 2

实际上,我从 John robbins SuperAssert.Net 再次“窃取”了 minidump 生成代码,这是从某个具体点生成 minidump 的代码,而我需要一种更灵活的 adplus 风格的方法。John Robbins 的方法是创建一个 cdb 脚本,然后使用该脚本调用 cdb 调试器,使其附加到进程并创建转储。它不使用 MiniDumpWriteDump API。

0 投票
2 回答
1139 浏览

windbg - 需要帮助使用 WinDbg 调试小型转储

我已经阅读了很多类似的问题,但我似乎无法找到我的问题到底是什么的答案。

我有一组运行在 64 位 Windows 2008 上的 32 位应用程序的 minidump。我的 32 位 Vista Business 上的 32 位 Visual Studio 根本不会触及它们,所以我一直试图在 WinDbg 中打开它们。

我没有完全对应的 .pdb 文件(我们只是在此特定版本之后才开始保存它们),但我有 .pdbs 由同一台机器使用相同的代码构建。我还可以访问创建小型转储的确切可执行文件。

我发现了一个名为 ChkMatch 的漂亮小应用程序,它可以使 .pdbs 与可执行文件匹配……唯一的区别(根据 ChkMatch)是年龄,所以我将较新的 .pdbs 与原始可执行文件匹配。

但是,当我在 WinDbg 中加载它时,它仍然说它是一个“不匹配的 pdb”,因为我已经设置.symopts+0x40它尝试加载它们。然后我收到警告:

我跑过去!lmi myexe看到,确实,可执行文件的校验和实际上为零。经过一番摸索,我发现可执行文件应该使用/release标志构建以具有校验和。这一切都很好,但我不能完全回到过去并重建(如果我这样做了,我肯定会保存原始的 .pdbs :-P )。

有什么我可以在这里做的吗?似乎有点荒谬我不能在这里匹配至少足以获得调用堆栈。

0 投票
5 回答
1462 浏览

debugging - 在保留一些堆信息的同时减少托管程序的小型转储的大小?

借助 .NET 4.0 中的转储调试支持,我们正在自动研究(当然是在询问用户之后:)创建 C# 程序崩溃的小型转储,以将它们上传到我们的问题跟踪系统(以便小型转储可以帮助解决问题的原因)碰撞)。

使用 WithFullMemory 小型转储类型时一切正常。我们可以看到堆栈和堆变量。不幸的是,即使对于小型 C# 程序,(压缩的)转储也非常大。

如果我们使用“Normal”小型转储类型,我们会得到一个非常小的转储,但托管调试器中甚至没有堆栈变量信息。事实上,任何低于 WithFullMemory 的东西在托管调试器中似乎都毫无用处。我们曾尝试使用 MINIDUMP_CALLBACK_ROUTINE 将包含的模块信息限制在我们自己的模块中,但似乎它对托管转储几乎没有影响,但仍然设法破坏托管调试?

有没有人有关于如何修剪小型转储同时保持它对托管调试有用的任何提示?

0 投票
2 回答
1127 浏览

asp.net - 如何在 Visual Studio 2010 中调试 ASPNET 工作进程的转储文件?

我遇到了一个特别讨厌的错误,其中 ASP.NET 网站试图调用 WCF 服务方法,该方法将 IIS 送入死亡螺旋……最终导致相关的应用程序池崩溃。它永远不会到达输出未处理异常的 log4net 代码。

我正在看着 w3wp.exe 进程启动并死掉,所以我想我会使用SysInternals 的 ProcDump使用以下命令在终止时获取一个转储文件:

这给了我一个 minidump 文件,我可以在 VS2010 中打开它,它告诉我堆信息是存在的。令人兴奋的是:

小型转储摘要

因此,此时我尝试设置符号路径,即该特定网站的 bin 文件夹。我已经从相应的服务器上复制了它。但是,我仍然只能选择 Debug with Native Only ,当我这样做时,它找不到任何适当的符号

这是我的 PDB 位置设置:

PDB 选项

我不确定这是否是因为调用堆栈似乎停止在 Windows DLL 中的某处......?这是调用堆栈窗口的屏幕。

调用堆栈

无论如何,我的最终问题是我是否正在遵循适当的路径来查找此异常的来源,如果是,我错过了什么?它似乎在非托管代码中,但我仍然希望在一切爆炸之前看到最后一个托管调用。

另外,如果有帮助,Web服务器是Win2003 x86,我的PC是Win7 x64。

谢谢!