lldb のコマンドのヘルプを確認すると、複数の構文が表示されることがあります。 次の例では、ソースコードの情報を取得する source info コマンドについて3つの構文が表示されます。

$ # macOS High Sierra (10.13)
$ lldb
(lldb) help source info
     Display source line information for the current target process.  Defaults
     to instruction pointer in current stack frame.


Command Options Usage:
  source info [-c <count>] [-s <shlib-name>] [-f <filename>] [-l <linenum>] [-e <linenum>]
  source info [-c <count>] [-s <shlib-name>] [-n <symbol>]
  source info [-c <count>] [-a <address-expression>]

       -a <address-expression> ( --address <address-expression> )
            Lookup the address and display the source information for the
            corresponding file and line.

       -c <count> ( --count <count> )
            The number of line entries to display.

       -e <linenum> ( --end-line <linenum> )
            The line number at which to stop displaying lines.

       -f <filename> ( --file <filename> )
            The file from which to display source.

       -l <linenum> ( --line <linenum> )
            The line number at which to start the displaying lines.

       -n <symbol> ( --name <symbol> )
            The name of a function whose source to display.

       -s <shlib-name> ( --shlib <shlib-name> )
            Look up the source in the given module or shared library (can be
            specified more than once).

上記のオプションのうち -c は3つの構文全てで使えますが、-s は最初の2つの構文でしか使えません。 また、その他のオプションはいずれか1つの構文でしか使えません。 この違いが何によって決まるのかを調べました。


source info コマンドの各オプションは以下の通りそれぞれの構文に割り当てられています。

static OptionDefinition g_source_info_options[] = {
  { LLDB_OPT_SET_ALL,                false, "count",    'c', ... },
  { LLDB_OPT_SET_1 | LLDB_OPT_SET_2, false, "shlib",    's', ... },
  { LLDB_OPT_SET_1,                  false, "file",     'f', ... },
  { LLDB_OPT_SET_1,                  false, "line",     'l', ... },
  { LLDB_OPT_SET_1,                  false, "end-line", 'e', ... },
  { LLDB_OPT_SET_2,                  false, "name",     'n', ... },
  { LLDB_OPT_SET_3,                  false, "address",  'a', ... },

ここから、2番目・3番目の構文が -n-a オプションのために存在していることが分かります。 この視点に立つと、上記3つの構文がそれぞれ

  1. ファイルと行番号を指定してソースコードの情報を表示する
  2. シンボルからソースコードを検索する
  3. アドレスからソースコードを検索する



#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).
(lldb) source info -f sample.cpp
Lines found for file sample.cpp in compilation unit sample.cpp in `sample
[0x0000000100000f60-0x0000000100000f76): /path/to/directory/sample.cpp:4
[0x0000000100000f76-0x0000000100000f7f): /path/to/directory/sample.cpp:5:5
[0x0000000100000f7f-0x0000000100000f8a): /path/to/directory/sample.cpp:6:5
(lldb) source info -n main
Lines found in module `sample
[0x0000000100000f60-0x0000000100000f76): /path/to/directory/sample.cpp:4
[0x0000000100000f76-0x0000000100000f7f): /path/to/directory/sample.cpp:5:5
[0x0000000100000f7f-0x0000000100000f8a): /path/to/directory/sample.cpp:6:5
(lldb) p main
(int (*)()) $0 = 0x0000000100000f60
(lldb) source info -a 0x100000f60
Lines found in module `sample
[0x0000000100000f60-0x0000000100000f76): /path/to/directory/sample.cpp:4


lldb のコマンドは lldb/source/Commands の各 cpp ファイルで実装されています。