Почему FormatMessage создает только частичные сообщения для системных ошибок ERROR_SYSTEM_PROCESS_TERMINATED и ERROR_UNHANDLED_EXCEPTION?

Я использовал функцию FormatMessage в Windows API для генерации строк сообщений из кодов системных ошибок. Я заметил, что для некоторых кодов ошибок полное сообщение не создается.

Возьмите этот пример программы в качестве примера:

int main()
{
  wchar_t * buffer = nullptr;
  FormatMessageW(
    FORMAT_MESSAGE_FROM_SYSTEM 
    | FORMAT_MESSAGE_ALLOCATE_BUFFER 
    | FORMAT_MESSAGE_IGNORE_INSERTS, 
    nullptr, 
    ERROR_SYSTEM_PROCESS_TERMINATED,
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
    reinterpret_cast<LPWSTR>(&buffer), 
    0, 
    nullptr);

  std::wcout << buffer << std::endl;
  return 0;
}

Согласно MSDN я должен увидеть следующее:

{Фатальная системная ошибка}
Системный процесс%hs неожиданно завершился со статусом 0x%08x (0x%08x 0x%08x). Система была закрыта.

Тем не менее, в примере программы я увижу:

{Фатальная системная ошибка}
Системный процесс%hs неожиданно завершился со статусом 0x

Я заметил, что ERROR_UNHANDLED_EXCEPTION также не создает полное сообщение (по сравнению со списком в MSDN). Оба ожидаемых сообщения содержат 0x% 08 заполнителей, но сообщение заканчивается после 0x.

Из того, что я вижу, другие сообщения об ошибках появляются, чтобы соответствовать спискам на MSDN (то есть проблема, кажется, ограничена ERROR_UNHANDLED_EXCEPTION а также ERROR_SYSTEM_PROCESS_TERMINATED).


Кредит на engf-010 - вы получите то же самое, если вы используете инструмент поиска ошибок в Visual Studio (Инструменты - Поиск ошибок). Коды ошибок 574 и 591.


Кто-нибудь знает, почему эти сообщения обрезаются?

Есть ли способ получить полное сообщение?

1 ответ

Решение

Сообщения, которые вы упоминаете (ERROR_UNHANDLED_EXCEPTION а также ERROR_SYSTEM_PROCESS_TERMINATED) имеют вставки в стиле printf (%08x). Тем не менее, FormatMessage использует%0 для завершения сообщения.

Я предполагаю, что есть другой путь, где эти сообщения возвращаются системой с уже заполненными заполнителями в стиле printf; эти сообщения в необработанном виде не предназначены для обработки в FormatMessage.

Учитывая, что эти сообщения содержат текст (Fatal System Error) или же (Application Error)Неудивительно, что Windows обрабатывает эти сообщения специально.

Другие вопросы по тегам