2

何年もメンテナンスされていない古い C++ コードがあります。私は現時点でそれがどのように機能するかを学ぼうとしています。.xml 入力を受け取り、出力テキスト ファイルを吐き出す必要があります。2 つの異なる .xml 入力ファイルの処理にかかる時間は大きく異なり、一方は正しく動作し、もう一方は正しく動作しません。しかし、彼らは同じように始まります。2 つの異なる入力を使用してコードを実行したときに行われた関数呼び出しのログ ファイルを出力し、これらのログを相互に比較して、分岐点を確認したいと考えています。main() の最初の行でコードを中断して、gdb の制御フローをステップ実行することはできません。時間がかかりすぎています。理想的には、次のような方法を見つけたいと思います

gdb --args old_exec inp1.xml -step >log1.txt
gdb --args old_exec inp2.xml -step >log2.txt
diff log1.txt log2.txt

もちろん、「-step」フラグは実際のものではありませんが、すべてのステップをログに記録するように指示する何らかの方法が存在する可能性があります。何かご意見は?ありがとう!

4

1 に答える 1

3

GCC コンパイラにはフラグがあり-finstrument-functions、これにより、関数は入口と出口で特定の関数を呼び出すことができます。これを使用して、コード フローを追跡できます。このフラグを使用すると、次の関数を提供する必要があります。

void __cyg_profile_func_enter (void *this_fn, void *call_site);
void __cyg_profile_func_exit  (void *this_fn, void *call_site);

これらの関数をコンパイルするときは、インストルメンテーション フラグを付けてコンパイルしてはならないことに注意してください。

addr2line を使用して、ポインターをファイル/関数/行番号に変換できます。通常は、実行時に生のポインタを記録し、事後アドレス変換を実行する方がよいでしょう。

詳細については、 http://balau82.wordpress.com/2010/10/06/trace-and-profile-function-calls-with-gcc/を参照してください。

于 2012-08-28T15:40:35.757 に答える