LLDB telepítése és használata Linuxon

Az LLDB egy hatékony, nyílt forráskódú hibakereső, amely az LLVM-projekt része. A .NET-alkalmazások Linuxon történő hibakeresésekor az LLDB és a .NET hibakereső bővítmények használatával megvizsgálhatja a felügyelt alkalmazás állapotát. Az LLDB képes a memóriadump-okkal és az élő folyamatokkal is dolgozni.

Felszerel

AZ LLDB telepítése

A .NET hibakereső bővítményei legalább LLDB 3.9-es verziót igényelnek, de a 10.0-s vagy újabb verzió használata ajánlott. A következő szakaszok útmutatást nyújtanak az LLDB népszerű Linux-disztribúciókon való telepítéséhez.

AzureLinux 2.0 és újabb verziók

Az LLDB-csomagok telepítése:

    sudo tdnf install lldb

Az LLDB indítása:

    lldb

Ubuntu 20.04 és újabb verziók

Az LLDB-csomagok telepítése:

    sudo apt-get update
    sudo apt-get install lldb

Az LLDB indítása:

    lldb

Alpine 3.9 és újabb verziók

Az LLDB-csomagok telepítése:

    apk update
    apk add lldb py3-lldb

Az LLDB indítása:

    lldb

Debian 9 és újabb

Az LLDB-csomagok telepítése:

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

Az LLDB indítása:

    lldb-3.9

Fedora 29 és újabb

Az LLDB-csomagok telepítése:

    sudo dnf install lldb python2-lldb

Az LLDB indítása:

    lldb

RHEL 7.5 és újabb

Lásd: LLDB a RedHat webhelyén.

A .NET hibakereső bővítményeinek telepítése

Telepítse a .NET hibakereső bővítményeket a dotnet-debugger-extensions telepítési eszközzel. A telepítő létrehoz egy .lldbinit fájlt a kezdőkönyvtárban, amely automatikusan betölti a bővítményeket az LLDB indításakor.

Megjegyzés

A hibakereső bővítmények verziójának nem kell megegyeznie a .NET-futtatókörnyezet verziójával. Javasoljuk, hogy a legújabb bővítményverziót használja.

Megjegyzés

A dotnet-debugger-extensions helyett a dotnet-sos telepítése is működik, de csak a bővítményparancsok egy részhalmazát telepíti.

Az LLDB használatának első lépései

Ez a példa azt mutatja be, hogyan csatlakozzon az LLDB használatával a számítógépen futó, már meglévő .NET-alkalmazáshoz (dotnet webapp.dll).

  1. ps A paranccsal megkeresheti a hibakeresésre használni kívánt .NET-alkalmazás folyamatazonosítóját (PID).

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

    Ebben az esetben a hibakereséshez használt .NET-alkalmazás PID-címe 229233.

  2. Futtassa az LLDB-t, és csatlakozzon a folyamathoz.

    Indítsa el az LLDB-t a megfelelő parancs használatával a disztribúcióhoz (amelyet korábban az LLDB telepítése szakaszban láthat). Ez gyakran csak lldb, de egyes disztribúciókhoz egy verziószámra van szükség a névben, például 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. A (lldb) prompt jelzésnél futtassa a folyamatcsatoló parancsot.

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

    A hibakereső most már csatlakoztatva van, és a folyamat állapotának vizsgálatához használhatja a beépített LLDB-parancsokat és a .NET hibakereső bővítményparancsokat is.

    Megjegyzés

    Ha az LLDB ezt írja ki: "hiba: a csatolódás sikertelen: A művelet nem engedélyezett", ez azt jelenti, hogy nincs elegendő jogosultsága a hibakereséshez. A probléma megoldásának legmegbízhatóbb módja az LLDB-ből való kilépés és a sudo használatával történő újraindítás. Ha az emelt szintű LLDB nem futtatja automatikusan a normál .lldbinit szkriptet, ezt explicit módon teheti meg a --source parancssor argumentumával: sudo lldb --source ~/.lldbinit.

  4. Példaparancs futtatása

    A clrstack parancs megjeleníti a .NET-kód veremkivonatát a jelenleg kijelölt szálon.

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

Következő lépések

A .NET-alkalmazások LLDB-vel való hibakeresésekor elérhető parancsokról a .NET hibakereső bővítményeinek és az LLDB-nek a dokumentációjában talál további információt.

Lásd még

  • LLDB további információkért az LLDB hibakeresőről.
  • .NET-hibakereső bővítmények az elérhető bővítményparancsok hivatkozásához.
  • dotnet-symbol a szimbólumletöltő eszköz telepítésével és használatával kapcsolatos további részletekért.