2012-01-19 4 views
6

중단 점/추적 점을 사용하여 함수에서 자동으로 복귀 할 수 있습니까?
중단 점에 도달 할 때마다 실행 지점을 끌거나 Ctrl + Shift + F10을 사용하여 설정하지 않습니다.
히트했을 때 다음 "메시지"를 "인쇄"하려고했지만 변경 사항없이 실행이 계속됩니다.중단 점을 사용하는 함수에서 복귀

{return;} 
{return null;} 

실제로 코드를 변경하지 않고 함수에서 복귀해야합니다.

추적 점의 정의 : "추적 점은 연결된 사용자 지정 동작이있는 중단 점이 며, 추적 점에 도달하면 디버거가 프로그램 실행을 중단하는 대신 또는 추가하여 지정된 추적 점 작업을 수행합니다 . "MSDN.

"메시지 인쇄"가 무슨 뜻인지 잘 모르는 경우에는 흔적에 대해 this AltDevBlogADay post을 읽고 싶을 것입니다. 좋아.

답변

3

좋아, 주위에 파고의 조금 후에 이 작업을 수행 할 수 있습니다 -하지만 모든 경우에 작동하지 않을 것.

주의 할 점은 매크로를 사용하므로 인라인 대리자와의 작동을 보장 할 수 없습니다. 또는 실제로 어떤 것을 돌려 줄 필요가있는 메소드를 사용한다. 중단 점에 도달하면 @juergen d 및 @Erno가 설명하는 프로세스를 자동화합니다. 매우 간단한 경험적 방법을 사용하여 현재 함수의 끝 부분을 찾습니다.

먼저이 매크로를 매크로 환경에 추가해야합니다 (VS에서 ALT + F11을 사용하여 엽니 다). 바로 클릭하고 When hit... 메뉴 옵션을 명중 - 난 그냥 자리에두고 :

Sub ExitStack() 
    'get the last-hit breakpoint 
    Dim breakPoint As EnvDTE.Breakpoint 
    breakPoint = DTE.Debugger.BreakpointLastHit() 
    'if the currently open file is the same as where the breakpoint is set 
    '(could search and open it, but the debugger *should* already have done that) 
    If (DTE.ActiveDocument.FullName = breakPoint.File) Then 

     Dim selection As EnvDTE.TextSelection = DTE.ActiveDocument.Selection 
     Dim editPoint As EnvDTE.EditPoint 
     'move the cursor to where the breakpoint is actually defined 
     selection.MoveToLineAndOffset(breakPoint.FileLine, breakPoint.FileColumn) 

     Dim codeElement As EnvDTE.CodeElement 
     codeElement = DTE.ActiveDocument.ProjectItem.FileCodeModel.CodeElementFromPoint(selection.ActivePoint, vsCMElement.vsCMElementFunction) 
     'if a function is found, move the cursor to the last character of it 
     If Not (codeElement Is Nothing) Then 
      Dim lastLine As EnvDTE.TextPoint 

      lastLine = codeElement.GetEndPoint() 
      selection.MoveToPoint(lastLine) 
      selection.StartOfLine(vsStartOfLineOptions.vsStartOfLineOptionsFirstText) 
      'execute the SetNextStatement command. 
      'Has to be done via ExecuteCommand 
      DTE.ExecuteCommand("Debug.SetNextStatement") 
     End If 
    End If 
End Sub 

을 그것을 밖으로 돌진 한대로, 수 이제 당신이 중단 점을 설정할 수있는이 코드는 아마도 좋지 않다 (이것은 VS2010에서만 작동합니다). ScottGu는 이것을 this 블로그 게시물에 설명합니다.

대화 상자에서

, 당신은 단지에 붙여 넣기 한 ExitStack 매크로를 찾을 수 있습니다.

실행 디버거 코드 부착 중단 점에 명중 할 때 함수의 코드의 나머지 부분은 생략한다. 이것은 조건과 같은 다른 디버거 트릭을 따라야합니다.

주 - 내가 가지고있는 문제를 해결하기 위해 this SO을 사용했습니다. 원래 디버거의 SetNextStatement 메서드를 직접 호출하고 작동하지 않았다.

반환해야하는 메서드가 어떻게 동작 할 것인지는 잘 모르겠다. 이론적으로 반환 값은 로컬 일 때 반환해야하지만 어떤 경우에는 반환해야합니다. 사실 이것은 단순히 작동하지 않을 것입니다!

마찬가지로 중단 점이 try/catch 블록에 있으면 try/catch를 종료해야만 다음 명령문을 그 외부 어딘가에 설정할 수 있기 때문에 작동하지 않습니다.

+0

아주 멋지다. 나는 여전히 누군가가 비 매크로, 가치를 반환하는 답변을 가지기를 바라고 있지만, 지금까지는 이것이 최고의 선택이다. –

+0

@Protectorone 자신 만의 디버거를 작성하지 않는 한 - 하나도 존재하지 않습니다. 메소드가 지역 변수를 리턴하면, 이것을 사용하여 리턴하기 전에 로컬을 설정하기 위해 watch (또는 다른 매크로 사용)를 사용할 수 있습니다. –

7

Visual Studio에서 디버깅하는 동안 현재 코드 줄을 나타내는 화살표를 함수 끝으로 끌면됩니다.

+4

1 참조하거나 함수에서 return 문 또는 중괄호를 마우스 오른쪽 버튼으로 클릭하고 '설정 다음 문장'를 선택합니다. 현재 스택의 다른 곳에 코드를 지정할 때만 작동한다는 점은 지적 할 가치가 있습니다. try/catch 블록을 적용 할 수 없다고 생각합니다. –

+0

자동으로 원합니다. 중단 점이 발생할 때마다 실행 지점을 끌고 싶지 않습니다. –

+0

다음과 같이'goto' 명령을 생각해보십시오 :'if (your_breakpoint_condition) goto end_marker;' –

3

두 가지 옵션 :

  1. 당신은 함수가 실행을 완료하고 호출자에게 반환 후 휴식합니다. "스텝 아웃"(Shift-F11)을 누르십시오.
  2. 여러 줄의 실행을 건너 뛰려면 노란색 마커를 실행하려는 다음 줄로 끌어 놓습니다. 마커를 위치로 드래그하면 간섭없이 실행될 때 절대로 실행될 수없는 실행 순서가 발생할 수 있으므로 결과가 완전히 잘못되었을 수 있습니다.
1

예, 추적 점을 사용하여 직접 수행 할 수 있습니다.

  1. 는 어느 레지스터 창에 등록하거나 "@eip"에 대한 시계를 추가 EIP보고 다음 번에 침입,에 의해 함수의 맨 아래에있는 return 문의 주소를 찾을 수 있습니다.
  2. 건너 뛰려는 줄에 추적 점을 추가하십시오. 라인의 어떤 것이 실행되기 전에 점프가 일어날 것임을 기억하십시오. 추적 점의 내용은 1 단계의 주소를 사용하여 {@eip = address}이어야합니다.
  3. 이익!

https://stackoverflow.com/a/14695736/301729

+0

함수가 _has_ return 문을 가정하면 ... –

+0

@Protectorone 실제로 return 문도 필요하지 않습니다. 마지막 닫기 중괄호를 중단하고 해당 주소를 사용할 수 있어야합니다. –

관련 문제