ファイヤープロジェクト
ソースの表示
2003-11-24T01:06+09:00   matsu
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       }
matsu(C)
Since 2002
Mail to matsu