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

.NET 7 AOT应用能否使用SOS工具进行调试?

.NET Core AOT应用的SOS调试解决方案

你的初始理解是否正确?

是的,你的理解完全正确。.NET Core AOT编译时,会将必要的CLR运行时组件静态链接到最终的原生可执行文件中,不会生成独立的coreclr.dll(类Unix系统下为libcoreclr.so)模块,所有运行时逻辑都嵌入在二进制文件内部。

为什么传统SOS命令无法工作?

SOS扩展原本依赖独立的coreclr.dll模块加载运行时符号、解析托管结构,而AOT应用的运行时嵌入在可执行文件中,没有独立模块可供SOS识别,直接加载SOS后自然无法执行常规命令。

调试AOT应用托管结构的可行方法

1. 使用dotnet-dump工具分析

  • 安装对应版本的dotnet-dump:
    dotnet tool install -g dotnet-dump
    
  • 编译AOT应用时必须启用完整调试符号,可通过项目文件添加配置:
    <PropertyGroup>
      <DebugType>full</DebugType>
      <Configuration>Debug</Configuration>
    </PropertyGroup>
    
    或直接用编译参数指定:
    dotnet publish -c Debug -r <目标运行时> -p:PublishAot=true
    
  • 生成应用的dump文件:
    dotnet-dump collect -p <进程ID>
    
  • 分析dump时,必须指定AOT可执行文件路径以加载嵌入的运行时符号:
    dotnet-dump analyze <dump文件路径> --executable <AOT可执行文件路径>
    
  • 进入分析环境后,可执行部分SOS命令查看托管结构,常用命令包括:
    • !dumpheap:查看托管堆的对象分布
    • !dumpobj <对象地址>:查看指定对象的内容
    • !gcroot <对象地址>:查找对象的引用根

2. 使用LLDB/GDB配合.NET扩展(类Unix系统)

  • 安装dotnet-sos扩展并配置调试器:
    dotnet tool install -g dotnet-sos
    sos install
    
  • 用LLDB启动或附加到AOT应用:
    lldb ./<AOT可执行文件>
    
  • 在LLDB中加载SOS后,即可执行!dumpheap、!dumpobj等命令分析托管结构。注意:与JIT编译相关的命令(如!clrstack、!jitdump)无法在AOT应用中使用,因为AOT没有即时编译过程。

关键注意事项

  • 必须使用与AOT应用编译版本完全匹配的.NET SDK调试工具(dotnet-dump、SOS),版本不匹配会导致符号加载失败。
  • 调试时必须确保AOT应用的pdb文件与可执行文件同目录,或能被调试工具正确定位,否则无法解析托管结构的符号信息。

内容的提问来源于stack exchange,提问作者Brian Rasmussen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 08:45:32