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.
Syntax:
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つの構文がそれぞれ
- ファイルと行番号を指定してソースコードの情報を表示する
- シンボルからソースコードを検索する
- アドレスからソースコードを検索する
ためのコマンドであることが分かります。
使用例
#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 ファイルで実装されています。
https://github.com/llvm-mirror/lldb/tree/release_70/source/Commands
参考資料
-
The LLVM Compiler Infrastructure
https://llvm.org/ -
LLDB’s Architecture
https://lldb.llvm.org/architecture/index.html -
lldb で使えるコマンド一覧
https://yokaze.github.io/2018/01/06/