调试 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 命令来分析转储。

注释

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

在 Windows 上分析转储

还可以使用 Visual StudioWindbgdotnet-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。

另请参阅