ASP.Netアプリケーションのデバッグ時にコンソールを使用する

新しいプロジェクトを開始し、基本的なことを書く段階に徐々に近づいていきます。 ASP.Netプラットフォームでのソフトウェア開発のいくつかの側面に関する知識を収集して整理し、1年以上の商用開発で​​獲得することにしました。 結果はそのような記事です。 それは根本的に新しいもののふりをするものではありません。誰もがこれを長い間知っていました。ある意味では、それは一種のベストプラクティスです。 以下に書かれていることはすべて、初心者には役立つと思われますが、経験豊富な開発者は、自分にとって興味深いことを学ぶことができます。



私たちは、高度な開発ツール、マルチスレッドアプリケーションのデバッグをサポートするデバッガー、およびその他の非常に有用な多くの時代に生きています。 しかし、他の現象と同様に、このような進歩には欠点があります-最速のマシンではなく、段階的なデバッグのプロセスは開発者の悪夢に変わります。 すべてがハングし、デバッガーは車をアップグレードする時間になることを示唆します。あなたの頭の子のコードを30分旅した後、もう一度F10を押して恐怖で飛びますが、例外はコードの深さのどこかに、非常に高いレベルまで、慎重にキャッチされたキャッチまで。 例外メッセージは、引数がメソッドに来たことを知らせますが、どこから来たのか、どのように来たのかは完全に不明です。 歯を食いしばって忍耐を身につけて、再び厄介なバグを探し始めます...

私の背後には、オリンピックのプログラミングのクラスが数年あり、さまざまな条件でTurbo PascalからVisual Studio 2008までのさまざまなツールでコードを記述していました。 誰が知らないか、オリンピアードは通常、さまざまな大学で開催されます。 学生によって殺されたコンピューターが完全に不可能な場合があり、コンピューター上のウイルスの数が合理的な制限を超えました。 ただし、このような状況では、コンテストのすべての参加者が滞在するため、文句を言う時間はありません。タスクを解決する必要があります。 そのため、長年にわたって非常に重要なことを学びました。おそらく最良のデバッガーはコンソールです。 はい、はい、これは同じ、普通の黒いもので、灰色の文字が忍び寄っています。 ただし、色はユーザーの想像力に依存します。

高速なマシンでも、コンソールは長い反復計算または再帰計算をデバッグするのに便利です-中間結果とともに、従来のデバッガよりもはるかに高速に情報を提供し、Console.WriteLine、printf、system.out.printlnまたはそのアナログを入力するだけですアプリケーションを作成する言語で。 コンソールは同じログですが、表示するためにファイルに移動する必要はありません。コンソール上にあり、関心のあるすべてのものを一度に見ることができます。 最終的に、多くの開発者が、デバッグのために少なくとも一度はそれを使用したと思います。

今日は、ASP.Net MVCアプリケーションの例と、コンソールを使用してデバッグとログを記録する方法を紹介します。 それでは始めましょう。

まず、コンソール自体を初期化する必要があります。 これを行うために、kernel32.dllからAllocConsoleをインポートする小さな静的クラスConsoleManagerを記述します。 また、コンソールを初期化し、出力を設定し、アプリケーションを起動する前にクリーニングするメソッドを追加します。

