Partilhar via


Instalar e usar LLDB no Linux

LLDB é um poderoso depurador de código aberto que faz parte do projeto LLVM. Ao depurar aplicativos .NET no Linux, você pode usar LLDB com as extensões do depurador .NET para inspecionar o estado do aplicativo gerenciado. O LLDB pode trabalhar com dumps e processos dinâmicos.

Instalar

Instalar LLDB

As extensões do depurador .NET requerem pelo menos LLDB 3.9, mas a versão 10.0 ou posterior é recomendada. As seções a seguir fornecem instruções para instalar o LLDB em distribuições Linux populares.

AzureLinux 2.0 e posterior

Para instalar os pacotes LLDB:

    sudo tdnf install lldb

Para iniciar o LLDB:

    lldb

Ubuntu 20.04 e posterior

Para instalar os pacotes LLDB:

    sudo apt-get update
    sudo apt-get install lldb

Para iniciar o LLDB:

    lldb

Alpine 3.9 e versões posteriores

Para instalar os pacotes LLDB:

    apk update
    apk add lldb py3-lldb

Para iniciar o LLDB:

    lldb

Debian 9 e posterior

Para instalar os pacotes LLDB:

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

Para iniciar o LLDB:

    lldb-3.9

Fedora 29 e posterior

Para instalar os pacotes LLDB:

    sudo dnf install lldb python2-lldb

Para iniciar o LLDB:

    lldb

RHEL 7.5 e posterior

Veja LLDB no site da RedHat.

Instalar as extensões do depurador .NET

Instale as extensões do depurador .NET usando a ferramenta dotnet-debugger-extensions install. O instalador cria um arquivo .lldbinit em seu diretório inicial que carrega automaticamente as extensões quando você inicia o LLDB.

Observação

A versão das extensões do depurador não precisa corresponder à versão do runtime do .NET. Recomendamos o uso da versão de extensão mais recente.

Observação

A instalação com dotnet-sos em vez de dotnet-debugger-extensions também funciona, mas instala apenas um subconjunto dos comandos de extensão.

Introdução ao LLDB

Este exemplo mostra o uso do LLDB para anexar a um aplicativo .NET pré-existente (dotnet webapp.dll) que está sendo executado na máquina.

  1. Use o comando ps para localizar a ID do processo (PID) do aplicativo .NET que você deseja depurar.

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

    Nesse caso, o PID da aplicação .NET para depuração é 229233.

  2. Execute LLDB e anexe ao processo.

    Inicie o LLDB usando o comando apropriado para sua distribuição (mostrado anteriormente na seção Install LLDB). Muitas vezes isso é apenas lldb, mas algumas distros exigem um número de versão no nome, como 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. No prompt de (lldb), execute o comando process attach (anexar 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 ...
    

    O depurador agora está anexado e você pode usar comandos LLDB internos e comandos de extensão do depurador .NET para inspecionar o estado do processo.

    Observação

    Se as saídas LLDB 'error: attach failed: Operation not permitted', isso significa que você não tem privilégios suficientes para depurar. A maneira mais confiável de resolver isso é sair do LLDB e reiniciar usando sudo. Quando o LLDB elevado não executa automaticamente o script .lldbinit normal, você pode fazê-lo explicitamente usando o argumento --source na linha de comando: sudo lldb --source ~/.lldbinit.

  4. Executar um comando de exemplo

    O comando clrstack exibe o rastreamento de pilha para o código .NET no thread selecionado no momento.

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

Próximos passos

Para saber mais sobre os comandos disponíveis ao depurar aplicativos .NET com LLDB, consulte a documentação do extensões do depurador .NET e LLDB.

Ver também

  • LLDB para obter mais informações sobre o depurador LLDB.
  • extensões do depurador .NET para referência dos comandos de extensão disponíveis.
  • dotnet-symbol para mais detalhes sobre como instalar e usar a ferramenta de download de símbolos.