none
リリースモードでデバック

    質問

  • VC++2010使用です。リリースでビルドしてデバック実行してもブレークポイントで止まってくれません。

    https://msdn.microsoft.com/ja-jp/library/fsk896zz.aspx

    を参考に、シンボル作成等の設定はおこなっています。

    何が問題なのでしょうか?

    #include "stdafx.h"
    
    int sum(int a, int b)
    {
    	int ans = a + b;//ここにブレークポイントを入れている
    	return a + b;
    }
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	int ret = sum(2, 3);
    	return 0;
    }//ここにブレークポイントが移動する
    
    


    2018年2月22日 2:31

回答

  • 恐らくですが、最適化を無効にするとブレークポイントで止まるようになるので、最適化によって関数自体がなくなってしまっている可能性があります。

    最適化を無効にするには、プロジェクトのプロパティ「構成プロパティ」→「C/C++」→「最適化」の「最適化」項目を「無効(/Od)」と設定します。

    最適化で、関数がなくなってしまう考えられる原因は 2 つあります。

    ・一つは関数の戻り値が参照されていないため
    ・もう一つは、関数がインライン展開されてしまっているため

    まず、sum 関数の戻り値である ret を参照するプログラムにします。例えば

    int _tmain(int argc, _TCHAR* argv[])
    {
    	int ret = sum(2, 3);
    	printf("%d\n", ret);
    	return 0;
    }


    また、関数がインライン展開されないように、プロジェクトのプロパティ「構成プロパティ」→「C/C++」→「最適化」の「インライン関数の展開」を「無効(/Ob0)」としておくか、下記のように関数の定義で "__declspec(noinline)" を指定しておくと関数がインライン展開されなくなるようです。

    __declspec(noinline) int sum(int a, int b)
    {
    	int ans = a + b;//ここにブレークポイントを入れている
    	return ans;
    }

    こうしておくと最適化が「無効 (/Od)」でなくてもブレークポイントで止まるようになると思います。

    • 編集済み kenjinoteMVP 2018年2月22日 3:29
    • 回答としてマーク TAKAKUN 2018年2月22日 4:25
    2018年2月22日 3:09

すべての返信

  • 恐らくですが、最適化を無効にするとブレークポイントで止まるようになるので、最適化によって関数自体がなくなってしまっている可能性があります。

    最適化を無効にするには、プロジェクトのプロパティ「構成プロパティ」→「C/C++」→「最適化」の「最適化」項目を「無効(/Od)」と設定します。

    最適化で、関数がなくなってしまう考えられる原因は 2 つあります。

    ・一つは関数の戻り値が参照されていないため
    ・もう一つは、関数がインライン展開されてしまっているため

    まず、sum 関数の戻り値である ret を参照するプログラムにします。例えば

    int _tmain(int argc, _TCHAR* argv[])
    {
    	int ret = sum(2, 3);
    	printf("%d\n", ret);
    	return 0;
    }


    また、関数がインライン展開されないように、プロジェクトのプロパティ「構成プロパティ」→「C/C++」→「最適化」の「インライン関数の展開」を「無効(/Ob0)」としておくか、下記のように関数の定義で "__declspec(noinline)" を指定しておくと関数がインライン展開されなくなるようです。

    __declspec(noinline) int sum(int a, int b)
    {
    	int ans = a + b;//ここにブレークポイントを入れている
    	return ans;
    }

    こうしておくと最適化が「無効 (/Od)」でなくてもブレークポイントで止まるようになると思います。

    • 編集済み kenjinoteMVP 2018年2月22日 3:29
    • 回答としてマーク TAKAKUN 2018年2月22日 4:25
    2018年2月22日 3:09
  • コンパイル オプションに  /FAcs を追加して、生成されたアセンブリ コードを提示してみたら?
    -----------------------------------------------------
    /FA、/Fa (リスティング ファイル)
    https://msdn.microsoft.com/ja-jp/library/367y26c6.aspx
    -----------------------------------------------------
    2018年2月22日 4:07
  • 最適化されていたようです。

    X・・・ブレークポイントで止まらなかった
    O・・・ブレークポイントで止まった

    結果

    X:printf("%d\n", ret);
    O:プロジェクトのプロパティ「構成プロパティ」→「C/C++」→「最適化」の「インライン関数の展開」を「無効(/Ob0)」
    O:__declspec(noinline)" を指定

    関数が無くなる原因、勉強になりました。
    ありがとうございました。

    2018年2月22日 4:25