Я пишу мини-дамп вне процесса для дочернего процесса. Вот соответствующий фрагмент кода:
CONTEXT thread_context{};
thread_context.ContextFlags = CONTEXT_FULL;
assert(GetThreadContext(child_thread_handle, &thread_context));
EXCEPTION_POINTERS exception_ptrs;
exception_ptrs.ExceptionRecord = &exception_info.ExceptionRecord;
exception_ptrs.ContextRecord = &thread_context;
MINIDUMP_EXCEPTION_INFORMATION minidump_exception_info;
minidump_exception_info.ThreadId = evt.dwThreadId;
minidump_exception_info.ExceptionPointers = &exception_ptrs;
minidump_exception_info.ClientPointers = FALSE;
auto success = MiniDumpWriteDump(child_handle, evt.dwProcessId, file_handle, minidump_flags, &minidump_exception_info, nullptr, nullptr);
Это дает мне информацию об исключении и стек вызовов для каждого потока Кроме нить, которая вызвала исключение. Если я изменю &minidump_exception_info
для nullptr я получаю стек вызовов, но нет информации об исключениях. Есть ли способ получить информацию об исключениях и стек вызовов?
Вызов GetThreadContext с CONTEXT_FULL не захватывает все регистры, необходимые для получения трассировки стека, а наличие контекста не позволяет отладчику использовать другую информацию для получения стека вызовов. Использование CONTEXT_ALL вместо этого дает достаточно информации для воссоздания стека вызовов.
https://msdn.microsoft.com/en-us/magazine/hh580738.aspx была полезной ссылкой в выяснении этого.