LLDB(デバッガー)

LLDB
開発者LLVM 開発者グループ
安定版リリース
21.1.8 [ 1 ] ウィキデータで編集する / 2025年12月16日 (2025年12月16日
書かれたC++
オペレーティング·システムmacOS i386 および x86-64、LinuxFreeBSDNetBSDWindows
タイプデバッガ
ライセンスUIUCBSDスタイルApacheライセンス2.0(LLVM例外付き)(v9.0.0以降)[ 2 ]
Webサイトlldb .llvm .org
リポジトリ

LLDBデバッガLLDB)は、LLVMプロジェクトのコンポーネントとしてChris Lattnerによって作成されたデバッガです。LLDBは、Clang式パーサやLLVM逆アセンブラなど、LLVMの既存ライブラリを広範に利用する再利用可能なコンポーネントセットとして構築されています。LLDBは、BSDスタイルの許容ソフトウェアライセンスであるイリノイ大学/NCSAオープンソースライセンス[3]に基づく無料のオープンソースソフトウェアですバージョン9.0.0以降 LLVM例外含むApacheライセンス2.0ライセンスされました。[ 2 ]

現在の状態

LLDBは、 CObjective-CC++で書かれたプログラムのデバッグをサポートします。Swiftコミュニティは、 Swift言語のサポートを追加したバージョンをメンテナンスしています。Free PascalLazarus IDEは、LLDBを独自のFpDebugエンジンのバックエンドとして使用できます。

LLDBデバッガはmacOSLinuxFreeBSDNetBSDWindowsで動作することが知られており[ 4 ]i386x86-64ARM命令セットをサポートしています。[ 5 ] LLDBはXcode 5以降のデフォルトのデバッガです。Android StudioもデバッグにLLDBを使用しています。[ 6 ] LLDBはVisual Studio Code[ 7 ] C++Builder[ 8 ] Eclipse[ 9 ] CLionなどの他のIDEからも使用できます。[ 10 ]

特徴マトリックス[ 5 ]
特徴フリーBSDリナックスmacOSネットBSDウィンドウズ
バックトレースはいはいはいはいはい
ブレークポイントはいはいはいはいはい
C++11はいはいはいはい?
コマンドラインlldb ツールはいはいはいはいはい
コアファイルのデバッグはいはいはいはいはい
デバッグサーバー(リモートデバッグ)はいはいはいはいいいえ
分解はいはいはいはいはい
式の評価いくつかのバグはあるものの動作するいくつかのバグはあるものの動作するはいいくつかのバグはあるものの動作するいくつかのバグはあるものの動作する
JITデバッグ?シンボリックデバッグのみ未テスト進行中いいえ
Objective-C 2.0:?該当なしはい?該当なし

コマンドの例

lldb program「プログラム」をデバッグする(シェルから)
runロードしたプログラムを実行する
break set -n main関数「main」の先頭にブレークポイントを設定します。
bt バックトレース(プログラムがクラッシュした場合)
register readすべてのレジスタをダンプする
di -n main「main」関数を逆アセンブルする

セッションの例

Cで書かれた次の誤ったプログラムを考えてみます。

#include <stdio.h>int main ( void ) { char msg = "Hello, world! \n " ; printf ( "%s" , msg );0を返す; }

macOSのclangコンパイラでは、上記のコードを フラグを使ってコンパイルすることで、生成されたバイナリ(ソースコードを含む)に適切なデバッグ情報を含めることができ、LLDB を使った検査が容易になります。上記のコードを含むファイルの名前が だとすると、コンパイルコマンドは次のようになります。 -gtest.c

$ clang -Wno-error = int-conversion -g test.c -o test

これでバイナリを実行できるようになりました。

$ ./test セグメンテーション違反

サンプル コードを実行するとセグメンテーション エラーが発生するため、lldb を使用して問題を検査できます。

$ lldb test (lldb) target create "test"現在の実行可能ファイルは 'test' (x86_64) に設定されています。(lldb)実行プロセス 70716 を起動しました: '/Users/wikipedia/test' (x86_64)プロセス 70716 が停止しました* スレッド #1、キュー = 'com.apple.main-thread'、停止理由 = EXC_BAD_ACCESS (コード = 1、アドレス = 0xffffff90) フレーム #0: 0x00007fff6c7c46f2 libsystem_platform.dylib`_platform_strlen + 18 libsystem_platform.dylib`_platform_strlen: -> 0x7fff6c7c46f2 <+18>: pcmpeqb xmm0, xmmword ptr [rdi]  0x7fff6c7c46f6 <+22>: pmovmskb esi, xmm0  0x7fff6c7c46fa <+26>: and rcx, 0xf  0x7fff6c7c46fe <+30>: または rax、-0x1ターゲット 0: (テスト) 停止しました。

問題は関数を呼び出すときに発生しますが、バックトレースstrlenを実行して、問題の原因となっているコード行を正確に特定できます。

(lldb) bt * スレッド #1、キュー = 'com.apple.main-thread'、停止理由 = EXC_BAD_ACCESS (コード = 1、アドレス = 0xffffff90)  * フレーム #0: 0x00007fff6c7c46f2 libsystem_platform.dylib`_platform_strlen + 18 フレーム #1: 0x00007fff6c66b16a libsystem_c.dylib`__vfprintf + 8812 フレーム #2: 0x00007fff6c6911c3 libsystem_c.dylib`__v2printf + 475 フレーム #3: 0x00007fff6c668e22 libsystem_c.dylib`vfprintf_l + 54 フレーム #4: 0x00007fff6c666f72 libsystem_c.dylib`printf + 174 フレーム #5: 0x0000000100000f6d test`main at test.c:5:2 フレーム #6: 0x00007fff6c5dc3d5 libdyld.dylib`start + 1 (lldb)ソースリスト 3 int main(void) {  4 char msg = "Hello, world!\n";  5 printf("%s", msg);  6 return 0;  7 }

で始まる行からframe #5、LLDB はエラーが の 5 行目にあることを示していますtest.c。 を実行するとsource list、これが の呼び出しを指していることがわかります。バックトレースのprintf例外コードによると、 は無効なポインタを逆参照することで、アクセスできないメモリ領域から読み取ろうとしています。 [ 11 ]ソースコードに戻ると、変数は型ですが、文字ではなく文字列が格納されていることがわかります。この問題を修正するには、演算子を追加して、が の文字列へのポインタであることを示すようにコードを変更します。 EXC_BAD_ACCESSstrlenmsgcharmsgchars*

#include <stdio.h>int main ( void ) { char * msg = "Hello, world! \n " ; printf ( "%s" , msg );0を返す; }

実行ファイルを再コンパイルして再度実行すると、LLDB は正しい結果を返すようになりました。

(lldb) target create "test"現在の実行ファイルは 'test' (x86_64) に設定されています。(lldb) runプロセス 93319 が起動されました: '/Users/wikipedia/test' (x86_64) Hello, world!プロセス 93319 はステータス = 0 (0x00000000) で終了しました(lldb)

LLDBはプログラムを実行し、出力をprintf画面に表示します。プログラムが正常に終了すると、LLDBはプログラムを実行していたプロセスが完了したことを通知し、終了ステータスを出力します。

参照

参考文献