당신은 나를 이것으로 찌르도록 영감을주었습니다. 밤새도록 나를 깨워 줘서 고마워. :) 당신이 할 수있는 한 가지 방법이 있습니다.
Visual Studio에는 정말 큰 중단 점 지원이 있습니다. 더 멋진 기능 중 하나는 중단 점에 도달하면 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에 중단 점을 설정합니다. 그런 다음 빨간색 중단 점 원을 마우스 오른쪽 단추로 클릭하고 "When Hit ..."를 선택하십시오. 결과 대화 상자 하단에는 매크로를 실행하도록 지시하는 옵션이 있습니다. 목록을 드롭하고 매크로를 선택하십시오. 이제 앱이 처리되지 않은 예외를 throw 할 때 새로운 중단 점을 가져와야합니다.이것에 대해
주의 사항 및주의 사항 :
- 내가 하지 정규식 전문가입니다, 나는 다른 사람이 더 나은 뭔가를 채찍질 할 수 있습니다 확신합니다.
- 이것은 중첩 예외 (InnerException 속성)를 처리하지 않습니다. 원하는 경우 머리를 두드릴 수 있습니다. :) GetExpression ("e.InnerException")을 확인하고 재귀를 수행하십시오.
- excpetion의 StackTrace 문자열에서 텍스트 구문 분석을 수행하며, 더 복잡한 개체 그래프 분석 (Exception.TargetSite 분석 및 리플렉션 사용)은 수행하지 않습니다. 일반적인주의 사항은이 접근법의 취약성에 적용됩니다.
- 어떤 이유로 "중단 구역"에 중단 점을 넣는 것처럼 보입니다. 초기 디버깅 세션이 끝나면 코드에 새 중단 점이 표시되지 않습니다. 그러나 디버거에서 프로그램을 다시 실행하면 "모든 중단 점 해제"와 같은 내용이 영향을줍니다. 어떤 일이 일어 났는지에 대해 배우는 것이 좋을 것입니다. 누군가 그 일을 정리할 방법을 찾는 것처럼 느껴지면 말입니다. .suo 파일에서 파고 드는 것일까 요?
희망이 있습니다.
필자는'if (IsDebuggerPresent()) DebugBreak();'를 통해 항상 C++에서이 작업을 수행해야합니다. 여러 가지 예외 클래스의 생성자에 포함되어 있습니다. –