2013-07-29 9 views
7

私の実際の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" 

答えて

4

gdbのコマンド言語には、コマンドの処理中にエラーを無視する手段がありません。

gdbがPython拡張機能でビルドされていれば、これは簡単に実行できます。 「ignore-errors」スクリプトを検索します。それによって、次のことができます。

(GDB)を無視 - エラープリントは* fooの

...と印刷から任意のエラーが示されますが、スクリプトの残りの部分を中止しないであろう。

+0

ありがとうございました。私は 'Undefinedコマンド:ignore-errors 'を取得して以来' ignore-errors'を利用していませんでしたが、同様のコマンドを作成して作業しました。 –

+0

ええ、あなたはそれを検索しなければなりませんでした。 http://sourceware.org/ml/gdb/2010-06/msg00100.html –

+0

私に説明しましょう。私のサーバ上のgdbではignore-errors.pyがありますが、使用方法はまだ分かりません。単に 'ignore-errors print p'と入力するだけで動作しません。それにもかかわらず、私はignore-errors.pyでこのアイデアを利用し、自分自身の 'my_ignore_errors'を作成しました。更新された質問でそれを見ることができます。 –

0

私は実行がポインタに依存しているので、それが可能だとは思いません。しかし、あなたができることは、あなたがそのエラーに遭遇したときにポインタに新しい値を割り当てることです。 set yourPointer = <another object of the same type>。プログラムは、逆参照された値を使用して処理を進めることができます。

1

また、これを行うことができます。

gdb a.out < analyze.v2.gdb 

これは、エラーが発生した場合でも、ラインによってanalyze.v2.gdbラインでコマンドを実行します。

1

何らかのエラーが発生した場合にだけ終了する場合は、あなたが使用することができ-batch gdb option:バッチ・モードで

ラン。コマンド「-x」(および初期化ファイルからのすべてのコマンド、 '-n'で禁止されていない場合は )から指定されたすべてのコマンド ファイルを処理した後、ステータス0で終了します。コマンドファイルでGDBコマンドを実行中にエラー が発生した場合は、0以外のステータスで終了します。 [...]

関連する問題