あなたは私にこのことを突きつけてくれました。一晩中目覚めさせてくれてありがとう。 :)それはあなたがそれを行うことができる1つの方法です。
Visual Studioでは、非常に優れたブレークポイントがサポートされています。クーラー機能の1つは、ブレークポイントにヒットしたときにVisual Studioマクロを実行するように指示できることです。これらのマクロは、開発環境への完全なアクセス権を持っています。つまり、キーボードで手動で行うことができます。他のブレークポイントの設定も可能です。
この解決策は、1)すべての例外をキャッチするためにプログラム内にトップレベルのtry/catchを置くこと、2)マクロを実行するcatchブロックにブレークポイントを設定すること、3)マクロを例外それがどこから来たのか把握し、そこにブレークポイントを設定します。デバッガで実行すると例外が発生すると、問題のあるコード行に新しいブレークポイントが設定されます。
は、このサンプル・プログラムを取る:あなたは、デバッガでそれを実行し、エラーを取得するとき
using System;
namespace ExceptionCallstack
{
class Program
{
static void Main(string[] args)
{
try
{
func1();
}
catch (Exception e)
{
Console.WriteLine("Oops");
Console.ReadKey();
}
}
static void func1()
{
func2();
}
static void func2()
{
func3();
}
static void func3()
{
throw new Exception("Boom!");
}
}
}
目的は、プログラムFUNC3にそのthrow
にブレークポイントを設定することです。これを行うには、まず新しいVisual Studioマクロを作成します(私はSetBreakpointOnExceptionと呼ばれます)。新しいモジュールMyDebuggerMacrosまたは任意にこれを貼り付けます。
Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports System.Diagnostics
Imports System.Text.RegularExpressions
Public Module DebuggerMacros
Sub SetBreakpointOnException()
Dim output As String = ""
Dim stackTrace As String = DTE.Debugger.GetExpression("e.StackTrace").Value
stackTrace = stackTrace.Trim(New Char() {""""c})
Dim stackFrames As String() = Regex.Split(stackTrace, "\\r\\n")
Dim r As New Regex("^\s+at .* in (?<file>.+):line (?<line>\d+)$", RegexOptions.Multiline)
Dim match As Match = r.Match(stackFrames(0))
Dim file As String = match.Groups("file").Value
Dim line As Integer = Integer.Parse(match.Groups("line").Value)
DTE.Debugger.Breakpoints.Add("", file, line)
End Sub
End Module
このマクロが配置されると、バックcatch
ブロックに行くとF9でブレークポイントを設定します。赤いブレークポイントのサークルを右クリックし、「ヒットしたら...」を選択します。ダイアログの下部に、マクロを実行するように指示するオプションがあります。リストをドロップダウンしてマクロを選択します。あなたのアプリが未処理の例外をスローすると、新しいブレークポイントを取得する必要があります。これについて
注意と警告:
- 私はない正規表現の第一人者だ、私は他の誰かが、より良い何かをかき立てることができます確信しています。
- ネストされた例外(InnerExceptionプロパティ)は処理されません。 :) GetExpression( "e.InnerException")を確認し、おそらく再帰します。
- excpetionのStackTrace文字列でテキスト解析を行い、より洗練されたオブジェクトグラフ解析(Exception.TargetSiteを掘り下げてリフレクションを使用)を行いません。通常の警告は、このアプローチの脆弱性に適用されます。
- 何らかの理由で、ブレークポイントをいくつかの「代替スペース」に入れているようです。最初のデバッグセッションが終了すると、コードに新しいブレークポイントが表示されません。しかし、デバッガでプログラムを再実行すると、そこには「Disable All Breakpoints」のようなものが影響します。誰かがそれをきれいにする方法を見つけるように感じるなら、何が起こっているのかを知ることはいいでしょう。おそらく.suoファイルを掘り起こすのでしょうか?
私はこれをC++で行う必要があります。これは 'if(IsDebuggerPresent())DebugBreak();'を介して、私はいくつかの例外クラスのコンストラクタに持っています。 –