在Ubuntu 16.04用lldb打开.NET Core 2.0转储文件,需匹配哪个版本?
解决Ubuntu 16.04上分析.NET Core 2.0转储文件的lldb适配与libmscordaccore.so加载问题
针对你在Ubuntu 16.04上分析.NET Core 2.0转储文件时遇到的lldb版本不匹配、libmscordaccore.so加载失败的问题,我整理了一套针对性的解决步骤,帮你搞定这个麻烦:
1. 精准定位SOS插件依赖的lldb版本
你用ldd没查到lldb依赖,是因为旧版本的SOS插件可能用了动态符号绑定,换个方式查:
- 执行以下命令查看libsosplugin.so的lldb符号依赖:
objdump -T /usr/share/dotnet/shared/Microsoft.NETCore.App/2.0.*/libsosplugin.so | grep lldb - 或者直接尝试加载插件看报错,启动任意lldb版本后执行:
报错信息里会明确告诉你需要哪个版本的lldb(比如.NET Core 2.0的SOS通常适配lldb 3.8)。plugin load /usr/share/dotnet/shared/Microsoft.NETCore.App/2.0.*/libsosplugin.so
2. 安装匹配的lldb版本
Ubuntu 16.04的官方源里有lldb 3.8,直接安装即可:
sudo apt-get update && sudo apt-get install lldb-3.8
注意:一定要用这个匹配的版本,不要随便用最新版或者其他版本,旧版.NET Core的SOS和lldb绑定非常严格。
3. 确保libmscordaccore.so版本完全匹配
这个文件是.NET Core运行时的调试核心库,必须和生成转储的进程所用的.NET Core 2.0版本完全一致(包括补丁号,比如2.0.8、2.0.9等):
- 先确认本地安装的.NET Core 2.0版本:
dotnet --list-runtimes | grep Microsoft.NETCore.App - 如果转储是从其他机器生成的,去微软归档下载对应版本的.NET Core 2.0运行时包,解压后找到
libmscordaccore.so文件。 - 在lldb里指定库搜索路径,比如你的运行时版本是2.0.8:
lldb-3.8 -c /path/to/your/core.dump (lldb) set solib-search-path /usr/share/dotnet/shared/Microsoft.NETCore.App/2.0.8/
4. 正确加载SOS插件并验证
启动匹配的lldb,加载转储和插件:
lldb-3.8 -c /path/to/your/core.dump (lldb) set env DOTNET_ROOT /usr/share/dotnet (lldb) plugin load /usr/share/dotnet/shared/Microsoft.NETCore.App/2.0.8/libsosplugin.so
然后执行SOS命令验证,比如:
(lldb) clrstack
如果能正常输出调用栈,说明加载成功了。
额外注意事项
- .NET Core 2.0已经停止官方支持,如果你找不到对应版本的运行时,可以去微软的.NET归档仓库获取。
- 务必保证转储文件、lldb版本、.NET Core运行时版本三者的位数一致(都是64位,Ubuntu16.04默认是64位,一般没问题)。
内容的提问来源于stack exchange,提问作者Pavel Tupitsyn
相关产品推荐
相关产品推荐

