11

スタックトレースに行番号を含めたいVB.NET2010Winformsアプリケーションがあります。次の質問と回答を読みました。

VB.netでのアプリケーション実行中に行番号を印刷する方法

これは、「このような状況で使用されるデバッグ情報を含むPDBファイルをコードに常に含める必要がある」と述べています。高度なコンパイラ設定で、リリースビルドの「デバッグ情報の生成」を「pdb-only」および「full」として試し、EXEと同じディレクトリに新しいPDBファイルが生成されることを確認しました。ただし、次のテストコードは、スタックフレームごとにゼロの行番号を生成し、ファイル名を返しません。

    Dim st As StackTrace = New StackTrace(ex)
    For Each sf As StackFrame In st.GetFrames
        MsgBox("Line " & sf.GetFileLineNumber() & sf.GetFileName)
    Next

ただし、次のコードは、他の点では見栄えの良いスタックトレースを生成する直後なので、一般に例外ハンドラーの問題にはならないようです。

ExceptionDetails.Text = ex.GetType.ToString & "(0x" & hr.ToString("X8") & "): " & ex.Message & vbCrLf & ex.StackTrace

プロジェクト構成の下で他の可能性のある設定を見つけることができないようで、この問題を引き起こす可能性のある他のことについて誰かがアイデアを持っているかどうか疑問に思いました。ここや他の場所で検索して見つけたすべてのソリューションは、PDBが実行可能ファイルと同じパスにあることを確認することを示唆しているようです。

4

3 に答える 3

15

この質問はしばらく前に解決されましたが、最近プロジェクトに含めた最終的な作業機能を共有したいと思いました。その時点での初期例外情報と完全なスタックトレースを返し、その後にスタックトレースからの例外に至るまでの行番号とファイル名を返します。

Public Function GetExceptionInfo(ex As Exception) As String
    Dim Result As String
    Dim hr As Integer = Runtime.InteropServices.Marshal.GetHRForException(ex)
    Result = ex.GetType.ToString & "(0x" & hr.ToString("X8") & "): " & ex.Message & Environment.NewLine & ex.StackTrace & Environment.NewLine
    Dim st As StackTrace = New StackTrace(ex, True)
    For Each sf As StackFrame In st.GetFrames
        If sf.GetFileLineNumber() > 0 Then
            Result &= "Line:" & sf.GetFileLineNumber() & " Filename: " & IO.Path.GetFileName(sf.GetFileName) & Environment.NewLine
        End If
    Next
    Return Result
End Function
于 2014-03-11T23:19:07.213 に答える
5

呼び出しているコンストラクターのドキュメントから:

StackTraceは、呼び出し元の現在のスレッドで作成され、ファイル名、行番号、または列情報は含まれていません。

使用してみてください:

Dim st As StackTrace = New StackTrace(ex, True)

代わりに、このコンストラクターを使用します。2番目のコンストラクターパラメーターは次のように記述されます。

trueの場合、ファイル名、行番号、および列番号をキャプチャします。それ以外の場合はfalse。

于 2012-12-27T00:37:16.827 に答える
1

を使用してみてください

public StackTrace(Exception e, bool fNeedFileInfo);

コンストラクターとfNeedFileInfoのtrueへの設定

于 2012-12-27T00:39:03.163 に答える