LLDB 是 LLVM 项目的一部分的强大开源调试器。 在 Linux 上调试 .NET 应用程序时,可以将 LLDB 与 .NET 调试器扩展配合使用 来检查托管应用程序状态。 LLDB 可以处理转储和实时进程。
安装
安装 LLDB
.NET 调试器扩展至少需要 LLDB 3.9,但建议使用版本 10.0 或更高版本。 以下部分提供有关在常用 Linux 分发版上安装 LLDB 的说明。
AzureLinux 2.0 及更高版本
安装 LLDB 包:
sudo tdnf install lldb
启动 LLDB:
lldb
Ubuntu 20.04 及更高版本
安装 LLDB 包:
sudo apt-get update
sudo apt-get install lldb
启动 LLDB:
lldb
Alpine 3.9 及更高版本
安装 LLDB 包:
apk update
apk add lldb py3-lldb
启动 LLDB:
lldb
Debian 9 及更高版本
安装 LLDB 包:
sudo apt-get install lldb-3.9 python-lldb-3.9
启动 LLDB:
lldb-3.9
Fedora 29 及更高版本
安装 LLDB 包:
sudo dnf install lldb python2-lldb
启动 LLDB:
lldb
RHEL 7.5 及更高版本
请参阅 RedHat 网站上的 LLDB。
安装 .NET 调试器扩展
使用 dotnet-debugger-extensions 安装工具安装 .NET 调试器扩展。 安装程序会在主目录中创建一个 .lldbinit
文件,该文件会在启动 LLDB 时自动加载扩展。
注释
调试器扩展的版本不需要与 .NET 运行时的版本匹配。 建议使用最新的扩展版本。
注释
使用 dotnet-sos 进行安装而不使用 dotnet-debugger-extensions 也有效,但仅会安装部分扩展命令。
LLDB 入门
此示例演示如何使用 LLDB 附加到计算机上运行的预先存在的 .NET 应用程序(dotnet webapp.dll
)。
使用
ps
命令查找要调试的 .NET 应用程序的进程 ID(PID)。$ ps -ao pid,cmd PID CMD 697 -bash 229233 dotnet webapp.dll 229696 ps -ao pid,cmd ... other processes omitted for brevity ...
在这种情况下,要调试的 .NET 应用程序的 PID 229233。
运行 LLDB 并附加到进程。
使用分发版的相应命令启动 LLDB(如前面在“安装 LLDB ”部分 所示)。 这通常只是
lldb
,但一些发行版需要名称中的版本号,如lldb-3.9
。$ lldb Current symbol store settings: -> Cache: /home/username/.dotnet/symbolcache -> Server: https://msdl.microsoft.com/download/symbols/ Timeout: 4 RetryCount: 0 (lldb)
在
(lldb)
提示符下,运行进程附加命令。(lldb) process attach --pid 229233 Process 229233 stopped * thread #1, name = 'dotnet', stop reason = signal SIGSTOP frame #0: 0x00007f2ca7c11117 libc.so.6`___lldb_unnamed_symbol3457 + 231 libc.so.6`___lldb_unnamed_symbol3457: -> 0x7f2ca7c11117 <+231>: movl %r12d, %edi 0x7f2ca7c1111a <+234>: movq %rax, %rbx 0x7f2ca7c1111d <+237>: callq 0x7f2ca7c10a60 ; ___lldb_unnamed_symbol3445 0x7f2ca7c11122 <+242>: jmp 0x7f2ca7c11089 ; <+89> thread #2, name = 'dotnet-ust', stop reason = signal SIGSTOP frame #0: 0x00007f2ca7c9e88d libc.so.6`syscall + 29 libc.so.6`syscall: ... more output omitted ...
调试器现已附加,可以使用内置的 LLDB 命令和 .NET 调试器扩展命令来检查进程状态。
注释
如果 LLDB 输出“错误:附加失败:不允许执行该操作”,则意味着你没有足够的权限进行调试。 解决此问题的最可靠方法是退出 LLDB 并使用 sudo 重启。 当权限提升后的 LLDB 不会自动运行正常的 .lldbinit 脚本时,可以在命令行中使用
--source
参数显式执行这个脚本:sudo lldb --source ~/.lldbinit
。运行示例命令
clrstack 命令在当前选定的线程上显示 .NET 代码的堆栈跟踪。
(lldb) clrstack OS Thread Id: 0x497 (1) Child SP IP Call Site 00007FFD0877D260 00007f2ca7c11117 [HelperMethodFrame_1OBJ: 00007ffd0877d260] System.Threading.Monitor.ObjWait(Int32, System.Object) 00007FFD0877D390 00007F2C2864AA0E System.Threading.Monitor.Wait(System.Object, Int32) 00007FFD0877D3A0 00007F2C28654625 System.Threading.ManualResetEventSlim.Wait(Int32, System.Threading.CancellationToken) 00007FFD0877D420 00007F2C286684A8 System.Threading.Tasks.Task.SpinThenBlockingWait(Int32, System.Threading.CancellationToken) 00007FFD0877D480 00007F2C2866832D System.Threading.Tasks.Task.InternalWaitCore(Int32, System.Threading.CancellationToken) 00007FFD0877D4D0 00007F2C286B2508 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task, System.Threading.Tasks.ConfigureAwaitOptions) 00007FFD0877D4F0 00007F2C29281B45 Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.Run(Microsoft.Extensions.Hosting.IHost) 00007FFD0877D510 00007F2C29121A7D Program.<Main>$(System.String[]) [/home/username/app/Program.cs @ 25]
后续步骤
若要详细了解使用 LLDB 调试 .NET 应用程序时可用的命令,请参阅 .NET 调试器扩展 的文档,以及 LLDB。
另请参阅
- 有关 LLDB 调试器的详细信息,请参阅 LLDB。
- .NET 调试器扩展,以引用可用的扩展命令。
- 有关安装和使用符号下载工具的更多详细信息,请参阅 dotnet-symbol。