2012-01-31 60 views
1

私は以下の関数を持っています。渡された可変引数の内容に応じて、内部でデバッグを停止したいと思います。私が欲しいもの可変引数関数内のブレークポイントで停止する

int 
my_fprintf (const char *format, ...) 
{ 
    va_list arg_list; 
    ... 
    va_start (arg_list, format); 
    result = vfprintf (stream, indent_str, arg_list); 
    va_end (arg_list); 

    ... 
    return result; 
} 

は、コールがmy_fprintf ("%s", "hello")(たとえばので、ブレークポイント条件が<smth> == "hello"にできるだけ近いだろう)である場合に停止することでブレークポイントを置くことです。

これは可能ですか?

アップデート:GDBは

  • デバッガです。
  • 私は条件付きブレークポイントを設定する方法を知っています、私は知りたいのですが、条件はこの場合にする必要があります。
+1

使用しているデバッガを正確に記述することに関連することがあります。 – KevenK

+0

私のデバッガはgdbです。 –

答えて

1

gdbでも可能です。確認できる変数(次のスニペットにp)が必要です。 pを正常に取得するには、より多くのgooが必要です。つまり、arg2の最初の引数がchar * in reasonであることを確認します。ここでformatには%sが含まれています(ただし、%sは不十分です。 。* sか何か)。

static int my_fprintf(const char *format, ...) 
{ 
     const char *p; 
     va_list arg_list, arg2; 
     bool have_string = false; 

     va_start(arg_list, format); 
     va_copy(arg2, arg_list); 
     for (p = strchr(format, '%'); p != NULL; p = strchr(p+1, '%')) { 
       if (p[1] == '%') 
         continue; 
       if (p[1] != 's') 
         break; 
       have_string = true; 
       break; 
     } 
     if (have_string) 
       p = va_arg(arg2, const char *); 
     result = vfprintf(stream, indent_str, arg_list); 
     va_end(arg_list); 
     return result; 
} 

(gdb) b 1234 if have_string && strstr(p, "hello")==0 

1234をp=va_arg...の行番号で置き換えます。
編集:unshadow pを実行し、ブレーク条件にhave_stringを入れます。

+0

関数の上に宣言されたシャドウイングのp) –

+0

'if(have_string)...' 'else {p =" "}'たとえば、文字列がない場合に対処します。次に、厳密な文字列比較のために 'strcmp'を使います。 それ以外は、魅力的な作品です!ありがとうございました。 –

0

あなたの実装のva_listタイプの勇気を分析する必要があります。例えば。ポインターの配列へのポインターであり、そのうちの1つ(おそらく最初のポインター)が "hello"を指しています。その後、デバッガにこの条件を打ち破るよう教えてください。

2

私は質問/答えには2つの部分があると思う:

  1. 可変部分に渡されたパラメータを参照するには、GDBを取得する方法は?私はそれがこの能力を持っているとは思わないので、プラットフォームに依存する何かをしなければならないでしょう。 This answerはx86_64で動作するはずです。 32ビットの場合、va_listは単なるlong型の配列なので、よりシンプルです。
  2. 条件付きブレークポイントの作成方法は? gdbのconditionコマンド(文書番号here)が役立ちます。
+0

私の質問は実際にパート1についてですが、ありがとうございます。 –

+0

もしx86_64上にあれば、私がリンクした答えはそれを解決するはずです。 – ugoren

+0

はい、それは一般的に働くようですが、残っている唯一の未解決の質問は、ブレークポイント条件での文字列比較です –

関連する問題