适用于: .NET Core 2.1、.NET Core 3.1、.NET 5
本文讨论如何在 Linux 中安装和配置 lldb 调试器,然后打开和分析系统生成的 .NET Core 转储文件。
先决条件
遵循这些故障排除实验室的最低要求是有一个 ASP.NET 核心应用程序来演示低 CPU 和高 CPU 性能问题。
可以在 Internet 上找到多个示例应用程序来实现此目标。 例如,可以下载并设置 Microsoft的简单 Webapi 示例 ,以演示不良行为。 或者,可以将 BuggyAmb ASP.NET Core 应用程序用作示例项目。
如果已遵循本系列的上一部分,则应准备好进行以下设置:
- Nginx 配置为托管两个网站:
- 第一个使用 myfirstwebsite 主机标头 (
http://myfirstwebsite
) 侦听请求,并将请求路由到在端口 5000 上侦听的演示 ASP.NET Core 应用程序。 - 第二个使用 buggyamb 主机标头 (
http://buggyamb
) 侦听请求,并将请求路由到侦听端口 5001 的第二个 ASP.NET 核心示例 buggy 应用程序。
- 第一个使用 myfirstwebsite 主机标头 (
- ASP.NET Core 应用程序应作为服务运行,这些服务会在服务器重启或应用程序停止响应时自动重启。
- Linux 本地防火墙已启用并配置为允许 SSH 和 HTTP 流量。
注意
如果设置尚未准备就绪,请转到“第 2 部分创建并运行 ASP.NET Core 应用”。
若要继续此实验室,必须在 Nginx 后面运行至少一个有问题的 ASP.NET Core Web 应用程序。
本实验室的目标
本文是调试 Linux 上 ASP.NET Core 应用程序的崩溃的两个实验室部件中的第二个。
在 实验室 1.1 重现和解决崩溃问题时,你遵循了重现崩溃问题的步骤,并开始进行故障排除。 你检查了 Nginx 和系统日志,并通过收集和分析内存转储文件继续进行故障排除。 你提取了由 Ubuntu 核心转储文件管理器 apport 生成的崩溃核心转储文件。
在本部分中,你将安装和配置 lldb 调试器以与名为 SOS 的 .NET Core 调试器扩展协同工作,然后在 lldb 中打开转储文件进行分析。
安装 lldb
对于此实验室,必须安装 lldb 3.9 或更高版本。 有关多个 Linux 发行版的说明,请参阅在 Linux 上安装 LLDB。 对于本部分,建议使用 apt
install 命令: sudo apt install lldb
。 在以下屏幕截图中,可以看到 lldb-6.0 随某些依赖项一起安装。
安装完成后,必须配置 lldb,以便在打开核心转储文件时自动加载 SOS。
配置 lldb
在 lldb 中打开核心转储文件之前,请按照以下必需步骤设置符号路径、下载符号,并在打开 lldb 时自动加载 SOS :
安装 dotnet-symbol 工具:
dotnet tool install -g dotnet-symbol
下载目标转储文件的符号:
dotnet-symbol <path_of_dump_file>
安装 SOS:
安装 dotnet-sos 全局工具:
dotnet tool install -g dotnet-sos
安装 SOS:
dotnet-sos install
安装 dotnet-symbol 工具
应已将 dotnet-symbol 工具与上一部分中的 dotnet-dump 和 dotnet-gcdump 工具一起安装。 如果尚未安装这些工具,请在继续操作之前安装这些工具。 为此,请运行 dotnet tool install -g dotnet-symbol
命令以安装 dotnet-symbols。 安装 dotnet-dump 和 dotnet-gcdump(如果尚未执行此操作)。 现在应该已安装三个工具,如以下屏幕截图所示。
下载转储文件的符号
第 1 部分指示如何从 apport 报表中解压缩核心转储文件。 现在是时候下载符号文件了。 如本文所述,符号在高级别运行。 它们充当源代码和二进制文件之间的映射。 调试器使用这些映射在读取调用堆栈时解析函数或方法名称、源行信息或局部变量名称。
你将使用 dotnet-symbol ~/dumps/dotnet/CoreDump -o ~/dumps/symbols --host-only
命令将内存转储文件的符号下载到 ~/dumps/symbols 目录。
如果未添加 --host-only
开关,则下载符号文件时,可能会收到多个“找不到 HTTP 404”错误消息。 可以安全地忽略这些消息。 该 --host-only
参数将仅下载主机程序。 这是 lldb 开始调试 ASP.NET Core 应用程序所需的所有功能。
下一步是安装 SOS 管理的调试扩展。 这将公开运行分析所需的 .NET 调试命令。
安装 SOS
什么是 SOS? 根据官方文档,SOS 是一个调试器扩展,使开发人员能够检查 .NET 应用程序的托管状态,包括 ASP.NET Core 和其他。基于 NET 的应用程序,例如 .NET WPF 和 .NET Windows 窗体。 SOS 是一个跨平台扩展,可由 WinDbg 或 Windows 上的 cdb 调试器以及 Linux 和 macOS 上的 lldb 加载。
若要安装 SOS,必须先安装以下 dotnet-sos 工具:
dotnet tool install -g dotnet-sos
然后,安装 SOS:
dotnet-sos install
以下屏幕截图显示了成功安装的结果。 请注意,dotnet-sos 工具已配置 lldb 调试器,以便在调试器启动时自动加载 SOS 扩展。
你终于准备好使用 lldb 打开转储文件。
在 lldb 中打开核心转储
若要打开核心转储,必须使用 lldb 和以下语法:
lldb --core <dump path> <host-program>
<host-program>
这是启动 .NET Core 应用程序的本机程序。 这通常是 dotnet,除非应用程序是自包含的。 如果这是一个独立应用程序,则此变量是没有 .dll 扩展的应用程序的名称。
假设使用同一文件夹名称关注,上一部分生成的内存转储文件的路径应为 ~/dumps/dotnet/CoreDump。 因此,你将运行 lldb --core ~/dumps/dotnet/CoreDump
以打开该文件。
以下屏幕截图显示了已打开内存转储文件的 lldb 调试器。
设置符号
回想一下,使用目录中的dotnet-symbol
~/dumps/symbols命令下载了符号文件。 应在调试器内运行的第一个命令是将符号服务器路径设置为为符号下载设置的目录:
setsymbolserver -directory ~/dumps/symbols
接下来,加载符号: loadsymbols
运行 lldb 和 SOS 命令
有几个 lldb 命令。 可以使用命令列出这些 help
内容。 在列表中,可以看到 SOS 命令也列在用户定义的命令下。 SOS 是 lldb 的插件。 可以使用同一 help
命令检索插件帮助信息。
注意
你可能希望偶尔清除 lldb 输出。 为此,请按 Ctrl+L。
若要开始,请使用 bt
命令查看线程的本机调用堆栈。 此命令显示活动线程的调用堆栈。
接下来,使用 SOS clrstack
命令检查托管调用堆栈。
不应检索任何信息。 堆栈演练将失败,因为报告堆栈不完整。 这与之前讨论的内容相关:自动生成的核心转储文件无法收集所有托管状态。
还记得发生了异常,这导致进程崩溃。 通过运行 SOS pe
命令来查看异常信息。
如输出中所示,该 pe
命令显示有关当前线程中引发的最后一个异常(如果有)的信息。
在这种情况下,异常消息是 资源暂时不可用。 但是,异常的类型和函数名称不会解析。 相反,它们的值被指示为 未知。
还会显示异常的地址。 可以尝试在命令中 pe
将此地址作为参数传递,以查看更多详细信息是否可用。 然后运行 pe 00007F8244048538
。
注意
在此命令中,将地址替换为转储文件中显示的地址。
即使想要显示堆栈中引用的对象,也会看到相同的未知值。
你可以尝试通过选择堆栈上某个对象的地址并使用命令查看对象 dumpobj <address>
来检索更多信息。
但是,你可能得出结论,此命令也将具有有限的效果,因为它只返回更多的未知消息。 是时候停止使用自动生成的转储文件了。 exit
运行命令以结束 lldb 会话。
总之,系统生成的转储文件提供了一些信息,但仍缺少一些重要信息。 在下一部分中,你将看到捕获故障转储的建议方法。