问题标签 [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 投票
5 回答
9592 浏览

c - 是否可以在 Visual Studio 中加载不匹配的符号?

我有一个 Windows minidump(C 代码)和一个相应的 exe 文件。不幸的是,我没有完全匹配的 .pdb 文件,但我确实有 .pdbs 包含刚刚在不同时间构建的完全相同的代码。在 Windbg 中,我可以使用:

告诉它加载任何东西,甚至是不匹配的符号文件。这在这种特定情况下效果很好,并且我能够获得正确的调用堆栈。我只是好奇 Visual Studio 是否有这样的功能。我们在这里使用几乎所有不同版本的 VS,所以它可能在哪个版本中并不重要。谢谢。

0 投票
2 回答
1463 浏览

windbg - 在windbg中进行事后minidump调试——什么原因堆内存?

我在看一个崩溃转储。有些变量在windbg 中看起来完全可见,而其他变量只是说“内存访问错误”。这是什么原因造成的?为什么有些变量具有有意义的值而其他变量只是列出?

似乎所有问题都与以下指针有关。我敢肯定,虽然这些指针中有许多未初始化,但它们中的绝大多数应该指向有效的地方。基于这次崩溃的性质(一个简单的 null ptr 取消引用),我相当肯定整个过程并没有出去吃午饭。

0 投票
1 回答
1520 浏览

windows - 关于内存转储的问题

我目前正在尝试设计一个内存转储工具,可以从另一个进程获取崩溃进程的内存转储。但我对此完全陌生,我想借此机会深入了解内存转储技术。

我想知道为崩溃的进程创建内存转储的工作范例。我现在的疯狂想象如下:

当一个进程崩溃时,操作系统总是会知道(我不知道怎么做,但它应该能够)。然后操作系统启动了某种机制,将崩溃进程的虚拟地址空间的内容复制到所谓的转储文件中。然后我们可以使用 WinDbg 来调试转储文件。

我在想,如果我们可以将崩溃进程的整个虚拟地址空间复制到转储文件中,文件会不会太大?或者我们可以指定转储哪个虚拟地址空间(内核/用户)?

任何人都可以为我提供一些参考,特别是在以下方面:

  1. 什么是内存转储?

  2. 如果有所谓的内核转储和用户模式转储,它们是什么?

  3. 在 Windows 平台上,我需要哪些 API?MiniDumpWriteDump()等函数是否相关?

  4. 当操作系统检测到某个进程崩溃时,是否有任何信号可以监控,以便通知我的转储工具开始转储?

感谢您花时间看我的话。


添加1:

(5) 什么是小型转储?它与内核/用户模式转储有何关系?

(6)当我们谈论内存转储时,我们指的是哪个内存?虚拟内存还是物理内存从这张来看,我认为应该是物理内存。

添加2:

我刚刚找到了关于使用 DbgHelp.dll 中包含的 API 编写 MiniDump的一个很好的参考。我想分享它。如果你能提供其他与此相关的好材料,你介意分享一下吗?谢谢。

顺便说一句:我会根据我的进展不断更新这个线程。任何评论将不胜感激。

0 投票
1 回答
665 浏览

debugging - MiniDumpWriteDump()函数的参数:为什么我们需要一个句柄和一个ID?

我检查了 MSDN 上 MiniDumpWriteDump() 方法的定义如下:

参数:

hProcess [输入]

要为其生成信息的进程的句柄。

进程 ID [in]

要为其生成信息的进程的标识符。

既然进程句柄或进程 ID 都可以识别进程,为什么我们需要同时传递它们呢?我们不能从另一个推断其中一个吗?那么它们之间应该存在一些差异,它们是什么?

谢谢。

0 投票
2 回答
1239 浏览

debugging - 有没有办法知道另一个引发异常的进程中的线程ID?

我正在尝试使用 MiniDumpWriteDump() API 从另一个进程 A 转储崩溃的进程 B。我这样做是因为MSDN这么说:

如果可能的话,应该从一个单独的进程调用 MiniDumpWriteDump,而不是从被转储的目标进程中调用。

MiniDumpWriteDump() 定义如下:

特别是 ExceptionParam 的类型为PMINIDUMP_EXCEPTION_INFORMATION,其定义如下:

现在我想知道如何准备以下2个参数:

ThreadId 抛出异常的线程的标识符。

ExceptionPointers 指向 EXCEPTION_POINTERS 结构的指针,该结构指定了与计算机无关的异常描述和异常发生时的处理器上下文。

在进程 A 中运行时,如何获取进程 B 中的错误线程 ID 和异常指针?

谢谢。

0 投票
1 回答
830 浏览

c# - 致命错误小型转储

我想编写一个实用程序,在发生致命错误时,会创建一个 minidump dmp 文件。我正在使用 clrdump api,这看起来相当简单。

我想知道的是,当出现允许创建此小型转储的致命错误时,我应该阅读什么以确定如何触发事件。

我将用 C# 编写它。

谢谢。

0 投票
1 回答
350 浏览

visual-studio-2005 - 使用 .dll 函数生成一个小型转储,其中应用程序不是由 Visual Studio 创建的

我有一个用 Visual Studio 2005(非托管 C++)生成的 .dll 文件。在 DLL 中的各种函数中,我可以检测错误并调用 DLL 中的另一个函数来生成 minidump(使用 dbghelp.dll)。

当使用 DLL 的应用程序也是 VS2005 生成的程序时,这非常有效。但是,当我使用 National Instrument Measurement Studio/CVI 生成应用程序时(用纯 C 语言,这并不重要),它没有得到 .pdb 文件(惊喜!)。结果,当我用 VS2005 打开生成的 .dmp 文件时,它告诉我应用程序不是通过调试构建的(但它是!)并且显示的堆栈是无用的。

CVI 应用程序成功使用了此 DLL 中的许多 (40+) 其他函数。这似乎表明从非 VS 应用程序成功访问 DLL 函数。

National Instruments 显然可以使用 DrWatson 的完整转储,所以它一定是可能的。

有人知道如何获得使用 .dmp 文件所需的内容吗?

总结一下:没有 .NET,函数访问很好,生成的 minidump 文件似乎不适用于 Visual Studio。

谢谢你的帮助。

0 投票
2 回答
3325 浏览

.net - 当涉及(WPF)本机图像时,如何获得混合模式小型转储的完整堆栈跟踪?

我有一个使用 WPF 的混合模式 C++/CLI 应用程序。我们客户的崩溃作为小型转储报告给我们自己的服务器。

当我尝试使用来自 windbg sos-extension 的 !pe 或 !clrstack 命令调查小型转储时,我经常会从 WPF 程序集中获得不完整的堆栈帧信息,例如

在这种情况下,堆栈跟踪解码也会变得非常慢。

使用 !sym noise 显示了很多来自以下内容的消息

我用了

c:\Windows\System32;SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols

作为windbg符号和图像路径。

据我了解,如果发生崩溃的机器和带有调试器的机器在 Windows 版本、.NET 版本的 SP 方面不同,只会发生在 .NET 本机映像上。我主要看到它用于 WPF 本机图像。

我能做些什么来避免这个问题?

更新我最初的问题:

我忘了提到我在使用不同的 mscordacwks dll 版本时遇到了类似的问题。为了使用 SOS,在调试计算机上需要崩溃计算机上使用的 mscordacwks.dll 版本。所以我开始从不同的Windows和SP组合中收集这个dll的各种版本,并将它们放在我们自己的符号服务器上。当然,这很尴尬,甚至更是如此,因为它们需要按照特殊约定命名(例如 mscordacwks_x86_x86_2.0.50727.4952.dll)。

如果我从下面正确理解 Rick 的回答,我必须对我们引用的 .NET 程序集的本机映像做类似的事情。我已经通过一个示例(WindowsBase.ni.dll)手动尝试了这一点,但我无法轻松地将这个 dll 存储在我们的符号服务器上。symstore 似乎不理解本机图像。来自 symstore 的错误消息是:

所以我尝试将它放入一个额外的目录并将其添加到我的符号或图像路径中,然后 SOS 正确解码了 WindowsBase_ni 帧。

但是这一切看起来像是很多烦人的手动设置工作:获取各种 .NET 版本的所有本机映像(SP 和安全更新呢),手动设置调试器,因为无法使用 symstore,...

这真的是唯一的方法吗?

如果您可以控制客户的环境,这可能不是这样的问题。但对于为大型用户群构建混合模式应用程序的组织来说,这似乎是一场事后调试的噩梦。

0 投票
2 回答
1694 浏览

c++ - 如果我有一个 minidump 文件或异常结构,我如何获得 winqual 使用的“bucket id”?(Windows c++)

SO上有一些相关的问题-但还没有找到答案-

我想生成一个“签名”/bucket id 来向我们的问题跟踪系统报告小型转储/崩溃。由于 MS 已经使用“bucket ids”做到了这一点,我想我可以重新使用他们的 bucket/signature 生成。

我可以从顶级过滤器或过滤器内部的 _EXCEPTION_POINTERS 对象或 _MINIDUMP_EXCEPTION_INFORMATION 结构或小型转储本身获取该 ID 吗?

这是一个 C++ 应用程序。

0 投票
2 回答
1792 浏览

.net - 什么是最小 MINIDUMP_TYPE 设置以转储托管 .net 组件的本机 C++ 进程,以便能够在 windbg 中使用 !clrstack

有托管多个 .net 组件的本机 C++ 应用程序。当出现一些错误时,此应用程序使用 MiniDumpWriteDump 函数创建迷你转储。在这里提问什么是最小集合

应该传递给 MiniDumpWriteDump 以生成小转储文件但能够查看 clr 堆栈)?当然,完整的内存转储会起作用,但如何只获得可承受的最小值?