C#のデバッグテクニックはじめに私にとってGUIアプリケーションのデバッグとは、ほとんどの場合、デバッグステートメントをダイアログボックスの形式で表示することだ。このテクニックは小規模から中規模のアプリケーションでは有効だ。しかし大規模なアプリケーションの場合、ステートメントごとにダイアログボックスがポップアップさせるのは非生産的だ。そこで、実行時にデバッグステートメントを表示するもっと良い方法はないかと考えた結果、目に留まったのがC#である。 C#は、私が便利でスケーラブルなデバッグシステムの設計に取り組んでいるときにぶつかった3つの問題を解決してくれた。私は普段JavaやC/C++を主に使用しているが、これらのプログラミング言語では次のような問題があった。
3つの問題の解決策 では、これらの問題に対する解決策を順番に見ていこう。まずは1番目の問題である。この問題は、基本的に // create the stack frame for the function that // called this function StackFrame sf = new StackFrame( 1, true ); // save the method name string methodName = sf.GetMethod().ToString(); // save the file name string fileName = sf.GetFileName(); // save the line number int lineNumber = sf.GetFileLineNumber(); 次は2番目の問題、実行時にプログラム内のさまざまなセクションを選択してデバッグするにはどうしたらいいかだ。この問題は、1番目の問題に関係している。1番目の問題を解決することで得られる情報が、デバッグステートメントの表示をフィルタリングするのに役立つからだ。次の例では、名前空間に基づいてフィルタリングを行うことにする。例えば、プログラム内に15の名前空間があり、そのうち1つの名前空間のデバッグステートメントだけを表示したいとする。この場合、デバッグクラスに、その名前空間だけがデバッグステートメントを表示するように指示するだけでよい。 コード例は次の通り。 // create the namespaces hashtable namespaces = new Hashtable(); // get the assembly of this class Assembly a = Assembly.GetAssembly( new Debug().GetType() ); // now cycle through each type and gather up all the namespaces foreach( Type type in a.GetTypes() ) { // check if the namespace is already in our table if( ! namespaces.Contains( type.Namespace ) ) namespaces.Add( type.Namespace, true ); } 上記のコードでは、このコードを含んでいる // only proceed if the namespace in question is being debugged if( (bool) namespaces[ method.DeclaringType.Namespace ] ) // this is where the debug statement display code would be ここまでは上出来だ。残る問題は、プログラムの最終リリースを作成するときに、厄介なデバッグステートメントを、1つ1つ手作業でコメントアウトするか削除するような手間をかけずに削除することだ。ここで役に立つのが"属性"だ。ここでは皆さんが既にC#における属性の動作を知っているものと想定して概念的な説明を省き、前述の 次に、!!ConditionalAttribute クラスの使用例を示す。
[Conditional("DEBUG")]
public void Debug( string msg )
{
// this is where the debug statement
// display code would be
}
このように記述すると、プログラムのコンパイル時に、 まとめ ここで取り上げた問題のうち、いくつかはC/C++やJavaでも解決できると主張する人がいるかもしれないが、どちらの言語もすべての問題を解決することはできない。たとえばC/C++では、 以上のテクニックの具体例を示すために、小さなWindowsアプリケーションを作成してみた。この 著者紹介Mike Borromeo(Mike Borromeo)
ミシガン大学工学部生。普段C/C++、Java、C#、PHP、VBScript、JavaScript、MSSQL、HTMLを利用している。連絡先はMikeD227@hotmail.com。本稿のアイデアおよびコードは、GnutellaクライアントプロジェクトPhoslの一環として開発されたものである。
|