2

たとえば、次のような積分変数に関するいくつかの「基本的な」アルゴリズムで構成されたプログラムがあるとします。

if(a<b)
   a += c;

実行時にさまざまな変数に加えられたすべての変更を自動的にログに記録できるツールはありますか?

たとえば、その場合はログファイルに表示されます。

 "condition passed because 5=a < b=10
     a += 10; because c=10"

または同等のもの。

各操作を手動でログに記録できることは承知していますが、それは非常に複雑になります。そのようなことをすることができるツールはありますか?完全に手動でない限り、リファクタリング/再コンパイルは気にしません。

4

2 に答える 2

1

それに応じて演算子をオーバーロードする独自の整数クラスを作成できます(自動ロギングを使用)。クラスが暗黙的な変換(intからのコンストラクターおよびintへの変換演算子)も提供する場合、の自動ロギングを行うには、変数とパラメーターのタイプを「変更するだけ」で済みます。ただし、名前の代わりに、アドレス(またはvar20などのアドレスから派生したもの)のみをログに記録できます。#defineを使用すると、生のint(ロギングなし)または整数クラスとロギングを簡単に切り替えることができます。

変数の名前もロギングに取り込むには、次のようなマクロを使用して演算子を書き直す必要があります。

if (LESS(a,b))
    INC(a,c)

または、コードを次のようなものに自動的に変換するパーサーを用意します。しかし、私はこれを提供する既存のツールを知りません。

于 2012-10-23T19:21:28.977 に答える
0

このようなプログラムの完全な実行をログに記録することが役立つとは想像しがたいです。単純なstd::cout << "hello, world!\n";ものでは、大量の役に立たないログが生成されます。

実際に何をする必要がありますか?コードをデバッグしたい場合は、printf-debugging-gone-horribly-wrong 戦略を使用する代わりに、実行中のプログラムを調べるためにおそらくデバッガーを使用する必要があります。後で検査/操作するために完全な実行を記述する方法が必要な場合は、プログラムが決定論的に動作することを確認し、プログラム入力を保存するだけです。

正しい解決策は実際の問題によって異なりますが、完全な実行ログがすべての正しい解決策になるとは限りません。

于 2012-10-23T19:51:13.287 に答える