ソースの表示
gdbからソースを表示できると嬉しい.GNU Emacsのgdbモード(?)を使用するとすごく便利でカッチョイイのだが,どのマシンにもGNU Emacsがあるとは限らないので,そんなときのためにソースの表示方法を示しておく.
ソースの表示にはlistというコマンドを使用する.以下にいくつかのパターンを示す.
- list
- 前回表示した最後の行を中心にデフォルト行表示する.「前回表示した行」にはステップ実行やbreakポイントで停止したときに表示される行も該当する.デフォルト行数は
set listsize numで設定し,show listsizeで確認する. - list num
- num行目を中心にデフォルト行数表示する.また,
list filename:numとソースファイル名を指定することもできる. - list start_num,end_num
- start_num行目からend_num行目までを表示する.
- list start_num,
- start_num行目からデフォルト行数表示する.
- list ,end_num
- end_num行目で終了するようにデフォルト行数表示する.
- list +num
- 前回表示した行の後続行をnum行表示する.numがない場合,デフォルト行数表示する.
- list -
- 前回表示した行の先行行をnum行表示する.numがない場合,デフォルト行数表示する.
- list function
- functionで指定した関数の先頭を中心にデフォルト行数表示する.複数のファイルに同名の関数がある場合,
list filename:functionというようにソースファイル名を指定することで一意に特定できる.
検索は前方検索と後方検索がある.
- forward-search regexp
- 最後に表示された行の次の行から後方にregexpで指定した正規表現を検索する.コマンドはfoと略せる.
- reverse-search regexp
- 最後に表示された行の前の行から前方にregexpで指定した正規表現を検索する.コマンドはrevと略せる.
実行可能プログラムはコンパイル前のソースファイル名を記憶している.GDBはソースパスからソースファイルを検索して,見つかったソースファイルを利用してソースの情報を表示する.ソースパスは以下で確認できる.
(gdb) show directoriesソースパスを検索してもソースファイルが見つからない場合,実行可能プログラムにソースファイルのディレクトリが記録されていれば,そこを検索する.そこにもなければ,カレントディレクトリを検索する.ソースパスを追加するには,以下のコマンドを実行する.
(gdb) directory ディレクトリ名引数なしで実行すると,ソースパスが空白にリセットされる.複数のディレクトリを指定するには,:で区切る.特別なディレクトリとしてコンパイルディレクトリ$cdirと現在の作業ディレクトリ$cwdがある.以下にソースの格納ディレクトリを変更して,GDBがソースの場所を見つられなくなった場合に,directoryコマンドでソースパスを変更して見つけられるようにした例を示す.
> ls source-path/
a.out source-path.c
> mv source-path source-path2
> gdb source-path2/a.out
(gdb) list
1 source-path.c: No such file or directory.
in source-path.c
(gdb) directory source-path2
Source directories searched: /home/hoge/source-path2:$cdir:$cwd
(gdb) list
1 int
2 main(void)
3 {
4 return 1;
5 }

