2

私はc++cmd行プログラムでいくつかのコードの書き直しに取り組んでいます。

使用する低レベルのデータ構造を変更し、新しいバージョンはすべてのテストに問題なく合格し(かなり多く)、新しいバージョンと古いバージョンの両方から正しい出力を取得します...それでも、特定の入力を与えると、それらは異なる振る舞いをします。

要点:やや大きなプロジェクトであるため、実行フローが分岐したときに追跡する方法がわからないため、関数呼び出しツリー(おそらくstd呼び出しを除く)を追跡する方法があります。 、わからない、ソースファイルの行番号とソース名?多分いくつかのgccまたはマクロカンフー?

プログラムが実行される場所なので、Linuxソリューションが必要になります。

4

1 に答える 1

0

それでも、特定の入力を与えると、それらは異なる動作をします

のアルゴリズムのより良い動作を理解するために、古いバージョンと新しいバージョンのログインを拡張しますcertain input。明確になったら、たとえば、まだ必要な場合はgdbを使用できます。

更新

OK、私はロギングはOKですが、追加したくありません。

もう1つの方法はトレースです。実はSolarisでしか使っていませんが、Linuxにもあるようです。Linuxでは使用したことがないので、テストできるのは単なるアイデアです。

SystemTapを使用できます

ユーザースペースプロービング
SystemTapは当初、カーネルスペースプロービングに焦点を当てていました。ただし、ユーザースペースプロービングが問題の診断に役立つ場合が多くあります。SystemTap 0.6は、ユーザースペースプロセスのプロービングを可能にするサポートを追加しました。SystemTapには、ユーザースペースプロセスの関数へのエントリと関数からの戻りのプローブ、ユーザースペースコードの事前定義されたマーカーのプローブ、およびユーザープロセスイベントの監視のサポートが含まれています。

私はそれがうまくいくことを保証することができますが、なぜそれを試してみませんか?

ドキュメントには例もあります:

関数xmalloc関数がコマンドlsによってどのように呼び出されているかを確認したい場合は、ユーザースペースのバックトラック関数を使用してその情報を提供できます。

stap -d /bin/ls --ldd \
-e 'probe process("ls").function("xmalloc") {print_ustack(ubacktrace())}' \
-c "ls /"
于 2012-11-21T16:43:20.453 に答える