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

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

本文关键字:INFORMATION64 结构 创建 转储 进程 64位 EXCEPTION MINIDUMP 记录 我应该      更新时间:2023-10-16

我目前正在处理使用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;

在谷歌上搜索这个新发现的结构,我发现了一个inded将其用于64位构建的地方。这真的很重要吗?还是只是编写64位安全代码的错误尝试?

MINIDUMP_EXCEPTION_INFORMATION64在调用MiniDumpWriteDump()时不起任何作用,该函数始终要求您传递一个MINIDUMS_EXCEPTION_INFORMATION*。

它表示相同的信息,但它在转储文件本身中的记录方式。它需要从您传递的信息中转换,不能在文件中存储指针。它需要展开,ULONG64 ExceptionRecord成员指定存储MINIDUMP_EXCEPTION记录的文件中的偏移量。ULONG64 ContextRecord成员指定存储上下文记录的文件中的偏移量。

转储文件格式没有正式记录,只是从这些声明中非正式地记录下来。他们是准确的,我上次玩这个(大约2年前)。

所以,与你的问题无关。