You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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官方的调试扩展:

  1. 启动LLDB后,先加载SOS扩展(针对.NET Core/.NET 5+):
    .load /usr/share/dotnet/shared/Microsoft.NETCore.App/6.0.x/libsosplugin.so
    
    注意替换6.0.x为你实际安装的.NET 6版本号。
  2. 加载后LLDB就能识别.NET栈帧和调试符号。

三、正确设置断点并查看C#代码

  1. 用LLDB启动程序的正确命令(依赖运行时模式):
    lldb dotnet -- ./hello.dll
    
  2. 在LLDB中设置断点:
    bpmd hello.dll services.Hello.GetHello
    
  3. 启动程序:
    process launch
    
  4. 触发断点后,先查看所有栈帧:
    bt
    
    找到带有C#方法名的栈帧(通常标注[Managed to Native Transition]或直接显示目标方法)。
  5. 切换到该栈帧:
    frame select <栈帧编号>
    
  6. 查看对应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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 13:47:26