本文适用于: ✔️ .NET Core 3.0 SDK 及更高版本
在 Linux 上收集转储
小窍门
有关转储集合、分析和其他注意事项的常见问题,请参阅转储:常见问题解答。
在 Linux 上收集转储的两种建议方法是:
-
dotnet-dump
CLI 工具 - 用于在故障时收集转储的环境变量
在 Linux 上分析转储
收集转储后,可以使用 dotnet-dump
工具和 dotnet-dump analyze
命令对其进行分析。 此分析步骤需要在具有与捕获转储的环境相同的体系结构和 Linux 发行版的计算机上运行。
该工具 dotnet-dump
支持显示有关 .NET 代码的信息,但对于了解 C 和 C++ 等其他语言的代码问题并不有用。
另外,LLDB 可用于分析 Linux 上的转储,这允许分析托管代码和本机代码。 LLDB 使用 SOS 扩展调试托管代码。
dotnet-sos
CLI 工具可用于安装 SOS,其中包含许多用于调试托管代码的有用命令。 为了分析 .NET Core 转储,LLDB 和 SOS 需要从创建转储的环境中使用以下 .NET Core 二进制文件:
- libmscordaccore.so
- libcoreclr.so
- dotnet(用于启动应用的主机)
在大多数情况下,可以使用 dotnet-symbol
工具下载这些二进制文件。 如果无法使用 dotnet-symbol
下载必要的二进制文件(例如,如果使用从源代码生成的专有版本 .NET Core),则可能需要从创建转储的环境中复制上面列出的文件。 如果文件未位于转储文件旁边,则可以使用 LLDB/SOS 命令 setclrpath <path>
设置它们应从中加载的路径,并 setsymbolserver -directory <path>
设置要查找符号文件的路径。
所需文件可用后,就可以通过将 dotnet 主机指定为要调试的可执行文件来将转储加载到 LLDB 中:
lldb --core <dump-file> <host-program>
在上述命令中,<dump-file>
是要分析的转储的路径,<host-program>
是已启动 .NET Core 应用程序的本机程序。 这通常是 dotnet
二进制文件,除非应用程序是独立运行的,在这种情况下,它是没有 .dll 扩展名的应用程序名称。
LLDB 启动时,可能需要使用 setsymbolserver
命令指向正确的符号位置(setsymbolserver -ms
使用Microsoft的符号服务器或 setsymbolserver -directory <path>
指定本地路径)。 若要加载原生符号,请运行 loadsymbols
。 此时,可使用 SOS 命令来分析转储。
注释
可以使用命令安装 LLDB sudo apt-get install lldb
在 Windows 上分析转储
还可以使用 Visual Studio、Windbg 或 dotnet-dump 工具在 Windows 计算机上分析从 Linux 计算机收集的转储。 Visual Studio 和 Windbg 都可以分析本机和托管代码,而 dotnet-dump 仅分析托管代码。
注释
Visual Studio 版本 16.8 及更高版本允许打开和分析在 .NET Core 3.1.7 或更高版本上生成的 Linux 转储 。
- Visual Studio - 请参阅 Visual Studio 转储调试指南。
- Windbg - 可以使用调试 Windows 用户模式转储时所用的同一说明在 windbg 上调试 Linux 转储。 对从 Linux x64 或 Arm64 环境收集的转储使用 x64 版本的 windbg,对从 Linux x86 环境收集的转储使用 x86 版本的 windbg。
- dotnet-dump - 使用 dotnet-dump analyze 命令查看转储。 对从 Linux x64 或 Arm64 环境收集的转储使用 x64 版本的 dotnet-dump,对从 Linux x86 环境收集的转储使用 x86 版本的 dotnet-dump。
另请参阅
- 有关安装 SOS 扩展的更多详细信息,请参阅 dotnet-sos。
- 有关安装和使用符号下载工具的更多详细信息,请参阅 dotnet-symbol。
- 有关调试的更多详细信息,请参阅 .NET Core 诊断存储库,包括有用的常见问题解答。
- 安装 LLDB 来了解在 Linux 或 Mac 上安装 LLDB 的说明。
- 要获取在 Linux 上调试故障转储的教程,请参阅Linux 练习和故障排除。