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

标签 debugging dump crash-dumps minidump

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

MiniDumpWriteDump should be called from a separate process if at all possible, rather than from within the target process being dumped.



MiniDumpWriteDump() 定义如下:
BOOL WINAPI MiniDumpWriteDump(
  __in  HANDLE hProcess,
  __in  DWORD ProcessId,
  __in  HANDLE hFile,
  __in  MINIDUMP_TYPE DumpType,
  __in  PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
  __in  PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
  __in  PMINIDUMP_CALLBACK_INFORMATION CallbackParam
);

特别是,ExceptionParam 的类型为 PMINIDUMP_EXCEPTION_INFORMATION,其定义如下:
typedef struct _MINIDUMP_EXCEPTION_INFORMATION {
  DWORD               ThreadId;
  PEXCEPTION_POINTERS ExceptionPointers;
  BOOL                ClientPointers;
} MINIDUMP_EXCEPTION_INFORMATION, *PMINIDUMP_EXCEPTION_INFORMATION;

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

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

异常指针
指向 EXCEPTION_POINTERS 结构的指针,指定异常的计算机独立描述和异常发生时的处理器上下文。

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

谢谢。

最佳答案

A pointer to a MINIDUMP_EXCEPTION_INFORMATION structure describing the client exception that caused the minidump to be generated. If the value of this parameter is NULL, no exception information is included in the minidump file.



尽管该参数被标记为 __in而不是 __in_opt你确实可以在这里传递NULL。要首先从目标进程获取该信息,您的进程无论如何都必须对其进行调试。

已知进程 A 如何以及何时进行进程 B 的小型转储?如果 A 确实在调试 B,当 WaitForDebugEvent 返回 EXCEPTION_DEBUG_EVENT 时,信息在信息结构中可用。

如果 A 没有调试 B,那么可能 B 通过某种 IPC 机制告诉 A“嘿,我崩溃了,进行小型转储”。在这种情况下,B 可以自己进行转储,也可以通过相同的 IPC 机制将异常信息传递给 A。尽管如此,这也是有问题的,原因与在崩溃过程中调用 MiniDumpWriteDump 的原因相同,如果事情正在爆炸,事情这可能是你需要告诉 A 的。

另一种可能让 A 为 B 转储的机制是 A 安装为 JIT 调试器,在这种情况下,A 将调试 B,您可以使用调试 API 来获取异常信息。

如果 A 只是定期进行 B 的小型转储,那么不一定会有任何异常(exception),因此在这种情况下您可以只传递 NULL。

请注意,如果您打算做类似的事情
WaitForSingleObject(handleToProcessB, INFINITE);
MiniDumpWriteDump(handleToProcessB, ...)

这是行不通的。操作系统保留了很少的东西,主要是进程的退出代码,而不是虚拟地址空间和您需要进行小型转储的堆栈。

关于debugging - 有没有办法知道另一个引发异常的进程中的线程 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4095130/

相关文章:

asp.net - 在 IIS7 中调试已运行的 ASP.NET 站点

从 MSSQL 导入 MySQL CSV

powershell - 我如何使用 powershell 进行用户转储

MySql 到 PostgreSql 迁移

c++ - 通过 C a #define(或其他代码/编译时解决方案)省略核心转储?

android - 我的 Android cocos2d-x 游戏在某些三星手机上崩溃,但 logcat 未显示崩溃位置

javascript - 如何从 <function scope >'s Closure in Chrome Developer tool' s Watch 面板访问值?

c++ - 在未来版本的 Visual Studio 中,IntelliTrace(tm)(历史调试)是否可用于非托管 C++?

iphone - 需要有关iOS崩溃日志的帮助

c - 为什么 malloc 分配一个已经被使用的地址?