在 Linux 上安装和使用 LLDB

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)。

  1. 使用 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。

  2. 运行 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)
    
  3. (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

  4. 运行示例命令

    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