Как избавиться от предупреждений/сообщений об ошибках, связанных с файлом символов

Я отлаживаю файлы дампа, используя Windbg, и регулярно получаю предупреждения/сообщения об ошибках, например следующие:

*** WARNING: Unable to verify checksum for icuuc58.dll
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for icuuc58.dll - 

Чтобы избежать этого, я уже пытался выполнить всю свою обработку с помощью:

!sym prompts off
!sym quiet

Но предупреждения/сообщения об ошибках продолжают поступать.

Редактировать после первого ответа (подтверждается во втором редактировании)

Я сделал несколько попыток, используя .outmask-6 и .outmask-206, но все они более или менее провалились. Что это значит:

.reload -f => a lot of error/warning messages                      => normal behaviour

.outmask-6 or .outmask-206
.reload -f => no error/warning messages                            => Ok

.outmask-6 or .outmask-206
.reload -f => no error/warning messages                            => Ok
<execution of the whole script> => a lot of error/warning messages => NOK

Я считаю, что есть команды, которые отключают команду .outmask. Можете ли вы подтвердить это и, если да, есть ли такая команда, как:

.outmask-206(global) (which applies for the whole Windbg session)

Что касается файла symsrv.ini: у меня нет этого файла на моем компьютере, и, честно говоря, я предпочитаю не искать каждый модуль, загрузка символов которого может вызвать проблемы. Я бы предпочел просто избегать упомянутых предупреждений/сообщений об ошибках.

Изменить после получения дополнительной информации о проблеме

Одна вещь, которую я еще не упомянул, это использование PYKD: я работаю над heap_stat, скриптом, основанным на PYKD, для выполнения анализа памяти, и я считаю, что проблема здесь, как вы можете видеть в следующем отрывке:

Исходный код скрипта:

dbgCommand(".outmask-206")
...
dprintln("1")
type_info = typeInfo(class_name)
dprintln("2")

Вывод скрипта:

1
*** WARNING: Unable to verify checksum for icuuc58.dll
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for icuuc58.dll - 

На мой взгляд, это означает, что объявление объекта PYKD typeInfo() отключает команду .outmask() Windbg.

Разработчик @PYKD: можете ли вы подтвердить это и, если да, добавить для этого проблему PYKD? (На главной странице PYKD задач я не видел ни одной проблемы, связанной с .outmask)


person Dominique    schedule 25.01.2019    source источник
comment
Изменится ли это, если вы принудительно перезагрузите символ (.reload, .reload /s /f icuuc58.dll и, возможно, даже .reload /f) после команды !sym?   -  person Neitsa    schedule 25.01.2019


Ответы (3)


вы можете подавить сообщения об ошибках/предупреждениях с помощью .outmask-6
или с помощью .outmask-206, чтобы подавить сводку symsrv в конце и предупреждающие сообщения

0:049> .outmask-6
Client 02C95358 mask is 3F1
0:049> .reload /f
Reloading current modules
................................................................
............................................................

будьте осторожны при использовании этого, некоторые важные сообщения об ошибках также могут быть подавлены

если вы имеете в виду, что вам нужно остановить symsrv от попадания на сервер символов ms и потери времени

настроить symsrv.ini с разделом [исключения]

cd windbg installation path

echo [exclusions] >> symsrv.ini
echo ic* >> symsrv.ini

outmask является глобальной настройкой

введите здесь описание изображения

person blabb    schedule 25.01.2019
comment
Спасибо, Блабб, за ответ. Я отредактировал свой вопрос как ответ на ваше предложение. - person Dominique; 28.01.2019
comment
outmask — это параметр для метода IDebugControl::ControlledOutput, это глобальная маска dbgeng!g_LogMask, см. GIF, который я редактировал в - person blabb; 28.01.2019
comment
Еще раз спасибо за быстрый ответ, но тем временем я понял, что проблема, похоже, связана с PYKD. (соответственно я обновил свой вопрос) - person Dominique; 28.01.2019

PYKD устанавливает собственную маску вывода:

 client->GetOutputMask(&oldMask);  
 client->SetOutputMask(DEBUG_OUTPUT_NORMAL|DEBUG_OUTPUT_ERROR|DEBUG_OUTPUT_WARNING|DEBUG_OUTPUT_DEBUGGEE );
person ussrhero    schedule 28.01.2019
comment
Спасибо за ответ, но где я могу найти документацию об этой функции? (что это за переменная client) Я посмотрел справочник по API (githomelab.ru/ pykd/pykd/wikis/API-Reference), но не нашел. - person Dominique; 29.01.2019
comment
Это из исходного кода C. Его нельзя настроить. Мы можем изменить его, но сначала нам нужно понять, почему это было сделано. - person ussrhero; 29.01.2019
comment
попробуйте обновить загрузчик pykd: githomelab.ru/ pykd/pykd-ext/вики/загрузки/ - person ussrhero; 29.01.2019

До сих пор было два ответа на мой вопрос:

  • Маскировка общего вывода команды Windbg
  • Перемаскировка вывода команды PYKD

Я не могу использовать общее Windbg перемаскирование, так как использую PYKD команды.
Я не могу использовать PYKD перемаскирование, так как я просто запускаю (тысячи) PYKD команд, которые каждый раз открываются и закрытие отдельного сеанса PYKD и настройка внешней маски PYKD слишком сильно замедлит работу моего приложения.

Поэтому я решил пойти другим путем: я позабочусь о том, чтобы формат выходных сообщений PYKD был настолько специфичным (он всегда будет содержать символ TAB), что вместо того, чтобы не использовать сообщения об ошибках, я решу только использовать сообщения PYKD (те, которые содержат символы TAB).

Я протестировал этот подход и могу подтвердить, что он работает нормально.

Спасибо за помощь.

person Dominique    schedule 27.02.2019