我应该使用(未记录的?)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 年前)时它们是准确的。
所以,与你的问题无关。
我目前正在寻找使用 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 位安全代码的尝试?
MINIDUMP_EXCEPTION_INFORMATION64 不起作用,该函数总是需要你传递一个 MINIDUMP_EXCEPTION_INFORMATION*.
它表示相同的信息,但它在转储文件中的记录方式本身。它需要根据您传递的信息进行转换,不能将指针存储在文件中。需要展平,ULONG64 ExceptionRecord成员指定了MINIDUMP_EXCEPTION记录在文件中的偏移量。 ULONG64 ContextRecord 成员指定存储 CONTEXT 记录的文件中的偏移量。
转储文件格式没有正式记录,只是非正式地来自此类声明。我上次玩这个(~2 年前)时它们是准确的。
所以,与你的问题无关。