public static class ConsoleManager<br> {<br> [DllImport( "kernel32.dll" , EntryPoint = "AllocConsole" , CharSet = CharSet.Unicode)]<br> private static extern bool AllocConsole();<br><br> public static void InitializeConsoleManager()<br> {<br> #if CONSOLE<br> try <br> {<br> AllocConsole();<br> Console .SetOut( new TextWriter( new StreamWriter( Console .OpenStandardOutput(), Encoding .Default, 100)));<br> Console .Clear();<br> }<br> catch (Exception)<br> {<br> }<br> #endif <br> }<br> }<br> <br> * This source code was highlighted with Source Code Highlighter .





サーバー上のアプリケーションの通常の操作中にコンソールを表示したくないため、それを初期化するコードを条件付きコンパイルディレクティブに初期化し、もちろん、デバッグプロジェクト構成でCONSOLEシンボルを定義することを忘れませんでした。 次に、Global.asaxに進み、アプリケーションの開始時にコンソールを初期化します。

protected void Application_Start()<br> {<br> ConsoleManager.InitializeConsoleManager();<br> // ... <br> }<br> <br> * This source code was highlighted with Source Code Highlighter .





Hooray、アプリケーションが起動すると、黒いアプリケーションウィンドウが表示されます! 素晴らしいですが、作業はここでは終わりません。今から少し装飾します。 ログは、ほとんどのWebアプリケーションに不可欠な属性です。多くの場合、ログは実行中のサーバーでエラーを追跡できる唯一の証拠であるためです。 コンソールでロガーメッセージを複製しないのは罪です。デバッグ中の時間を大幅に節約できます。 ファイルとコンソールの両方に書き込むメッセージと、コンソールのみに書き込むメッセージを区別するために、列挙について説明します。

public enum Severity<br> {<br> None,<br> Event,<br> Error,<br> Debug,<br> }<br> <br> * This source code was highlighted with Source Code Highlighter .





すべてがシンプルです:



特定のタイプのメッセージに対応する色を決定するために、単純な拡張メソッドを作成します。

public static ConsoleColor GetLogEntryColor( this Severity severity)<br> {<br> switch (severity)<br> {<br> case Severity.None:<br> return ConsoleColor.DarkGray;<br> case Severity.Event:<br> return ConsoleColor.Green;<br> case Severity.Error:<br> return ConsoleColor.Red;<br> case Severity.Debug:<br> return ConsoleColor.Cyan;<br> default :<br> throw new ArgumentException( string .Format( "Unknown severity: '{0}'" , severity));<br> }<br> }<br> <br> * This source code was highlighted with Source Code Highlighter .





宣言的なアプローチの方がはるかにきれいであることに注意してください:

public enum Severity<br> {<br> [SeverityColor(ConsoleColor.DarkGray)]<br> None,<br> [SeverityColor(ConsoleColor.Green)]<br> Event,<br> [SeverityColor(ConsoleColor.Red)]<br> Error,<br> [SeverityColor(ConsoleColor.Cyan)]<br> Debug,<br> }<br> <br> * This source code was highlighted with Source Code Highlighter .





しかし、パフォーマンス上の理由から、私はそれを拒否しました。 この問題は議論の余地があり、多分将来的には戻ってくるでしょう。 ASP.Netアプリケーションがマルチスレッドであることを忘れずに、ロガーを説明するだけです。

public static class Logger<br> {<br> [ThreadStatic]<br> private static Severity m_CurrentSeverity;<br><br> /// <summary> <br> /// Writes debug message to log <br> /// </summary> <br> public static void WriteToLog( string message)<br> {<br> WriteToLog(message, Severity.Debug);<br> }<br><br> public static void WriteToLog( string message, Severity severity)<br> {<br> lock ( typeof (Logger))<br> {<br> m_CurrentSeverity = severity;<br> WriteLineStart();<br> WriteLine(message);<br> }<br> }<br><br> private static void WriteLine( string message)<br> {<br> Write(message + Environment.NewLine);<br> }<br><br> private static void Write( string message, params object [] parameters)<br> {<br> Write( string .Format(message, parameters));<br> }<br><br> private static void Write( string message)<br> {<br> Console .ForegroundColor = m_CurrentSeverity.GetLogEntryColor();<br> Console .Write(message);<br> if (m_CurrentSeverity == Severity.Error || m_CurrentSeverity == Severity.Event)<br> {<br> // file logging <br> }<br> }<br><br> private static void WriteLineStart()<br> {<br> Write( "{0} -> " , DateTime .Now);<br> }<br> }<br> <br> * This source code was highlighted with Source Code Highlighter .





理解を深めるために、すべてが意図的に簡素化されています。 デバッグ中のコンソールは次のようになります。



私自身の経験から言えば、このようなコンソールを使用すると、開発者の生活がはるかに楽になります。

ありがとう

UPD。 ここで、ほぼ同じ機能を実装する代替ツール- デバッグビュープログラムがあることを求められました。




All Articles