• ベストアンサー

再帰のある関数で現在と同じレベルでのみ働くブレークポイントを定義する方法は?

Visual Studio 2005を使っております。 再帰を使った関数をデバッグしているのですが、ブレークポイントを指定すると再帰の深いところでブレークしてしまいます。現在実行しているのと同じ再帰のレベルでのみブレークさせるような方法は無いでしょうか? ご存知のかたがいらっしゃったら是非ご教授ください。

質問者が選んだベストアンサー

  • ベストアンサー
  • z64423
  • ベストアンサー率53% (26/49)
回答No.2

あんまりいい方法ではないですが、とりあえず… 再起関数内の最初の式あたり(関数先頭 = { の位置より後)にブレークポイントをセットして、条件として以下を指定します。 !((unsigned int)(eip - 0x40) <= *((unsigned int *)(ebp + 4)) && *((unsigned int *)(ebp + 4)) <= (unsigned int)(eip + 0x40)) EBP がフレームポインタなので、EBP+4 に戻りアドレス(呼び出し元関数)があります。 カッコ内の条件式は、EBP+4 (戻りアドレス)が再起関数内なら ture、他の関数から呼ばれた場合は false として、! で反転して再起関数以外から呼ばれたらブレークする、という意味です。 eip+0x40、eip-0x40 は調整してください。 テストに使ったサンプルを示します。 int recurs(int v) {   if (v++ < 10) {   // ここにブレークポイントをセット     v = recurs(v);   }   return v; } int _tmain(int argc, _TCHAR* argv[]) {   int v = 0;   printf("done : v=%d\n", recurs(v));   return 0; } ※このサンプルだと、(VS2005 Debug で)ビルドした場合に、再起呼び出し時の戻りアドレスは 0x004113F7 なので、ブレーク条件として *((unsigned int *)(ebp + 4)) != 0x004113F7 でも大丈夫だと思います。

moritan2
質問者

補足

ご回答ありがとうございます。 どうも、結論としてはスマートな方法はなくて、いろいろテクニックを使って実現するしかなうということですね。サンプルを参考にさせていただき、いろいろやってみます。 デバッガを設計したひとは、再帰的なプログラムのことは想定外だったのでしょうか? 昔からゲーム木の探索をしていると、絶対に欲しいと思っている機能なのですが。

その他の回答 (1)

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.1

関数のつくりにもよるでしょうが、条件付ブレークポイントで何とかなりませんか。 # [デバッグ]->[ブレークポイント]

moritan2
質問者

補足

ご解答ありがとうございます。 たとえば、再帰レベルが増えるごとに1増えるような引数を再帰の関数に入れておいて、現在のこの変数の値をデバッガで別のグローバル変数にコピーして、引数がこのグローバル変数と等しいならばブレークする、ということですか? プログラムを変更しない方法は全く無いのでしょうか?

関連するQ&A

  • ブレークポイントが設定できない。。。

    VC++6.0、OSはWindows2000 を使用しています。 MFCのダイアログベースのEXEを造っています。 デバッグするためにブレークポイントを設定したのですが、実行時に 止まりません。 デバッグモードでリビルドし、pdbファイルも作成されています。 デバッグ対象のEXEは ~/debug/xxx.exe となっているのも確認しています。 デバッグ実行前に設定すると、赤丸でちゃんとマークされますが、 実行すると以下の文言のメッセージボックスが表示され、設定した ブレークポイントは無効になっています。 「1つ以上のブレークポイントが設定できませんでした。 これらのブレークポイントは無効です。実行プログラムはプログラムの始めで 停止します。」 この後、実行中にブレークポイントを設定しようとしてもできません。 考えられる原因としては何があるでしょうか? 識者の方、ご教授願います。

  • ブレークポイントで停止しない。

    AndroidStudioでブレークポイントを設定しデバッグしたときに ブレークポイントで止まらないというのは、そもそもそのブレークポイントが 実行されていない可能性がありますか?

  • VS2015 ブレークポイントで編集できない

    Windows10 64bit Visual Studio Express2015 for Windows Desktopで、デバッグ中にブレークポイントで止めて編集できない。 エディットコンティニュを有効にしても以下の現象が出ており、デバッグ中の編集ができません。 1.「ツール」-「オプション」-「デバッグ」-「全般」で、「マネージ互換モード」のチェックを入れると、編集時に「マネージ互換モードは、エディットコンティニュをサポートしません。」となり編集できない。 2.「マネージ互換モード」のチェックを外すと、ブレークポイントで止まらなくなる。 プロジェクトのプロパティで、プラットフォームターゲットをx86、x64、AnyCPUのどれにしても同じ現象 どうすれば編集できるようになるのでしょうか?

  • gdbで無名名前空間の関数にブレイクポイント

    Windows+cygwin+emacsでc++のプログラムを勉強しています。デバッガとしてemacs上でgdbを使っているのですが、無名の名前空間にある関数にブレイクポイントを設定する方法がわかりません。例えば、 namespace {  void foo() {    ...  } } int main(void) {  foo(); } のようなfoo.cppファイルをコンパイルしてfoo.exeファイルを作り、それをgdbによりデバッグするとします。そこで、gdb上で b main とすると、mainに入ったところにブレイクポイントが設定されますが、 b foo としても、Function "foo" not defined.と表示されてブレイクポイントが設定されません。無名の名前空間にある関数にはどのように入力してブレイクポイントを設定するのでしょうか。とりあえず、今は行番号によりブレイクポイントを設定しています。ご存じの方がいらっしゃいましたら、ご教授ください。お願いします。

  • 1つ以上のブレークポイントが設定できませんでした。

    Visual Studio C++ 6.0 でプログラミングをしています。 以前まではブレークポイントが普通に使えたのですが、最近ブレークポイントを設定すると 『1つ以上のブレークポイントが設定できませんでした。これらのブレークポイントは無効です。実行プログラムはプログラムの始めで停止します。』 という注意書きが現れ、ブレークポイントが使えません。 ブレークポイント無しでは問題なくビルドでき実行もできます。 恐らく原因として考えられるのが、友人がリリースモードの方が処理が早いとか言って設定をいじり、うまくいかなかったことだと思います。 『構成』『アクティブな構成の設定』を見てもデバックモードになっていました。 どなたかご回答よろしくお願い致します。 OSはXP、openCVを使用しています。

  • ブレークポイントは現在の設定ではヒットしません。

    初めて質問させて頂きます。 VB.net2005を使用しているのですが、 ブレークポイントを設定しても、 「ブレークポイントは現在の設定ではヒットしません。このドキュメントのシンボルが読み込まれません」 と表示され、ブレークポイントが使えません。 ・構成マネージャ→Debug ・クリーン→リビルド ・[元のバージョンと完全に一地するソースファイルを必要とする]をオフ は試したのですが、症状は変わらずです…。 以前は同じプログラムで普通にブレークポイントが使用できていたのですが 久しぶりにコードを編集しようと思ったときに上記のメッセージでデバッグが 出来ません。 「このドキュメントのシンボルが読み込まれません」が何のシンボルか分かれば 対処のヒントが得られると思うのですが…。 何か解決方法はありますでしょうか。

  • Visual Studioで、オブジェクトにどんな値が入っているか見れますか?

    ブレークポイントを設定して、デバッグしても何も表示されません。 どうやって見れますか? Visual Studio 2005です。

  • VC6.0のデバッグで1つ以上のブレイクポイントが

    VCのサンプルプログラムをデバッグしようとしています。 デバッグ開始を実行すると、exeにデバッグ情報がありません。と表示され、 その後、ひとつ以上のブレイクポイントが設定できませんでした。と表示されます。 プロジェクトの設定でWin32 DEBUGを設定 ビルドメニューのアクティブな構成もWin32 Debug を選択していて、リビルド、コンパイルしています。 別のプロジェクトだと、うまくいくのですが・・・ ブレイクポイントの設定位置も問題ないかと思うのですが、 どなたか、お心当たりございましたら、よろしくお願いします。

  • Accessでブレークポイントが効きません(泣

    こんにちわ。 まったく原因がわからず悩んでいます。。 環境は WindowsXP で Access2000 を使ってるのですが、 VBAでのデバッグでブレークポイントがまったく効かないのです。 (止まりません) ブレークポイントを設定はできて、ソースの左に●がでて行の色も変わります。 そのブレークポイントの行は確実に通っています。 (例えばダミーでMsgBoxを開くようにして、そのMsgBoxの行に ブレークポイントを設定すると、そのMsgBoxは開くのですが ブレークポイントとして処理が停止する事はありません。) それ以外の方法でも、確実にブレークポイントを通過している事は確認しました。 でもなぜか止まりません。 違うサイトにて同じような質問の回答で、『そういう場合は新しいMDBを作成し 中身をすべてインポートしてやれば止まる』というのを見つけたので その通りにしたら確かに止まるようになりました。 でも今回はその方法は事情により絶対できません。 ブレークポイントが反応しない原因として考えられる事はなんなのでしょうか? また、同じような経験をされた方で、原因は分からないけど こんな方法で解決した、というのがあれば是非教えてください。 よろしくお願いいたしますm(_ _)m

  • word-breakを適用させる方法

    Visual Studio2010でCSS3.0のプロパティである"word-break"を適用させる方法を教えてください。 現在Visual Studio2010 Premiumを使用して、ソフトウェアの開発を行っています。 作成するソフトウェアはブラウザ上に表示させ、 ウィンドウの大きさに合わせて表示文字の自動改行を行おうと考えています。 そのため、スタイルシートとしてCSS3.0のプロパティであるword-breakを導入したいのですが、 記述してもなぜか導入されず、デバッグ時にword-breakの部分が適用されていません。 具体的には、CSSファイル内のword-breakの部分に緑の波線が引かれ、波線部分にポインタを合わせると 「検証(CSS3.0):'word-break'は認識できるCSSプロパティ名ではありません。」 と表示されます。 ちなみに似たような機能のword-wrapでも上記の注意が表示されます。 なお、他のCSSプロパティである、border-radiusやbox-shadowなどでは 上記のような注意は表示されません。 自分が現在使用しているInternet Explorerは8ですが、 word-break自体はIE5から対応されており、IEのバージョンによる問題ではないと思うのですが・・・。 他に思い当たる原因が分からず、質問させていただきました。 word-breakを適用する方法について、解決方法をご存知でしたら 何卒回答の程をお願いいたします。

    • ベストアンサー
    • CSS

専門家に質問してみよう