如何摆脱与符号文件相关的 warning/error 消息

How to get rid of symbol file related warning/error messages

我正在调试转储文件,使用 Windbg,我经常收到 warning/error 消息,如下所示:

*** 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

但是 warning/error 消息不断到达。

第一次回复后编辑(第二次编辑确认)

我尝试过几次,使用 .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 文件而言:我的电脑上没有这个文件,老实说,我不想搜索每个可能导致符号加载问题的模块。我只想避免提到的 warning/error 消息。

对问题有更多了解后编辑

我还没有提到的一件事是 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 issue? (我在 PYKD issues homepage 上没有看到任何 .outmask 相关问题)

您可以使用 .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 与 [exclusions] 部分

cd windbg installation path

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

outmask 是全局设置

PYKD 设置自己的输出掩码:

 client->GetOutputMask(&oldMask);  
 client->SetOutputMask(DEBUG_OUTPUT_NORMAL|DEBUG_OUTPUT_ERROR|DEBUG_OUTPUT_WARNING|DEBUG_OUTPUT_DEBUGGEE );

到目前为止,我的问题有两个答案:

  • 屏蔽一般Windbg命令输出
  • Outmasking PYKD 命令输出

我不能使用一般的 Windbg outmasking,因为我正在使用 PYKD 命令。
我不能使用 PYKD outmasking,因为我只是启动(数千个)PYKD 命令,这些命令每次都会打开和关闭一个单独的 PYKD 会话,并配置PYKD outmask 会大大降低我的应用程序速度。

因此我决定采用另一种方法:我将确保 PYKD 输出消息的格式非常具体(它将始终包含一个 TAB 字符),而不是不使用错误消息,我将决定只使用 PYKD 消息(包含 TAB 字符的消息)。

我已经测试了这种方法,我可以确认它工作正常。

感谢您的帮助。