我应该使用(未记录的?)MINIDUMP_EXCEPTION_INFORMATION64 结构来创建 64 位进程的转储吗?

Should I use the (undocumented?) MINIDUMP_EXCEPTION_INFORMATION64 structure for creating dumps of 64bit processes?

我目前正在寻找使用 MiniDumpWriteDump 创建转储文件(进程中,咳咳)的问题。该问题仅出现在 64 位版本中。我的代码只是

static LONG WINAPI unhandledExceptionFilter( PEXCEPTION_POINTERS p )
{

    // ...
    MINIDUMP_EXCEPTION_INFORMATION mei;
    mei.ThreadId = ::GetCurrentThreadId();
    mei.ExceptionPointers = p;
    mei.ClientPointers = TRUE;
    if ( !MiniDumpWriteDump( ::GetCurrentProcess(),
                ::GetCurrentProcessId(),
                dumpFile,
                MiniDumpNormal,
                &mei,
                NULL,
                NULL ) ) {
        // ....
    }

无意中,我注意到 Windows SDK 中有一个(似乎没有记录?)MINIDUMP_EXCEPTION_INFORMATION64 结构,它与 MINIDUMP_EXCEPTION_INFORMATION 结构有很大不同:

typedef struct _MINIDUMP_EXCEPTION_INFORMATION {
    DWORD ThreadId;
    PEXCEPTION_POINTERS ExceptionPointers;
    BOOL ClientPointers;
} MINIDUMP_EXCEPTION_INFORMATION, *PMINIDUMP_EXCEPTION_INFORMATION;

typedef struct _MINIDUMP_EXCEPTION_INFORMATION64 {
    DWORD ThreadId;
    ULONG64 ExceptionRecord;
    ULONG64 ContextRecord;
    BOOL ClientPointers;
} MINIDUMP_EXCEPTION_INFORMATION64, *PMINIDUMP_EXCEPTION_INFORMATION64;

谷歌搜索新发现的结构,我发现 one place 确实将其用于 64 位构建。这真的很重要还是只是误导了编写 64 位安全代码的尝试?

当你调用 MiniDumpWriteDump() 时,

MINIDUMP_EXCEPTION_INFORMATION64 不起作用,该函数总是需要你传递一个 MINIDUMP_EXCEPTION_INFORMATION*.

它表示相同的信息,但它在转储文件中的记录方式本身。它需要根据您传递的信息进行转换,不能将指针存储在文件中。需要展平,ULONG64 ExceptionRecord成员指定了MINIDUMP_EXCEPTION记录在文件中的偏移量。 ULONG64 ContextRecord 成员指定存储 CONTEXT 记录的文件中的偏移量。

转储文件格式没有正式记录,只是非正式地来自此类声明。我上次玩这个(~2 年前)时它们是准确的。

所以,与你的问题无关。