2009-05-08 3 views
15

동일한 결과를 얻을 수있는 다른 옵션 (예 : 손으로 중단 점 추가)과 관계없이 프로그래밍 방식으로 Visual Studio 프로젝트의 소스 코드에 중단 점을 추가 할 수 있습니까?Visual Studio에서 중단 점을 프로그래밍 방식으로 적용/비활성화

try 
{ 
    FunctionThatThrowsErrors(obj InscrutableParameters); 
} 
catch(Exception ex) 
{ 
    Log.LogTheError(ex); 
    AddBreakPointToCallingFunction(); 
} 

당신이 다음 시간을 디버깅 실행 그런 식으로, 자동으로 마지막 실행시 문제가 발생하는 모든 지점에서 중단 점을 설정 한 것으로

같은.

특히 유용한 디버깅 방법은 아닙니다. 능력이 있는지 궁금합니다.

+0

필자는'if (IsDebuggerPresent()) DebugBreak();'를 통해 항상 C++에서이 작업을 수행해야합니다. 여러 가지 예외 클래스의 생성자에 포함되어 있습니다. –

답변

39

당신은 나를 이것으로 찌르도록 영감을주었습니다. 밤새도록 나를 깨워 줘서 고마워. :) 당신이 할 수있는 한 가지 방법이 있습니다.

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 파일에서 파고 드는 것일까 요?

희망이 있습니다.

+0

와우 !!! (나는 단지 '와우 !!!'를 타이핑하고 싶었다. 그러나 그것은 thn 15자를 덜 허용하지 않을 것이다 :)) –

+0

Sweet Lordy. 내가 너에게 줄 수있는 방법이 있다면 + 10. – DevinB

+0

새 투표를 할 때 내일 다시 돌아와서이 답변을 upvote하기 위해 내 전화에 미리 알림을 넣어야합니다. :-) – Henric

44

System.Diagnostics.Debugger.Break()으로 전화하면됩니다.

Debug->Exceptions...으로 이동하여 Thrown에있는 "User-unhandled"만 체크 한 모든 예외 사항을 처리하도록 Visual Studio에 지시 할 수도 있습니다.

+0

우선, (+1) 그게 굉장합니다, 나는 그것이 존재했다는 것을 몰랐습니다. 그러나 설명서에 "디버거가 연결되어 있지 않으면 사용자에게 디버거를 연결할지 묻는 메시지가 나타납니다." 즉,이 방법은 디버거없이 실행중인 경우 * 현재 실행 흐름을 방해합니다. 내 경우에는 다음 번 중단 점을 설정해야합니다. 또한, (아마도) 호출 함수가 전달되지 않은 중요한 문맥 정보를 가지고 있기 때문에, 호출 함수에서 중단 점을 설정하기를 원했던 것입니다. – DevinB

+0

코드를 컴파일 한 후에는 변경할 수 없습니다. 즉, 항상 확인되는 구성 플래그 뒤에 중단 점을 올리고 예외 상황에서 구성을 변경해야합니다. 그것은 잠재적으로 많은 구성입니다. 이 경우 가장 좋은 내기는 내 편집이 보여주는 것처럼 던지기를 중단하는 것입니다. –

+7

또한 Break를 호출하기 전에 Debugger.IsAttached를 확인할 수 있습니다. –

2

난 당신이 정말 "중단 점을 추가 할"수 있다고 생각하지 않습니다,하지만 당신은 System.Diagnostics.Debugger.Break()

4
를 호출하여, 무엇이 잘못되었는지 확인할 수 있도록 실행을 일시 중단 디버거를 지시 할 수 있습니다

질문에 실제로 반응하지는 않지만 Debug.Assert을 사용하여 설정 한 조건에 따라 디버거가 중단 될 수 있습니다. 그래서, 다음 번에 "예외가 발생하는 함수를 실행하고 중단하라"는 말 대신에, 함수에 어설 션을 추가하여 조건이 맞지 않을 때 중단 할 수 있습니다. 결국, 지난 번에 예외가 발생했기 때문에 이번에는 예외가 throw 될 것이라는 보장은 없습니다. :)

0

또한 Visual Basic에는 기본적으로 중단 점 및 중단 실행 역할을하는 Stop이라는 키워드가 있습니다.

+1

나는 당신이 그 질문을 오해했을지도 모른다라고 생각합니다. 나는 실행 프로그램이 소스 코드가 아닌 * pdb 파일을 수정하기를 원한다. 그런 식으로 처음으로 정상적으로 실행하고 처리 방법을 확인한 다음 디버거를 연결할 수 있으며 마지막으로 실패한 모든 지점에 이미 중단 점이 설정되어 있습니다. Stop 솔루션은 항상 실행을 중지합니다. – DevinB

관련 문제