Linux x64环境下使用Dotnet-Dump如何导出堆?
解决转储文件中捕获堆信息的问题
问题原因
!heap是Windows原生调试命令,用来分析Windows系统堆,但你用dotnet dump collect默认收集的是**.NET Core/ASP.NET Core托管转储**,这类转储仅包含.NET运行时的托管数据,没有完整的Windows进程堆信息,所以Windbg找不到heap导出符号,才会报“No export heap found”错误。
正确捕获堆信息的方法
1. 收集包含原生堆的完整转储
默认的dotnet dump collect只抓取托管数据,要同时获取原生堆信息,需要添加--type full参数:
dotnet dump collect -p 1 --type full
生成的完整转储文件包含进程全部内存数据,之后在Windbg中执行!heap命令就能正常使用。
2. 用.NET专属命令分析托管堆
如果你的目标是分析.NET托管堆,不用依赖!heap,直接用Windbg的SOS扩展命令即可:
- 若SOS未自动加载,手动加载:
.load sos - 查看托管堆整体统计:
!dumpheap -stat - 筛选查看特定类型的对象:
!dumpheap -type <目标类型名> - 追踪对象的引用链:
!gcroot <对象内存地址>
3. AKS容器环境的注意事项
- 微软默认的ASP.NET 7.0.9镜像可能未预装
dotnet-dump工具,需要先在容器内安装:dotnet tool install --global dotnet-dump export PATH="$PATH:/root/.dotnet/tools" - 收集完整转储需要容器有足够磁盘空间,避免转储中途失败。
内容的提问来源于stack exchange,提问作者Leonardo
相关产品推荐
相关产品推荐

