Programming

Visual Studio에서 디버깅하는 동안 반환하기 전에 반환 값을 찾을 수 있습니까?

procodes 2020. 2. 27. 22:26
반응형

Visual Studio에서 디버깅하는 동안 반환하기 전에 반환 값을 찾을 수 있습니까?


다음 기능을 수행하십시오.

DataTable go() {
    return someTableAdapter.getSomeData();
}

이 함수에서 중단 점을 설정하면 반환 된 값을 검사 할 수 있습니까? 페이지 go()의 데이터 그리드에 직접 연결됩니다 .aspx.

리턴 된 데이터 테이블을 검사하는 유일한 방법은 임시 변수를 사용하는 것입니다. 그러나 그것은 약간 불편합니다. 다른 방법이 없습니까?


내가 아는 한에서는 아니다. 당신이 경우주의 변수를 추가,이 릴리스의 컴파일러에 의해 제거 얻을 것이다 어쨌든 빌드 ...

업데이트 : 이 기능은 VS2013에 추가되었습니다 . 자동 창에서 반환 값을 $ReturnValue보거나 감시 / 즉시 창에서 사용할 수 있습니다.

값은 함수에서 복귀 한 후에 만 ​​직접 볼 수 있으므로 액세스하는 가장 쉬운 방법은 함수 호출에 중단 점을두고 호출 (F10)을하는 것입니다.


VS2015 업데이트 : boo! 불행히도 VS2017의 VS2015 (devenv v14)
업데이트에 없는 것으로 보입니다 . (devenv v15)


고객 의견 사이트에 따라 CLR 4.5.1 을 사용하여 Visual Studio 2013에서이 작업을 수행 할 수 있습니다 . C #의 이전 버전에서는 사용할 수 없었습니다.

(Visual Studio 2008 및 이전 버전은 VB.NET에서 지원했습니다. 항상 C / C ++ 개발자가 사용할 수있었습니다.)


나는 이것이 매우 유용한 것임을 동의합니다. 방법에서 나가기 전에 메서드의 반환 값을 볼뿐만 아니라 방금 넘어간 메서드의 반환 값을 보는 것입니다. " OzCode " 라는 Visual Studio 상용 확장의 일부로 구현했습니다 .

이를 통해 코드 편집기에서 HUD 디스플레이의 일종으로 메소드 리턴 값을 볼 수 있습니다.

명세서 시각화

자세한 내용은 이 비디오 를 참조하십시오 .


Microsoft에 따르면 관리 코드로이를 안정적으로 구현할 수있는 방법이 없습니다. 이것은 그들이 알고 있고 작업중인 문제입니다.

네이티브 C ++ 또는 VB6 코드를 디버깅 한 경험이있는 사람들을 위해 Autos 창에서 함수 반환 값이 제공되는 기능을 사용했을 수 있습니다. 불행히도이 기능은 관리 코드에는 존재하지 않습니다. 반환 값을 로컬 변수에 할당하여이 문제를 해결할 수 있지만 코드를 수정해야하므로 편리하지 않습니다. 관리되는 코드에서는 어떤 함수의 반환 값을 결정했는지가 훨씬 까다 롭습니다. 여기서는 일관되게 올바른 작업을 수행 할 수 없으므로 디버거에서 잘못된 결과를 제공하는 대신 기능을 제거했습니다. 그러나이 문제를 해결하기 위해 CLR 및 디버거 팀이이 문제에 대한 여러 가지 잠재적 인 솔루션을 찾고 있습니다. 불행히도 이것은 Visual Studio 11의 일부가 아닙니다.

https://connect.microsoft.com/VisualStudio/feedback/details/597933/add-a-return-pseudo-variable-to-the-visual-studio-debugger-for-net-code


Visual Studio 2015와 관련하여 :

Marc Gravell의 현재 답변에 따르면 :

기능은 Visual Studio 2013에 추가되었습니다 . 자동차 창에서 반환 값을 보거나 watch / immediate 창에서 $ ReturnValue를 사용할 수 있습니다

