2012年7月6日金曜日

gdbの使い方

http://www.debian.org/doc/manuals/debian-reference/ch11.ja.html
(gdb) thread apply all bt マルチスレッドプログラムの全てのスレッドのバックトレースを取得
(gdb) bt full 関数コールのスタック上に来たパラメーターを取得
(gdb) thread apply all bt full 異常のオプションの組み合わせでバックトレースとパラメーターを取得
(gdb) thread apply all bt full 10 無関係の出力を切り最後の10のコールに関するバックトレースとパラメーターを取得
(gdb) set logging ongdb アウトプットをファイルに書き出す (デフォールトは "gdb.txt")
---------------------------------------------------------------------------------------------------------------------------

http://uguisu.skr.jp/Windows/gdb.html
info stack 関数の呼び出しスタックの一覧を表示
info thread 存在しているスレッドの一覧を表示

詳細を知りたいスレッドは、スレッド番号を選択し、where や up コマンドで確認します。
(gdb) thread(一覧表示)
(gdb) thread 3
(gdb) where / bt
(gdb) up 2

1つのコマンドを複数のスレッドに対して実行するコマンドは
「thread apply [threadno] [all] args」です。

全スレッドの callstack を表示するには次のように入力します。
(gdb) thread apply all info stack


gdb を起動した後に動的に coreファイルを生成。
(gdb) help generate-core-file



core dump を有効化する
$ limit coredumpsize (サイズ)


deadlock した場合の coreファイルの生成方法
core dump を有効化しておき、別 terminal から signal を送って core を吐かせます。
% ps -aux | grep (デバッグしたい実行ファイル)
(実行ファイル の プロセスID を調べる)

% kill -3 (プロセスID)<pid>
「-3」は「-ABRT」でも同じです。


core の利用方法
(gdb) gdb 実行ファイル coreファイル


core dump からの thread backtrace 取得
取得した core を利用し、segfault (or deadlock) 発生時の状況を gdb で解析できます。

% gdb 実行ファイル core.<pid>
...
(gdb) set logging file <ログファイル名>
(gdb) set logging on
(gdb) thread apply all bt → 全スレッド表示
(gdb) set logging off
(gdb) quit



実行中に deadlock してしまった場合
実行中に deadlock してしまった場合、gdb を attach し、backtrace を取る。

% ps auxww | grep 実行ファイル → 実行ファイルの pid を調べる
% gdb 実行ファイル
(gdb) attach <実行ファイル の pid>
...
(gdb) set logging file <ログファイル名>
(gdb) set logging on
(gdb) thread apply all bt
(gdb) set logging off
(gdb) quit




nm コマンドを使う

$ nm -D libuXXX.so
「.so」ファイルの場合には「-D」オプションを付けることでダイナミックシンボルが表示できます。

仮に「シンボルがありません」と表示される場合は、ビルドオプションに「-gが付いている」「strip されていない」などを確認してください

小文字はそのシンボルがローカルであることを意味し、 大文字はそのシンボルがグローバル (外部定義) であることを意味します。

T コードセクション内の定義
D 初期化されたデータセクション
B 初期化されないデータセクション
U 未定義。シンボルはライブラリによって使われているが、ライブラリ内では定義されていない
W weak. 他のライブラリも同じシンボルを定義している場合、その定義によりオーバーライドされる

lddコマンドによる依存ファイル一覧

$ ldd 実行ファイル
プログラムヘッダ構造

$ strace 実行ファイル
システムコールのトレース結果

$ readelf -l 実行ファイル





・コアファイルを出力できる様にするには
 確認&変更:
  >limit
  coredumpsize 0 kbytes
  >limit coredumpsize unlimited
  >limit
  coredumpsize unlimited
 
 デバッグ:
  >gdb myprog core.16171
  (gdb) where



0 件のコメント:

コメントを投稿