Visual Studio 2022 如何避免弹出“No symbols found”对话框?
结论
如果对话框是在手动执行 Load Symbols 后接连弹出的,应改用自动符号加载。Visual Studio 会按配置搜索各模块的 PDB;找不到符号的模块保持未加载状态,你可以继续分析其他模块。
手动执行 Load Symbols 时,Visual Studio 会交互式查找符号。微软文档说明,搜索不到符号时,会打开文件定位窗口,让用户指定其他位置。因此,即使配置了符号服务器,手动加载时仍可能出现这种提示。参考:符号加载行为
设置自动搜索符号
- 打开
Tools > Options > Debugging > Symbols。 - 保留并启用自己的符号路径。如果需要加载 Windows 系统 DLL 的符号,勾选
Microsoft Symbol Servers。 - 设置一个可写的本地符号缓存目录,例如
C:\Symbols。 - 在符号搜索偏好中,选择搜索所有未排除模块的选项。不同更新版本的界面文字可能不同,例如
Search for all module symbols unless excluded。 - 确认
advapi32.dll不在排除列表中,保存设置后重新开始 dump 调试。参考:符号位置与加载设置
这些设置不需要修改 C++ 代码:
符号来源:
自己的符号服务器或 PDB 目录
Microsoft Symbol Servers
本地缓存:
C:\Symbols
自动搜索范围:
所有未排除的模块
排除列表:
不包含 advapi32.dll
搜索全部模块可能增加首次加载时间。如果只关注少数模块,也可以在 Debug > Windows > Modules 中对这些模块启用 Always Load Automatically,让它们在下一次调试会话中自动加载。参考:Modules 窗口
不要为了消除提示而直接排除 advapi32.dll。排除后,Visual Studio 就不会自动搜索它的符号,不再符合“能找到就加载”的要求。
为什么找到 DLL 仍然缺少符号
以下路径只能说明本机存在 DLL:
C:\Windows\System32\advapi32.dll
C:\Windows\SysWOW64\advapi32.dll
调试 dump 需要与其中模块的版本和构建相匹配的符号。如果 dump 来自另一台机器,本机的同名 DLL 未必是正确版本;某些 dump 还需要提供匹配的二进制文件。因此,把这两个目录加入搜索路径,并不能保证解决问题。参考:dump 调试所需文件
仍然出现提示时如何判断
打开 Debug > Windows > Modules,找到对应模块,右键选择 Symbol Load Information,查看实际搜索过的位置和失败原因。通过这些信息,可以判断是服务器无法访问、没有对应的 PDB,还是文件不匹配,不必反复手动加载。参考:检查符号加载信息
还需要区分两种界面:
- 手动加载失败后弹出的文件定位窗口:改用自动加载,可以避免反复触发这个窗口。
- dump 调试编辑器中的
No Symbols Found页面:表示当前查看的模块缺少符号,自动加载设置不能保证隐藏这类页面。参考:dump 中的缺失文件提示
缺少实际对话框截图和具体的 Visual Studio 2022 更新版本,目前无法确认是哪一种情况,也无法确认是否有一个适用于所有情况的“缺失符号时不再提示”开关。
备注:内容仅供参考。
