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

StackOverflow https://stackoverflow.com/questions/268048

문제

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

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

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

반환된 데이터 테이블을 검사하는 유일한 방법은 임시 변수를 사용하는 것입니다.그런데 그게 좀 불편하네요.다른 방법은 없을까요?

도움이 되었습니까?

해결책

내가 아는 한에서는 아니다.만약 당신이 하다 변수를 추가하면 어쨌든 릴리스 빌드에서 컴파일러에 의해 제거됩니다.

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

값은 함수에서 반환된 후에만 직접 볼 수 있으므로 값에 액세스하는 가장 쉬운 방법은 함수 호출에 중단점을 설정하고 호출을 한 단계씩 건너뛰는 것(F10)입니다.


VS2015 업데이트:우우!불행히도 VS2015(devenv v14)에는 없는 것 같습니다.
VS2017 업데이트:돌아왔다.(devenv v15)

다른 팁

이것은 CLR 4.5.1을 사용하여 Visual Studio 2013에서 수행 할 수 있습니다. 고객 피드백 사이트에 따르면. C#의 이전 버전에서는 사용할 수 없었습니다.

(Visual Studio 2008과 이전에는 vb.net을 위해이를 지원했습니다. 항상 C/C ++ 개발자가 사용할 수있었습니다.)

나는 이것이 매우 유용한 것임에 동의합니다. 방법에서 벗어나기 전에 방법의 반환 값을 볼뿐만 아니라 방금 밟은 메소드의 반환 값을 볼 수도 있습니다. 나는이를 비주얼 스튜디오에 대한 상업용 확장의 일부로 구현했다.오즈 코드".

이를 통해 코드 편집기에서 메소드 리턴 값을 바로 볼 수 있습니다.

Statement Visualization

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

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

기본 C ++ 또는 VB6 코드를 디버깅 한 경험이있는 사람들의 경우 자동 창에서 기능 리턴 값이 제공되는 기능을 사용했을 수 있습니다. 불행히도이 기능은 관리되는 코드에 대해 존재하지 않습니다. 리턴 값을 로컬 변수에 할당 하여이 문제를 해결할 수 있지만 코드를 수정해야하기 때문에 편리하지 않습니다. 관리되는 코드에서는 한 단계 더 내린 함수의 반환 값을 결정하는 것이 훨씬 까다 롭습니다. 우리는 여기서 옳은 일을 일관되게 할 수 없다는 것을 깨달았으므로 디버거에서 잘못된 결과를 제공하기보다는 기능을 제거했습니다. 그러나 우리는 당신과 우리의 CLR을 위해 이것을 다시 가져오고 싶습니다. 그리고 우리의 CLR과 디버거 팀은이 문제에 대한 많은 잠재적 솔루션을 찾고 있습니다. 불행히도 이것은 Visual Studio 11의 일부가 아닙니다.

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

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

이것 기능은 Visual Studio 2013에 추가되었습니다. Autos Windows에서 반환 값을 볼 수 있거나 시계/즉시 Window에서 $ returnValue를 사용할 수 있습니다.

이 답변은 또한이 기능이 Visual Studio 2015에서 작동하지 않는다고 언급했습니다. 이것은 (전적으로) 사실이 아닙니다. 에 메소드 호출의 반환 값을 검사하십시오 다음 사항이 있습니다.

레거시 표현 평가자가 켜져 있어야합니다. $ returnValue 인정 받기 위해 (도구 / 옵션 / 디버깅 / 레거시 C# 및 VB 표현 평가자 사용). 그렇지 않으면 사용할 수 있습니다 $ returnValue1.

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

  • 레거시 표현 평가자가 꺼져 있습니다. $ returnValue1 공장
  • 레거시 표현 평가자가 켜져 있습니다. 둘 다 $ returnValue 그리고 $ returnValue1 일하다

메뉴로 이동하면 도구옵션, Intellitrace, 설정을 변경하여 이벤트를 수집하고 정보를 호출하십시오.

이전 통화 이벤트로 돌아갈 수 있습니다 (Ctrl 키 + 옮기다 + f11) 그리고 메소드 윈도우의 메소드 호출에서 반환 된 임시 값을 메소드 이름의 자식으로보십시오.

이것은 당신이있는 메소드의 반환 값을 보여주지 않습니다. 그것은 단지 현재 메소드에서 호출 된 마지막 메소드의 반환 값을 보여줍니다.

그래서 괜찮습니다

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

그것은 당신에게 반환 값을 보여줍니다 someTableAdapter.getSomeData().

그러나 :

int go(){return 100 * 99;}

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

Shift-F11을 사용하여 go () 메소드에서 나온 다음 "자동"디버그 창에서 스택에서 막 나면 메소드 호출의 반환 값을 표시합니다 (이 경우 go () 메소드는 당신이 원하는 것). 이것은 Visual Studio 2005의 행동입니다. 나는 Visual Studio 2008을 사용하지 않았으므로 이것이 해당 버전에서 같은 방식으로 작동하는지 모르겠습니다.

예, 아주 좋은 방법이 있습니다. 중요한 단점 중 하나는 5, 6 년을 기다려야한다는 것입니다. 2008 년 11 월에 게시 한 것을 보았으므로 Waaaaaa ...

... aaaait. 그리고 Voilà! MS는 최신 정보를 발표했습니다 Visual Studio 2013 메뉴에서 액세스 할 수있는 기본 기능 인 경우 달리는 동안 디버그 모드 (메뉴 디버그자동차).

해결 방법이 많지만 만족스럽지 않은 것 같습니다.

아래에 John Skeet (현재 삭제 된 답변에 대한 의견) :

여전히 저에게 불편 해 보입니다. 특히 디버깅을 시작하기 전에 필요한 반환 값을 모르는 경우. 나는 무엇이든 반환 할 때마다 내 코드를 혼란스럽게하는 임시 변수를 갖고 싶지 않습니다.

이론적으로 디버거는 a 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 .. :(

내가 아는 유일한 방법은 리턴 라인에 중단 점을 배치 한 다음 빠른 시계 창문을 입력하고 반환 된 표현식을 입력하십시오.

someTableAdapter.getSomeData();

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

나는 확장하고 싶었다 Pascalk의 대답 Visual Studio 2015 에서이 작업을 수행 할 수 있도록 메소드 호출의 반환 값을 검사하십시오.

함수 호출 중첩 된 경우 의사 변수 $ResultValueX x가 함수 호출 순서를 나타냅니다. 여기서 자동으로 생성됩니다. 그러니 당신이 다음과 같은 전화가있는 경우 Multiply(Five(), Six()), 다음의 의사 변수가 만들어집니다.

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

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

레지스터 창 (디버그 / Windows / Registers)의 RAX 레지스터를 살펴보면이를 결정할 수 있다고 생각합니다. 함수의 물러나면서 (Shift + F11) RAX 레지스터를 점검하십시오. 나는 사실을 알지 못하지만, 달에 달에 레지스터를 확인하고 (.NET 일) 반환 값을 볼 수 있습니다. RAX와 RBX 등의 조합 일 수도 있습니다.

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

네, 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();", 마우스 오른쪽 버튼을 클릭하고 가십시오 빠른 시계.

리턴 표현식을 시계 창으로 드래그하여 떨어 뜨립니다.

예를 들어, 진술에서

return someTableAdapter.getSomeData();

끌어서 놓기

someTableAdapter.getSomeData()

시계 창으로, 당신은 가치를 볼 수 있습니다.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top