그 대답은 또한 Visual Studio 2015에서는이 기능이 작동하지 않는다고 언급했습니다. 이것은 전적으로 사실이 아닙니다. 메소드 호출의 반환 값을 검사하여 다음 참고가있다 :

$ ReturnValue 를 인식 하려면 레거시 표현식 평가 기가 켜져 있어야합니다 (도구 / 옵션 / 디버깅 / 레거시 C # 및 VB 표현식 평가 기 사용 ). 그렇지 않으면 $ ReturnValue1을 사용할 수 있습니다 .

Visual Studio 2015 Enterprise에서 이것을 테스트했습니다.

  • 레거시 식 평가 기가 꺼져 있으면 $ ReturnValue1 작동합니다.
  • 레거시 식 평가 기가 설정된 경우 $ ReturnValue $ ReturnValue1이 작동합니다.

메뉴 도구옵션 , IntelliTrace로 이동하여 이벤트 및 통화 정보를 수집하도록 설정을 변경하십시오.

이전 호출 이벤트 ( Ctrl+ Shift+ F11)로 돌아가서 자동 창에서 메소드 호출에서 리턴 된 임시 값을 메소드 이름의 하위로 볼 수 있습니다.

이것은 현재 사용중인 메소드의 리턴 값을 표시하지 않습니다. 현재 메소드에서 마지막으로 호출 된 메소드의 리턴 값 만 표시합니다.

그래서 괜찮습니다

DataTable go(){return someTableAdapter.getSomeData();}

에 대한 반환 값을 보여줍니다 someTableAdapter.getSomeData().

그러나 아닙니다.

int go(){return 100 * 99;}

.NET 이전의 오래된 트릭 : 레지스터 창을 열고 EAX 레지스터 값을 확인하십시오. 여기에는 마지막으로 호출 된 함수의 반환 값이 포함됩니다.


Shift-F11을 사용하여 go () 메소드에서 빠져 나온 다음 "Autos"디버그 창에 스택에서 튀어 나온 메소드 호출의 반환 값 (이 경우 go () 메소드)이 표시됩니다. 원하는 것). 이것은 Visual Studio 2005의 동작입니다. Visual Studio 2008을 사용하지 않았으므로 해당 버전에서 동일한 방식으로 작동하는지 알 수 없습니다.


예, 아주 좋은 방법이 있습니다. 한 가지 중요한 단점은 5 년, 아마도 6 년을 기다려야한다는 것입니다. 2008 년 11 월에 게시 한 것을 확인한 후 와아 아아

... 아 아아아 그리고 voilà! 그냥 당신을 위해, MS는 최신 출시했습니다 비주얼 스튜디오 2013 는 메뉴에서 액세스 할 수있는 기본 기능의 실행하는 동안 디버그 모드 (메뉴에서 디버그윈도우자동차를 ).


해결 방법이 많이 있지만 만족할만한 것은 없습니다.

아래에서 John Skeet을 인용하려면 (지금 삭제 된 답변에 대한 주석) :

여전히 불편한 것처럼 보입니다. 특히 디버깅을 시작하기 전에 필요한 반환 값을 모르는 경우에 특히 그렇습니다. 나는 아무것도 반환 할 때마다 코드를 혼란스럽게 만드는 임시 변수를 갖고 싶지 않습니다 .t

이론적으로 디버거는- return변수를 가질 수 있습니다 . 결국 : 그것은 스택의 변수 일뿐입니다.

unsafe {
  int * sp = stackalloc int[1];
  try {
    return a+b;
  }
  finally {
    Trace.WriteLine("return is " + *(sp+3));
  }
}

따라서 이것을 Visual Studio에 대한 기능 요청이라고 생각하십시오.


