アプリケーションのデバッグに数日間苦労しています。私がしたいのは、実行中のプロセス(バッチサイレントを使用)にGDBをアタッチすることですが、クラッシュが発生した場合にはバックグラウンドをテキストファイルに記録します。問題なくデバッガを接続できます(gdb attach pid)。しかし、それを黙って実行していると同時にログを得ることができませんでした。GDBデバッガのアタッチとバックトレースのロギング
ありがとうございます。
アプリケーションのデバッグに数日間苦労しています。私がしたいのは、実行中のプロセス(バッチサイレントを使用)にGDBをアタッチすることですが、クラッシュが発生した場合にはバックグラウンドをテキストファイルに記録します。問題なくデバッガを接続できます(gdb attach pid)。しかし、それを黙って実行していると同時にログを得ることができませんでした。GDBデバッガのアタッチとバックトレースのロギング
ありがとうございます。
しかし
することができていない、あなたは何を試してみましたか?例:
cat t.c
int main() { sleep(5); printf("Aborting\n"); abort(); }
gcc -w -g t.c && ./a.out &
sleep 0.1 && rm -f gdb.txt &&
gdb -q --batch-silent -p "$(pgrep a.out)" -ex 'set logging on' \
-ex continue -ex where -ex quit &&
cat gdb.txt
これが生成します。
[1] 38218 # bash reports background process
Aborting # process done sleeping
# contents of gdb.txt:
Program received signal SIGABRT, Aborted.
#0 0x00007f99aeb50c37 in __GI_raise ([email protected]=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
#1 0x00007f99aeb54028 in __GI_abort() at abort.c:89
#2 0x00000000004005df in main() at t.c:1
# bash reports process termination:
$ -bash: line 98: 38225 Aborted (core dumped) ./a.out
[1]+ Exit 134 gcc -w -g t.c && ./a.out
をあなたが実行中のプロセスにアタッチする必要がありますか?
クラッシュを修正することを目標とする場合は、クラッシュが発生した後にコアダンプを有効にしてコアダンプをデバッグすることができます。実際のプロセスをデバッグするのに比べてコアダンプをデバッグするにはいくつかの制限がありますが、あなたの場合(バックトレースだけを見る)より適切に見えます。コアダンプの実行をデバッグするには:
gdb /path/to/binary /path/to/core