source info
コマンドを使うとデバッグ中のプロセスに関するソースコードの情報を取得することができます。 ここでは、次のソースコードを例として source info
コマンドの動作を解説します。
#include <stdio.h>
int main(void)
{
printf("Hello, World!\n");
return 0;
}
$ # macOS High Sierra (10.13)
$ clang sample.cpp -g -o sample
$ lldb sample
(lldb) target create "sample"
Current executable set to 'sample' (x86_64).
source info
コマンドには3つの構文があります。
1. ファイルを指定してソースコードの情報を表示する -f
-l
-e
source info [-c <count>] [-s <shlib-name>] [-f <filename>] [-l <linenum>] [-e <linenum>]
-f
オプションに続けてソースファイルの名前を指定します。 -l
, -e
オプションで表示する範囲を指定できます。
(lldb) source info -f sample.cpp
Lines found for file sample.cpp in compilation unit sample.cpp in `sample
[0x0000000100000f50-0x0000000100000f66): /path/to/directory/sample.cpp:4
[0x0000000100000f66-0x0000000100000f6f): /path/to/directory/sample.cpp:5:5
[0x0000000100000f6f-0x0000000100000f7a): /path/to/directory/sample.cpp:6:5
(lldb) source info -f sample.cpp -l 5 -e 5
Lines found for file sample.cpp in compilation unit sample.cpp in `sample
[0x0000000100000f66-0x0000000100000f6f): /path/to/directory/sample.cpp:5:5
また、-c
オプションを使い、表示するエントリの数を制限することができます。
(lldb) source info -f sample.cpp -c 2
Lines found for file sample.cpp in compilation unit sample.cpp in `sample
[0x0000000100000f50-0x0000000100000f66): /path/to/directory/sample.cpp:4
[0x0000000100000f66-0x0000000100000f6f): /path/to/directory/sample.cpp:5:5
2. シンボル名を指定してソースコードの情報を表示する -n
source info [-c <count>] [-s <shlib-name>] [-n <symbol>]
-n
オプションに続けて関数の名前を指定します。 -s
オプションで探索するモジュールを限定することができます。
(lldb) source info -n main
Lines found in module `sample
[0x0000000100000f50-0x0000000100000f66): /path/to/directory/sample.cpp:4
[0x0000000100000f66-0x0000000100000f6f): /path/to/directory/sample.cpp:5:5
[0x0000000100000f6f-0x0000000100000f7a): /path/to/directory/sample.cpp:6:5
(lldb) source info -s sample -n main
Lines found in module `sample
[0x0000000100000f50-0x0000000100000f66): /path/to/directory/sample.cpp:4
[0x0000000100000f66-0x0000000100000f6f): /path/to/directory/sample.cpp:5:5
[0x0000000100000f6f-0x0000000100000f7a): /path/to/directory/sample.cpp:6:5
モジュールの一覧は target modules list
コマンドで表示できます。
(lldb) target modules list
[ 0] CE5B2F68-A0F6-3747-8CC0-BEA6BF888731 0x0000000100000000 /path/to/directory/sample
/path/to/directory/sample.dSYM/Contents/Resources/DWARF/sample
...
3. 関数のアドレスを指定してソースコードの情報を表示する -a
source info [-c <count>] [-a <address-expression>]
-a
オプションに続けて関数のアドレスを指定します。
(lldb) p main
sou(int (*)()) $0 = 0x0000000100000f50
(lldb) source info -a 0x100000f50
Lines found in module `sample
[0x0000000100000f50-0x0000000100000f66): /path/to/directory/sample.cpp:4
追加情報
source info
コマンドの構文とオプション一覧は help source info
コマンドで確認できます。
参考資料
-
The LLVM Compiler Infrastructure
https://llvm.org/ -
lldb で使えるコマンド一覧
https://yokaze.github.io/2018/01/06/ -
lldb のコマンドのオプションを読み解く
https://yokaze.github.io/2018/09/25/