使用lldb调试.NET Core 6时断点显示汇编,如何切换为C#代码?
解决LLDB调试.NET程序时显示C#代码的问题
一、调整项目编译配置,确保调试符号正确生成
你的PublishSingleFile配置会把程序打包成单文件,这会干扰调试符号的加载,建议先关闭该配置,调试正常后再考虑发布单文件的调试方案。同时调整调试符号相关配置:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net6.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> <SelfContained>false</SelfContained> <!-- 关闭单文件发布,优先保证调试 --> <PublishSingleFile>false</PublishSingleFile> <!-- 使用portable类型的pdb,兼容性更好 --> <DebugType>portable</DebugType> <!-- 强制生成调试符号 --> <DebugSymbols>true</DebugSymbols> <!-- 调试模式下禁用优化,避免代码混淆 --> <Optimize>false</Optimize> </PropertyGroup> </Project>
编译时使用Debug配置(不是Release),确保生成的hello.dll和对应的hello.pdb在同一目录下。
二、加载LLDB的.NET调试扩展(SOS/LLDB-Extension)
LLDB本身不原生支持.NET代码调试,需要加载.NET官方的调试扩展:
- 启动LLDB后,先加载SOS扩展(针对.NET Core/.NET 5+):
注意替换.load /usr/share/dotnet/shared/Microsoft.NETCore.App/6.0.x/libsosplugin.so6.0.x为你实际安装的.NET 6版本号。 - 加载后LLDB就能识别.NET栈帧和调试符号。
三、正确设置断点并查看C#代码
- 用LLDB启动程序的正确命令(依赖运行时模式):
lldb dotnet -- ./hello.dll - 在LLDB中设置断点:
bpmd hello.dll services.Hello.GetHello - 启动程序:
process launch - 触发断点后,先查看所有栈帧:
找到带有C#方法名的栈帧(通常标注bt[Managed to Native Transition]或直接显示目标方法)。 - 切换到该栈帧:
frame select <栈帧编号> - 查看对应C#代码或IL代码:
- 若源码路径正确映射,直接用
list命令查看C#源码 - 或用SOS命令查看IL代码:
sos PrintIL <栈帧编号>
- 若源码路径正确映射,直接用
四、额外注意事项
- 确保LLDB版本(建议12+)与.NET 6版本兼容。
- 若使用SelfContained模式,需添加
<IncludeNativeDebugSymbols>true</IncludeNativeDebugSymbols>到PropertyGroup,确保符号被包含。 - 检查
hello.pdb与hello.dll的匹配性,可通过dotnet build输出确认pdb生成在输出目录。
内容的提问来源于stack exchange,提问作者Shawn Horvatic
相关产品推荐
相关产品推荐