Microsoft Visual C ++에서이 작업을 수행했지만 Visual Studio는 AFAIK가 아닙니다. :(


내가 아는 유일한 방법은 리턴 라인에 중단 점을 배치 한 다음 Quick Watch을 호출 하고 리턴 된 표현식을 입력하는 것입니다.

someTableAdapter.getSomeData();

그러나 이것은 호출이 객체의 상태를 변경하지 않는 경우에만 작동합니다 (실행을 재개 할 때 동일한 메소드에 대한 두 번째 호출이 있기 때문에).


메소드 호출의 반환 값 검사에 설명되어 있지 않은 숨겨진 기능이 있기 때문에 Visual Studio 2015 에서이 기능을 사용하기위한 PascalK의 답변 을 확장하고 싶었습니다 .

중첩 된 함수 호출이있는 경우 의사 변수 $ResultValueX가 자동으로 작성되며 여기서 X는 함수 호출 순서를 나타냅니다. 따라서와 같은 호출이있는 경우 Multiply(Five(), Six())다음 의사 변수가 작성됩니다.

Five()     | $ResultValue1 = 5
Six()      | $ResultValue2 = 6
Multiply() | $ResultValue3 = 30

플래그 나 다른 변수를 설정하지 않고 무언가 만 반환하는 경우 중간 창의 값을 평가하도록 요청할 수도 있습니다.


Registers 창 (Debug / Windows / Registers)에서 RAX register를 보면이를 결정할 수 있다고 생각합니다. 기능을 제거한 후 (SHIFT + F11) RAX 레지스터를 확인하십시오. 사실을 모르지만 한 달에 한 번 등록하면 (.NET 이전) 레지스터를 확인하고 반환 값을 볼 수 있습니다. RAX와 RBX 등의 조합 일 수도 있습니다.


디버그 → 자동 창을 열면 닫힙니다. 실제 반환 값은 표시하지 않지만 return 문에서 평가 된 내용을 표시합니다.


예, VB.NET으로 전환하면 ; P (방금 "Visual Studio"라고 말 했어요.)

내가 기억할 수있는 한 (Visual Basic에서 모든 VB.NET 버전까지) 함수 이름을 쿼리 할 수 ​​있습니다. 함수의 시작 부분에 암시 적으로 선언 된 로컬 변수와 같이 "함수"이며 현재 값은 함수가 반환되지 않는 명령문을 통해 종료 될 때마다 (즉 Exit Function, 그냥 넘어가는 경우) 반환 값으로 사용 됩니다. return 문이 사용됩니다.

또한 return 문의 표현식으로 설정됩니다. 로컬 변수와 마찬가지로 함수 내에서 실행 시점 (return 문 실행 후 포함)에서 해당 값을 검사 할 수 있습니다. C #에는 이것이 없어야합니다.

그 작은 VB.NET 기능 (그리고 Exit Function그것을 가능하게 하는 진술-또 다른 기능 C #은 가지고 있지 않고 해야하는 문장)은 방어 프로그래밍 의 형태로 매우 유용합니다. 항상 함수 이름을 첫 번째 진술. 그런 다음 모든 실패 지점 (일반적으로 성공 지점보다 훨씬 자주 발생)에서 간단히 Exit Function명령문을 호출 할 수 있습니다 (예 : 실패 / 기본 표현식 또는 상수 / 변수 이름을 복제하지 않아도 됨).


수락 된 답변 은 Visual Studio 2015에서 제대로 작동하지 않지만 메서드의 마지막 줄에 중단 점을 놓고를 누르면 F10반환 값의 모든 표현식이 지역 창에 나타납니다.


을 선택 "someTableAdapter.getSomeData();"하고 마우스 오른쪽 버튼으로 클릭 한 다음 Quick Watch 로 이동할 수 있습니다.


리턴 표현식을 조사 식 창으로 끌어서 놓으십시오.

예를 들어, 진술에서

return someTableAdapter.getSomeData();

끌어서 놓기

someTableAdapter.getSomeData()

조사 식 창에 들어가면 값이 표시됩니다.

모든 표현에 대해이 작업을 수행 할 수 있습니다.

참고 URL : https://stackoverflow.com/questions/268048/can-i-find-out-the-return-value-before-returning-while-debugging-in-visual-studi



반응형