2017-12-05 7 views
3

私はLinux C++デバッガとしてtotalviewを使用しています。私たちのコード内の関数は、多くの場合、いくつかの準備作業が行われ、多かれ少なかれ複雑な関数barよりも、return文と呼ばれているこの複合戻りステートメントをデバッグ

double foo() { 
    int a = 2; 
    int b = 3; 
    return bar(a,b); 
} 

のようなものを見て。

興味深い戻り値を簡単に観察できないため、これはtotalviewでデバッグするのが難しいです。 Totalviewは表現しているbar(a,b)を評価できません。私は、私は、戻り値にブレークポイントを置いて、私の機能barのインとアウトプットを観察することができ、今

double foo() { 
    int a = 2; 
    int b = 3; 
    const auto retVal = bar(a,b); 
    return retVal; 
} 

としてコードを書き換えることができます。

新しい(無駄な)変数を導入せずにこれを行うにはどうすればよいですか?

答えて

0

戻り値最適化という名前のというプロセスでコンパイラに "役に立たない"変数を最適化してそのまま残しておきます(私は可能な限りコンパイラを助けるでしょうが、関数autoではなく明示的に機能するため、returnステージでは型変換が行われません)。価値のあるものについては、std::vectorのような重いオブジェクトであっても、私はこれを常に行います。コンパイラが余分なコピーを作っていると思われる場合は、生成されたアセンブラをいつでも確認できます。

次に、わかっている適切な場所にブレークポイントを設定できます。

一部のデバッガでは、関数の戻り値を直接レジスタで調べることができますが、これは決して普遍的ではありません。

参考:http://en.cppreference.com/w/cpp/language/copy_elision

+0

私はそれを行うことができます。問題は、追加の戻り変数を持たないケースが私たちの大きなコードベースの中にあるということです。したがって、私はデバッグのためにすべてのファイルを編集する必要があります。 – schorsch312

+0

@ schorsch312:必要なものだけをステップバイステップで提供します。 – Bathsheba

関連する問題