Condividi tramite


Installare e usare LLDB in Linux

LLDB è un debugger open source potente che fa parte del progetto LLVM. Quando si esegue il debug di applicazioni .NET in Linux, è possibile usare LLDB con le estensioni del debugger .NET per controllare lo stato dell'applicazione gestita. LLDB può usare sia dump che processi in tempo reale.

Installare

Installare LLDB

Le estensioni del debugger .NET richiedono almeno LLDB 3.9, ma è consigliabile usare la versione 10.0 o successiva. Le sezioni seguenti forniscono istruzioni per l'installazione di LLDB nelle distribuzioni Linux più diffuse.

AzureLinux 2.0 e versioni successive

Per installare i pacchetti LLDB:

    sudo tdnf install lldb

Per avviare LLDB:

    lldb

Ubuntu 20.04 e versioni successive

Per installare i pacchetti LLDB:

    sudo apt-get update
    sudo apt-get install lldb

Per avviare LLDB:

    lldb

Alpine 3.9 e versioni successive

Per installare i pacchetti LLDB:

    apk update
    apk add lldb py3-lldb

Per avviare LLDB:

    lldb

Debian 9 e versioni successive

Per installare i pacchetti LLDB:

    sudo apt-get install lldb-3.9 python-lldb-3.9

Per avviare LLDB:

    lldb-3.9

Fedora 29 e versioni successive

Per installare i pacchetti LLDB:

    sudo dnf install lldb python2-lldb

Per avviare LLDB:

    lldb

RHEL 7.5 e versioni successive

Vedere LLDB nel sito Web di RedHat.

Installare le estensioni del debugger .NET

Installare le estensioni del debugger .NET usando lo strumento di installazione dotnet-debugger-extensions . Il programma di installazione crea un .lldbinit file nella home directory che carica automaticamente le estensioni all'avvio di LLDB.

Nota

La versione delle estensioni del debugger non deve corrispondere alla versione del runtime .NET. È consigliabile usare la versione più recente dell'estensione.

Nota

L'installazione con dotnet-sos anziché dotnet-debugger-extensions funziona anche, ma installa solo un subset dei comandi di estensione.

Introduzione a LLDB

Questo esempio illustra l'uso di LLDB per connettersi a un'applicazione .NET preesistente (dotnet webapp.dll) in esecuzione nel computer.

  1. Usare il ps comando per trovare l'ID processo (PID) dell'applicazione .NET di cui si vuole eseguire il debug.

        $ ps -ao pid,cmd
        PID CMD
        697 -bash
        229233 dotnet webapp.dll
        229696 ps -ao pid,cmd
        ... other processes omitted for brevity ...
    

    In questo caso, il PID dell'applicazione .NET di cui eseguire il debug è 229233.

  2. Eseguire LLDB e collegarsi al processo.

    Avviare LLDB usando il comando appropriato per la distribuzione (illustrato in precedenza nella sezione Installa LLDB ). Spesso si tratta solo di lldb, ma alcune distribuzioni richiedono un numero di versione nel nome, come 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) Al prompt eseguire il comando di collegamento del processo.

        (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 ...
    

    Il debugger è ora collegato ed è possibile usare sia i comandi LLDB predefiniti che i comandi di estensione del debugger .NET per controllare lo stato del processo.

    Nota

    Se LLDB restituisce "errore: collegamento non riuscito: operazione non consentita", significa che non si dispone di privilegi sufficienti per il debug. Il modo più affidabile per risolvere questo problema consiste nell'uscire da LLDB e riavviare usando sudo. Quando LLDB con privilegi elevati non eseguirà automaticamente lo script .lldbinit normale, è possibile farlo in modo esplicito usando l'argomento --source nella riga di comando: sudo lldb --source ~/.lldbinit.

  4. Eseguire un comando di esempio

    Il comando clrstack visualizza l'analisi dello stack per il codice .NET nel thread attualmente selezionato.

        (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]
    

Passaggi successivi

Per altre informazioni sui comandi disponibili durante il debug di applicazioni .NET con LLDB, vedere la documentazione per le estensioni del debugger .NET e LLDB.

Vedere anche

  • LLDB per altre informazioni sul debugger LLDB.
  • Estensioni del debugger .NET per un riferimento ai comandi di estensione disponibili.
  • dotnet-symbol per altri dettagli sull'installazione e l'uso dello strumento di download dei simboli.