私の実際のgdbスクリプトは、コアファイルを解析している間に私はポインタを逆参照しようとし、 "ソースファイルでエラーが発生しました:アドレスでメモリにアクセスできません"し、gdbスクリプトが停止します。私が望むのは、停止せずに自分のgdbスクリプトを実行するだけです。出来ますか?エラーがある場合、gdbはコマンドファイル内で停止します。エラーにもかかわらずどのように続行するのですか?
これは私の問題を示すテストプログラムとテスト用のgdbスクリプトです。このような状況では、ポインタはNULL値を持ちますが、実際の状況では、ポインタはnull無効な値を持たないのが好きです。
これはテスト用のCプログラムです:
#include <stdio.h>
struct my_struct {
int v1;
int v2;
};
int main()
{
my_struct *p;
printf("%d %d\n", p->v1, p->v2);
return 0;
}
これはテスト用のgdbスクリプトです:
>cat analyze.gdb
p p->v1
q
そして、これが問題のデモでは、(私はここでGDBから欲しいものをこのエラーを取得することですその後、メッセージやプロセスquit
コマンドを行く):
>gdb -silent a.out ./core.22384 -x ./analyze.gdb
Reading symbols from /a.out...done.
[New Thread 22384]
Core was generated by `./a.out'.
Program terminated with signal 11, Segmentation fault.
#0 0x0000000000400598 in main() at main.cpp:11
11 printf("%d %d\n", p->v1, p->v2);
./analyze.gdb:1: Error in sourced command file:
Cannot access memory at address 0x0
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.80.el6.x86_64
更新
Tomさんに感謝します。これは、この問題を扱うgdbのスクリプトです:
これは、それがどのように動作するかです:
>gdb -silent ./a.out -x ./analyze.v2.gdb -c ./core.15045
Reading symbols from /import/home/a.out...done.
[New Thread 15045]
Core was generated by `./a.out'.
Program terminated with signal 11, Segmentation fault.
#0 0x0000000000400598 in main() at main.cpp:11
11 printf("%d %d\n", p->v1, p->v2);
$1 = "Executing command: p p"
$2 = (my_struct *) 0x0
$3 = "Executing command: p p->v1"
$4 = "ERROR: p p->v1"
$5 = "Executing command: quit"
ありがとうございました。私は 'Undefinedコマンド:ignore-errors 'を取得して以来' ignore-errors'を利用していませんでしたが、同様のコマンドを作成して作業しました。 –
ええ、あなたはそれを検索しなければなりませんでした。 http://sourceware.org/ml/gdb/2010-06/msg00100.html –
私に説明しましょう。私のサーバ上のgdbではignore-errors.pyがありますが、使用方法はまだ分かりません。単に 'ignore-errors print p'と入力するだけで動作しません。それにもかかわらず、私はignore-errors.pyでこのアイデアを利用し、自分自身の 'my_ignore_errors'を作成しました。更新された質問でそれを見ることができます。 –