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 コマンドで確認できます。

参考資料