调试 Linux 转储

本文适用于: ✔️ .NET Core 3.0 SDK 及更高版本

在 Linux 上收集转储

提示

有关转储集合、分析和其他注意事项的常见问题,请参阅转储:常见问题解答

在 Linux 上收集转储的两种建议方法是:

在 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 二进制文件:

  1. libmscordaccore.so
  2. libcoreclr.so
  3. 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 命令来分析转储。

注意

可使用 sudo apt-get install lldb 命令安装 LLDB

在 Windows 上分析转储

还可以使用 Visual StudioWindbgdotnet-dump 工具在 Windows 计算机上分析从 Linux 计算机收集的转储。 Visual Studio 和 Windbg 都可分析本机代码和托管代码,而 dotnet-dump 仅分析托管代码。

注意

通过 Visual Studio version 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 诊断库
  • 若要获取有关在 Linux 或 Mac 上安装 LLDB 的说明,请参阅安装 LLDB
  • 要获取在 Linux 上调试故障转储的教程,请参阅Linux 练习和故障排除