问题标签 [minidumpwritedump]

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 回答
2073 浏览

types - MiniDumpWriteDump 及其 MINIDUMP_TYPE 类型

不久前,我们了解到即使发布版本也可能无法正常运行 - 可能会下降 - 可能会挂起等等。所以我们决定实施转储创建过程。在 Internet 上很快找到了所有步骤。但是一个——主要的事情——对我们来说仍然是无法理解的。

根据 MSDN,MINIDUMP_TYPE 支持 23 个标志。但是对于下一个问题没有深入的技术解释:它们在各自的应用领域中都是独立的吗?或者它们可以成对使用,三联使用?它们都可以同时使用吗?我可以在某些组中使用它们吗(例如,一些 3 个标志 - 与其他 5 个标志几乎生成相同的转储。)我的意思是当我将使用前。1+3 标志 - 绝对等同于使用标志 4+6+9。或标志 1 或标志 3 或 ... - 是所有其他标志的叠加吗?或者是什么?我想了解所有可用标志之间所有可能的交叉。因为使用标志 3+12+14 可能没有实际意义。例如,我目前的目标是使用内存中绝对所有可用数据创建转储。我应该能够查看所有线程,所有 local-static-global-in_heap 变量。我的意思是,当我打开一些使用 bla+bla+bla 标志组合生成的转储时 - 它应该与我可以将调试器直接附加到进程的情况完全相同。我应该获得所有可能的数据!

