IDebugSymbols3::GetSymbolTypeIdWide首次调用失败及输出问题咨询
WinDbg扩展IDebugSymbols3::GetSymbolTypeIdWide接口问题解答
1. 阻止接口向命令窗口输出信息
要抑制该接口的命令窗口输出,可临时修改符号选项,禁用符号相关的输出提示。具体操作是在调用GetSymbolTypeIdWide前后,保存并恢复原有符号选项,临时添加SYMOPT_NO_OUTPUT标志:
HRESULT get_symbol_info(const CComPtr<IDebugSymbols3>& pDebugSymbols) { ULONG oldSymOptions = 0; // 保存当前符号选项 pDebugSymbols->GetSymbolOptions(&oldSymOptions); // 开启禁用输出的选项 pDebugSymbols->SetSymbolOptions(oldSymOptions | SYMOPT_NO_OUTPUT); ULONG64 uiMod; ULONG uiStructTypeID; HRESULT hr = pDebugSymbols->GetSymbolTypeIdWide( L"wdf01000!FxObject", &uiStructTypeID, &uiMod); // 恢复原来的符号选项 pDebugSymbols->SetSymbolOptions(oldSymOptions); if(SUCCEEDED(hr)) { // 后续处理逻辑 } return hr; }
SYMOPT_NO_OUTPUT标志会阻止符号引擎向命令窗口输出任何符号加载、查找相关的提示,同时不会影响符号查找的核心逻辑。
2. 首次调用失败、后续调用成功的原因
刚附加内核目标时,WinDbg的符号引擎还未完成目标模块(wdf01000.sys)的符号加载工作。首次调用GetSymbolTypeIdWide时,符号引擎会触发符号加载流程,但此时加载可能还未完成(比如符号文件正在下载、解析),所以接口返回E_FAIL,同时输出符号加载的提示信息。
当再次调用时,目标模块的符号已经加载完成并被符号引擎缓存,此时接口可以直接定位到FxObject的类型ID,因此调用成功且没有输出。
内容的提问来源于stack exchange,提问作者c00000fd
相关产品推荐
相关产品推荐

