次の方法で共有


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 の Web サイトで LLDB を参照してください。

.NET デバッガー拡張機能をインストールする

dotnet-debugger-extensions インストール ツールを使用して.NET デバッガー拡張機能をインストールします。 インストーラーによってホーム ディレクトリに .lldbinit ファイルが作成され、LLDB の起動時に拡張機能が自動的に読み込まれます。

デバッガー拡張機能のバージョンは、.NET ランタイムのバージョンと一致する必要はありません。 最新の拡張機能バージョンを使用することをお勧めします。

dotnet-debugger-extensions ではなく dotnet-sos を使用したインストールも機能しますが、拡張機能コマンドのサブセットのみをインストールします。

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 が 'error: attach failed: Operation not permitted' を出力した場合、デバッグに十分な特権がないことを意味します。 これを解決する最も信頼性の高い方法は、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 を使用すると、シンボルダウンロードツールのインストールと使用の詳細を確認できます。