PS MiniDumpWithFullMemory - 没有给我这样的能力(((为什么?这个词@FULL@ memory - 并不意味着FULL?它只是什么的一部分?

0 投票
0 回答
461 浏览

c++ - 创建看门狗来捕获小型转储

我正在尝试添加在程序崩溃时捕获小型转储的功能。根据我的阅读,这最好通过使用另一个用于托管真实应用程序并执行转储的应用程序(看门狗)来实现。

通过查看诸如此类的帖子我想出了以下内容(App 和 WatchDog 都是使用 Win32 在 C++ 中实现的):

  • 当看门狗启动时,它会创建 2 个事件,一个ExitedOk事件和一个Exception事件,这两个事件都设置为可继承且不发出信号。它还创建一个可继承的文件映射。

  • 然后看门狗启动“真正的应用程序”,并在WaitOnMultipleObjects中等待ExitedOkException发出信号。

  • 当应用程序启动时,它会创建相同的 2 个事件(它将继承句柄)

  • 该应用程序配置为,如果它退出正常,它会发出ExitedOk信号,或者如果发生未处理的异常,它会使用继承的文件映射存储异常/线程信息,发出Exception信号,然后休眠(无限)。

  • 如果看门狗中的 WaitOnMultipleObjects 用ExitedOk发出信号,则什么也不会发生。如果使用Exception发出信号,则它使用文件映射读取异常/线程信息,然后调用 MiniDumpWriteDump。

显然 Sleep() 是一个问题。这最好通过另一个事件解决吗?这样应用程序会等到看门狗发出一些“FinishedCreatingDump”事件的信号吗?

其次,我认为看门狗的全部意义在于你没有在可能不稳定的崩溃过程中做任何工作?如果我正确理解了工作流程,并且您确实需要在实际崩溃的过程中使用 SetEvent/OpenFileMapping/MapViewOfFile,那么这不就像从中调用 MiniDumpWriteDump 一样糟糕吗?

0 投票
1 回答
1554 浏览

debugging - 是否可以在创建后调整 memory.dmp 文件的大小?

我觉得问这个有点懒,但我似乎无法召唤出正确的谷歌查询来找到我所遇到问题的答案。

一点背景。我有一个应用程序,它将监视其他进程是否存在未处理的异常和崩溃等。触发时,此应用程序会收集系统信息并使用 MiniDumpWriteDump 创建一个 memory.dmp 文件。

我们现在希望这个进程监控应用程序将崩溃数据上传到服务器,但显然 memory.dmp 文件可能很大,这不适合上传。所以我们发现我们可以在创建 memory.dmp 时减小它的大小(如果我们不包含重要的信息,可能会使 memory.dmp 无用)或者最终不得不上传大量文件。

无论如何,在我们创建 memory.dmp 之后,它可以打开,完成一些初步分析(我知道这个位是可能的)并且 memory.dmp 的任何位被认为无用,被删除/编辑掉(和而是上传的 memory.dmp 的较小副本)?

例如,我的意思是 memory.dmp 的“位”。删除有关已卸载模块的句柄数​​据或信息。请参见MINIDUMP_TYPE 枚举

0 投票
1 回答
955 浏览

c# - MiniDumpWriteDump (C#) 为特定进程生成零长度转储文件

  1. 在特定进程中执行 MiniDumpWriteDump 会提供健康的转储文件。

  2. 从外部进程执行 MiniDumpWriteDump,其中 hProcess 和 processId 指向提到的特定进程,提供零长度转储文件

  3. 与 #2 相同,仅指向 FireFox 例如提供健康的转储文件

据我所知,我试图转储的特定进程正在以低权限运行,并且我的外部进程正在从管理员 CMD 窗口执行。

笔记:

  • 我正在刷新、关闭和正确处理文件流
  • MiniDumpWriteDump 返回 false 和 GetLastWin32Error 返回:-2147024597
  • 提到的特定进程(一个 dot net 服务器项目)具有与 FireFox 相同的安全选项(例如,转储适用于 Notepad++ 进程)。
0 投票
2 回答
1285 浏览

debugging - 如何使用 MiniDumpWriteDump 获得有意义的堆栈跟踪

我正在尝试以编程方式生成堆栈跟踪。当我的用户发生崩溃时,尤其是随机崩溃时,很难通过获取转储的过程与他们交谈,以便我可以解决问题。过去,一旦他们向我发送跟踪信息,我会将其中的地址交叉引用到 Intermediate/foo.map 文件,以找出问题所在(这是最好的方法吗?)

我根据在网上找到的各种示例构建了一个库,以输出一个小型转储以使我的工作更轻松。我上演了一次崩溃,但是我从 minidump 文件获得的堆栈跟踪与我从附加 windbg 获得的实时堆栈跟踪大不相同。两者的例子如下:

迷你转储.dmp:

WinDbg.exe:

game.exe 不是我的,我没有源代码/符号。Main.dll 被注入到 game.exe 中,它提供前端功能以从游戏中加载其他 DLL。调试代码和分阶段崩溃位于 Minidump.dll 中。Main.dll 加载 Minidump 后,它调用 AfterLoad(),它设置异常过滤器,然后触发崩溃。相关的小型转储代码如下:

当我打开 MiniDump.dmp 时,我将它指向我的所有符号文件(game.exe 除外,我没有它),那部分似乎正在工作。我确实将它指向 game.exe 二进制文件,因为我有它。我从中得到的堆栈跟踪真的没有帮助。我的最终目标是用户可以加载 DLL,导致崩溃,然后通过电子邮件将转储文件发送给我。然后我将附加符号文件和二进制文件,并能够为它们诊断问题。我做错了什么,还是无法得到我想要的。

我试图从所有细节中删除一些脂肪以简化问题,但如果需要我可以更明确。我在 CodeProject 上找到了很好的文章,我尝试查找更多背景信息来阅读以帮助我理解问题,但我能找到的并没有帮助我理解它们只是一步一步地得到它正在运行(已经是)。任何人都知道我做错了什么,或者可能指向相关阅读?


在 Sergei 的建议之后,我在 windbg 中做了 .ecxr 并获得了更好的输出,但是当我将 windbg 直接挂接到进程并触发崩溃时,它仍然与我得到的跟踪不匹配。这是小型转储跟踪;

以及将调试器附加到进程的跟踪

我没有game.exe的源代码(我有错误所在的DLL),但我反编译了game.exe,这是game+0x359035的内容。

我触发的错误在 Minidump.dll 中,但堆栈顶部的这段代码在 game.exe 中。game.exe 内部可能发生了很多我不知道的事情,它可能会劫持我以某种方式触发的错误吗?IE,我在 DLL 中触发了错误,但是 game.exe 中的某些设置在调用写入 minidump 的异常过滤器之前捕获了程序流?

如果是这种情况,当我将调试器附加到进程时,触发错误并获得指向错误在我的 DLL 中的正确输出,那么这意味着 game.exe 在调试器可以执行之前没有捕获程序流痕迹。我怎样才能使我的小型转储代码的行为方式相同......这进入了我不太熟悉的领域。有任何想法吗?


我追得更远,调用该函数的函数中有这一行:

所以,我认为在我的代码尝试获取转储之前,game.exe 正在劫持异常以进行自己的转储。然后我的转储跟踪只是game.exe转储过程的跟踪......


回答

我已经弄清楚了。我不知道如何回答我自己的帖子,所以这是交易。

那来自game.exe。事实证明,game.exe 是自己的小型转储。我的小型转储是在他们之后触发的,所以我在堆栈跟踪中看到的是他们的转储过程的踪迹。我在游戏的安装目录中找到了一个 dmp 文件,一旦我将符号加载到其中,它就会显示我所追求的正确输出。

0 投票
1 回答
362 浏览

vb.net - 在 Visual Basic 中转储其他正在运行的进程

我正在寻找一个可执行文件,它在运行时会将记事本转储到我驱动器上某处的文本文档中。这很重要,因为我希望能够扫描文件中的关键字并在找到它们时提醒最终用户。

这是我目前拥有的代码:

我的问题是,每当我运行此代码时,我都会得到一个空白文本文档。我知道函数 MiniDumpWriteDump 返回 false,我只是不知道为什么——这就是我在这里的原因。

供您参考,这发生在每个过程中,但它本身。

0 投票
1 回答
363 浏览

c# - ReadProcessMemory 与 MiniDumpWriteDump

我注意到,如果我尝试使用 ReadProcessMemory 读取整个过程,则需要很长时间。但是,在执行 MiniDumpWriteDump 时,它会在大约 1 秒内发生。

同样由于某种原因,在执行 ReadProcessMemory 而 MiniDumpWriteDump 没有尝试存储整个进程时,字节数组会损坏。

唯一的问题是,在执行 MiniDumpWriteDump 时,我无法匹配 Cheat Engine 之类的地址/值。例如,执行字节数组搜索会返回不同的地址。

ReadProcessMemory 长度 = 597577728

转储长度 = 372053153

0 投票
1 回答
193 浏览

mfc - 跨 MFC 边界获取 MiniDumpWriteDump 堆栈跟踪的正确方法是什么?

我们处于使用 MiniDumpWriteDump 生成转储文件的情况。但是我们注意到,如果代码采用我们的代码->MFC->我们的代码的路径,则调用堆栈在 MFC 处结束,我们就失去了问题的根源。

这是一个 64 位应用程序。

由于原始评论而更新:前几天的一个例子如下。我们收到了客户的转储文件。将其加载到 VS2017 中。由于转储文件和我们的开发机器之间的不匹配以及 MS 的符号存储中没有二进制文件,堆栈跟踪在 MFC 停止(我们的理解)。我们最终在我们网络上的另一台机器上找到了 MFC Dll 的匹配版本,然后调用堆栈完全完成,我们可以看到它从我们的代码 -> MFC -> 回到我们的代码并找到问题。

有没有办法获得完整的调用堆栈,即使我们没有获得 MFC DLL 的符号/二进制文件?

0 投票
1 回答
519 浏览

.net - 调试时使用 MiniDumpWriteDump() Win32 API 时出现异常

我在 C++/CLI 中从进程“1”生成进程“2”。当两者都在运行时,进程“1”会杀死进程“2”(按设计)。我的目标是在杀死它之前产生一个“2”的迷你转储。

这是我的代码:

当我从命令行启动进程“1”时,没有将其附加到调试器,它正常运行,启动进程“2”然后转储它然后杀死它。

当我在调试器中启动进程“1”时,当我跳过对 的调用时,我会得到 2-3 AccessViolationExceptionMiniDumpWriteDump,但是如果我单击“继续”,一切都会正常并生成转储文件。

到底是怎么回事?我的设计有问题吗?请注意,这是我第一次使用这个 API,我什至不知道我可以在 24 小时前转储这样的文件 ;-) !我将感谢您帮助我提高转储文件的技能。

编辑 1添加了异常信息:

这是我收到的信息:

在 MYProg.exe 中的 0x000007FED860FD31 (mscordacwks.dll) 处引发异常:0xC0000005:访问冲突读取位置 0x0000000000000000。

如果有这个异常的处理程序,程序可以安全地继续。

编辑 2添加了一个片段和一个堆栈跟踪

过程1:“杀手”

过程2:“倾倒”

当我从(AccessViolation)异常对话框中中断堆栈跟踪时:

0 投票
1 回答
356 浏览

c - MiniDumpWriteDump 另一个进程

我正在尝试创建一项服务,目的是监视我公司创建的应用程序。

当应用程序获得无响应状态时,服务必须生成带有MiniDumpWriteDump.

问题是:当使用HANDLE另一个进程时,MiniDumpWriteDump它不起作用。.dmp 文件保持为空。

GetLastError返回 0xD0000008 (3489660936)

该功能是HANDLE通过pid获取:

EnableDebugPriv:

MiniDumpWriteDump这样称呼:

当我更改this->processHandleGetCurrentProcess()工作正常时。

正在设置的句柄:

在此处输入图像描述

这里是GetLastError()

在此处输入图像描述