| LLDB | |
|---|---|
| 開発者 | LLVM 開発者グループ |
| 安定版リリース | |
| 書かれた | C++ |
| オペレーティング·システム | macOS i386 および x86-64、Linux、FreeBSD、NetBSD、Windows |
| タイプ | デバッガ |
| ライセンス | UIUC(BSDスタイル)Apacheライセンス2.0(LLVM例外付き)(v9.0.0以降)[ 2 ] |
| Webサイト | lldb |
| リポジトリ | |
LLDBデバッガ(LLDB)は、LLVMプロジェクトのコンポーネントとしてChris Lattnerによって作成されたデバッガです。LLDBは、Clang式パーサやLLVM逆アセンブラなど、LLVMの既存ライブラリを広範に利用する再利用可能なコンポーネントセットとして構築されています。LLDBは、BSDスタイルの許容ソフトウェアライセンスであるイリノイ大学/NCSAオープンソースライセンス[3]に基づく無料のオープンソースソフトウェアです。バージョン9.0.0以降、 LLVM例外を含むApacheライセンス2.0に再ライセンスされました。[ 2 ]
現在の状態
LLDBは、 C、Objective-C、C++で書かれたプログラムのデバッグをサポートします。Swiftコミュニティは、 Swift言語のサポートを追加したバージョンをメンテナンスしています。Free PascalとLazarus IDEは、LLDBを独自のFpDebugエンジンのバックエンドとして使用できます。
LLDBデバッガはmacOS、Linux、FreeBSD、NetBSD、Windowsで動作することが知られており[ 4 ]、i386、x86-64、ARM命令セットをサポートしています。[ 5 ] LLDBはXcode 5以降のデフォルトのデバッガです。Android StudioもデバッグにLLDBを使用しています。[ 6 ] LLDBはVisual Studio Code、[ 7 ] C++Builder、[ 8 ] Eclipse、[ 9 ] CLionなどの他のIDEからも使用できます。[ 10 ]
| 特徴 | フリー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はプログラムを実行していたプロセスが完了したことを通知し、終了ステータスを出力します。
参照
参考文献
- ^ 「リリース 21.1.8」 . 2025年12月16日. 2025年12月17日閲覧。
- ^ a b LICENSE.TXT , llvm.org , 2019年9月24日取得
- ^「LLVMリリースライセンス」
- ^ 「LLVMプロジェクトブログ」 2015年1月20日。
- ^ a b「LLDBステータス」 。 2022年1月31日閲覧。
- ^ 「アプリをデバッグする」。
- ^ 「Visual Studio Code デバッグ アダプタ プロトコルを実装する「lldb-vscode」という新しいツールを追加します」。
- ^ 「11.3 では、macOS Intel および 32 ビット Android 用の新しい LLDB ベースのデバッガーが導入されました。11.3 では、Delphi および C++ のすべての非 Windows プラットフォーム デバッガーが LLDB アーキテクチャに移行しました。 」
- ^ 「CDT/User/FAQ」。
- ^ 「LLDB CLionブログ」 2024年10月7日。
- ^ 「テクニカルノートTN2151:アプリケーションクラッシュレポートの理解と分析」。ドキュメンテーションアーカイブ。Apple Developer 。 2020年2月13日閲覧。