質問

VB.NETアプリケーションの行番号を含むデバッグメッセージを印刷したいと思います。私はこれが好きでした、

Dim st As StackTrace
Dim sf As StackFramee
st = New StackTrace(New StackFrame(True))
sf = st.GetFrame(0)
Console.WriteLine.("Line " & sf.GetFileLineNumber())

Surce Suniptをクラスに入れたいのですが、LogMSGメソッドを呼び出して、ソースコードの行番号でメッセージをログに記録します。しかし、上記のスニペットをクラスに入れた場合、ライン番号は常に同じでした。

関数は_とまったく同じですライン C ++のマクロ。実際、私はC ++プログラマです。

とにかくこの問題を解決するために?ありがとう。

役に立ちましたか?

解決

表示したコードは、予想通りに機能しています。スタックフレームをキャプチャした行の数を印刷しています。別のクラスで定義したため、そのクラスを含むファイルの行番号を印刷しています。

GetFrame ここでは方法が重要です。スタックフレームには0から番号が付けられています。 過去 スタックフレームが押されました。したがって、フレーム0を参照することにより、ランタイムに行番号を印刷するように指示しています 過去 プッシュされたスタックフレーム。あるメソッドが別のメソッドを呼び出すと、新しいスタックフレームが作成されます。

代わりに、いくつかの重要な方法でメソッドを変更する必要があります。まず、を取得する必要があります 最初 スタックに押し込まれたフレーム。第二に、おそらくあなたが応答している例外に関する情報を含むパラメーターを受け入れたいと思うでしょう。デバッグメソッドを書き直して、次のようになります。

Public Sub PrintCurrentLine(ByVal ex As Exception)
    Dim st As StackTrace = New StackTrace(ex)
    Dim sf As StackFrame = st.GetFrame(st.FrameCount - 1)
    Console.WriteLine("Line " & sf.GetFileLineNumber())
End Sub

また、最適化を有効にしてコードを実行している場合、行番号などのものが変更された可能性があることを忘れないでください。このような状況で使用されるデバッグ情報を含むコードにPDBファイルを常に含める必要があります。最適化されたコードを元のソースにマッピングします。

他のヒント

いくつかの答えを読んだ後、私はC ++マクロに相当するように、次のソリューションに来ました ライン

(New StackTrace(New StackFrame(True))).GetFrame(0).GetFileLineNumber())

たとえば、次のように使用できます。

Console.WriteLine(String.Format("Executed on line# {0}", (New StackTrace(New StackFrame(True))).GetFrame(0).GetFileLineNumber()))

コンパイルされたアセンブリには、それらに関連付けられたライン番号がありません。これは、アセンブリの一部である情報ではありません。

情報はデバッグシンボルファイルに保持されます - pdb ファイル。

MSDNから - Stacktraceクラス:

Stacktrace情報は、デバッグビルド構成で最も有益です。デフォルトでは、デバッグビルドにはデバッグシンボルが含まれますが、リリースビルドはそうではありません。デバッグ記号には、スタックフレームとスタックトレースオブジェクトの構築に使用されるファイル、メソッド名、行番号、および列情報のほとんどが含まれています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top