Дампы, полученные из отчетов об ошибках Windows, обычно имеют бесполезный текущий контекст, установленный в ветке с ошибкой, с глубиной стека в WerpReportFault
. Фактический контекст во время исключения можно получить с помощью .ecxr
, который также устанавливает контекст таким образом, что последующие команды в одном потоке (например, k
) возвращают «правильную» информацию.Получение трассировки стека из хранимого контекста исключений в minidump (аналогично .ecxr; k)
Я создаю инструмент для автоматического анализа дампа, который использует IDebugControl::GetStackTrace
для получения стека дефектной нити. Я могу получить сохраненный контекст исключения, используя IDebugControl4::GetStoredEventInformation
. Если я использую значения EBP/RBP, ESP/RSP, EIP/RIP из сохраненного контекста с GetStackTrace
, я получаю правильный стек. Однако я бы скорее повторил то, что делает команда .ecxr
, установив «правильное» состояние до тех пор, пока нить не будет переключена. Я пробовал использовать IDebugAdvanced::SetThreadContext
, но, похоже, это незаконная операция для целей дампа и с ошибкой 0x8000FFFF.
Я попытался выяснить, что делает .ecxr
, отлаживая экземпляр WinDbg, и он выглядит как .ecxr
реализован в dbgeng!DotEcxr
. Однако, отслеживая его (с wt
), я не смог понять, как он сбрасывает контекст текущего потока. Во всяком случае, он не вызывает каких-либо методов интерфейса отладки COM-клиента и не использует IDebugAdvanced::SetThreadContext
.
Любые предложения о том, как установить контекст потока в файле дампа, будут высоко оценены. В крайнем случае, я всегда могу использовать IDebugControl::Execute
и просто вызывать команду .ecxr
, но я бы предпочел более программный подход.
Awesome. Похоже, именно то, что мне нужно. –