如何在Visual Studio 2019中调试注入DLL?解决未加载符号问题
调试注入《英雄联盟》LeagueClient.exe的DLL符号未加载问题解决方案
问题详情
在Visual Studio 2019中调试注入到《英雄联盟》LeagueClient.exe的DLL时,断点提示:
"the breakpoint will not be hit, no symbols loaded for this document c++"
附加进程后模块列表中找不到目标DLL,但DLL功能正常,无法进行调试。已执行以下操作:
- 创建名为"Debug"的新配置(源码无默认Debug配置)
- 设置「配置属性->调试->命令」为
D:\Riot Games\League of Legends\LeagueClient.exe - 配置「链接器->调试->生成调试信息」为
Generate Debug Information (/DEBUG) - 设置「链接器->调试->生成程序数据库文件」为
$(OutDir)$(TargetName).pdb - 完成项目构建、启动游戏、注入DLL、附加进程及断点设置
解决步骤
1. 验证DLL与PDB的匹配性
- 确保注入的DLL和对应的
*.pdb文件是同一编译产物,构建后不要修改或替换DLL,直接使用输出目录中的文件。 - 手动核对
$(OutDir)$(TargetName).pdb路径,确认PDB文件存在且路径正确。
2. 手动加载符号
附加到LeagueClient.exe后:
- 打开「调试->窗口->模块」(快捷键
Ctrl+Alt+U) - 右键模块列表空白处,选择「加载符号->浏览符号」
- 定位到DLL对应的PDB文件并加载
提示:如果模块列表看不到你的DLL,大概率是注入工具启用了模块隐藏功能,换用无隐藏的注入方式(比如手动调用
LoadLibrary注入)。
3. 调整编译优化与调试信息设置
- 将Debug配置下「C/C++->优化」设为
禁用优化(/Od),优化后的代码会破坏断点关联,导致符号信息不完整。 - 把「C/C++->常规->调试信息格式」设置为
程序数据库(/Zi),生成完整的调试符号。
4. 优化注入方式
- 避免远程线程注入时使用
CREATE_SUSPENDED参数,或确保注入后恢复进程运行,否则模块可能未被正确加载到进程空间。 - 在DLL的
DllMain函数开头添加DebugBreak()调用,注入后会自动触发调试中断,此时附加调试器可自动加载符号。
5. 配置Visual Studio符号搜索路径
- 打开「工具->选项->调试->符号」,添加你的PDB文件所在目录到符号搜索路径;若需调试系统模块,可勾选「Microsoft符号服务器」。
内容的提问来源于stack exchange,提问作者Saw Khinmaungthoo
相关产品推荐
相关产品推荐

