有没有办法知道另一个抛出异常的进程中的线程ID?

smw*_*dia 6 debugging minidump dump crash-dumps

我想使用MiniDumpWriteDump()API从另一个进程A.我这样做是因为转储崩溃的进程B MSDN这样说:

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

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
);
Run Code Online (Sandbox Code Playgroud)

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

typedef struct _MINIDUMP_EXCEPTION_INFORMATION {
  DWORD               ThreadId;
  PEXCEPTION_POINTERS ExceptionPointers;
  BOOL                ClientPointers;
} MINIDUMP_EXCEPTION_INFORMATION, *PMINIDUMP_EXCEPTION_INFORMATION;
Run Code Online (Sandbox Code Playgroud)

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

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

ExceptionPointers 一个指向EXCEPTION_POINTERS结构指明该异常的计算机独立描述,并在异常时的处理器的上下文.

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

谢谢.

小智 0

要针对特定​​进程名称的给定异常创建自动转储,我的建议是使用 DebugDiag 或 AdPlus。这些是外部(并且免费!)软件,您可以配置它们来执行此操作。

如果你真的想自己写转储,你可以在进程 B 中完成:MSDN 警告你这不是一个好主意,因为像内存不足、堆栈溢出或堆栈损坏(列表并不详尽)等令人讨厌的错误会发生当然会使用内存和堆栈,因此您最终可能根本没有转储(并且会导致非常严重的进程崩溃)。根据我的经验,这种情况非常罕见(我曾经开发过压力很大的分布式 C++ 软件)。对于其他例外,应该没问题。在这种情况下,您可以使用异常转换器(请参阅 _set_se_translator)或向量异常处理程序(请参阅 AddVectoredContinueHandler)或函数 GetExceptionInformation() 来获取 EXCEPTION_RECORD 结构(可能还有其他我不知道的方法)。

在进程 B 发生异常后从进程 A 创建转储意味着您必须复制有关该异常的所有信息,并警告进程 A 它必须转储带有此异常的内容。这将消耗内存和堆栈,因此您将受到与之前解释的相同的限制。

希望这会有所帮助