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


387

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

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

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

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


1
콜 스택을 다시 올리면 시계를 추가 할 수 있습니다
Chris S

당신은 VB6에서 이것을 할 수있었습니다. 그러나 그 당시 함수의 구문은 함수의 값을 반환 값으로 설정하는 것과 관련이있었습니다.
Neil Barnwell

5
Visual C ++ 사용자를위한 주석 : 직접 실행 창 또는 조사 식 창에 $ ReturnValue를 입력하십시오. 적어도 내 VS 2010에서는 효과가있었습니다!
sergiol

9
VS2015의 경우 $ ReturnValue1 ..을 사용하십시오. 아래 20 개의 답변과 100 개의 의견을 읽고 싶지 않다면!
felickz

3
이 모든 것에 대한 2019 년 답변은 무엇입니까? 이 답변은 최신 정보입니다.
dylanh724

답변:


264

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

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

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


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


12
온도를 잊는 이유는 효율성이 아니라 가독성과 스타일 때문입니다.
orip

8
VS 2010 이후 IntelliTrace를 통해 가능합니다 : blogs.msdn.com/b/habibh/archive/2009/10/23/…
Daniel Hilgarth

2
Intellitrace는 VS Ultimate Edition에서만 사용할 수 있습니다.
JMGH

3
@MarcGravell 귀하의 답변이 잘못되었습니다 ! 물론, VS13에서 해당 기능을 릴리스하는 귀하의 회신과 MS 사이에 6 년이 걸렸지 만 여전히 그렇습니다. 당신은 단지 "추가했다 싶다면 당분간 부인으로"... (아니, 나는 지체하지 않다 그것은. 입니다 물론, 농담 당신은있는 거 신과, 동료..)
콘라드 Viltersten

6
VS2015의 @MarcGravell : $ ReturnValue1이 작동합니다! (최종 버전에서 테스트)
GY

58

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

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


1
Visual Studio 2010 C ++에서이 작업을 어떻게 수행합니까?
사용자

마이크로 소프트 커넥트는 관리 코드에 근본적인 문제가 있으며이를 신뢰할 수있는 방식으로 구현하지
못하고

@DanSolovay 그들이 사용하는 단어는 "우리는 일관되게 옳은 일을 할 수 없었습니다"(VS11의 경우)지만 "이것을 되찾고 싶어"그리고 "이 문제에 대한 여러 가지 잠재적 인 해결책을 찾고 있습니다"입니다.
Alex Angas

연결 항목이 오래되었습니다. 이 기능은 ... 버려진 것 같습니다 : ((((
Softlion

1
VS 2010 이후 IntelliTrace를 통해 가능합니다 : blogs.msdn.com/b/habibh/archive/2009/10/23/…
Daniel Hilgarth

25

나는 이것이 매우 유용한 일이라는 데 동의합니다. " OzCode " 라는 Visual Studio 상용 확장의 일부로 구현했습니다 .

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

명세서 시각화

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


23

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


1
위의 @Alex ( stackoverflow.com/a/3714884/402949 )에 따라 CLR 4.5가있는 VS2013에서 사용할 수 있습니다
Dan Solovay

21

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 모두 작동

3
더 이상 필요하지 않은 것 같습니다. VS 2015 업데이트 3에서는 레거시 평가자가 비활성화되어 $ReturnValue작동합니다. 그러나 Use managed compatibility mode디버깅 옵션을 활성화 하면 반환 값이 어디에도 나타나지 않습니다 .
Nick

13

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

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

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

그래서 괜찮습니다

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

에 대한 반환 값을 보여 주므로 someTableAdapter.getSomeData() .

그러나 아닙니다.

int go(){return 100 * 99;}

12

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


1
금속 접근법에 더 가까운 구식 학교의 경우 +1-그러나 모든 반환 값에는 적용되지 않습니다 (그리고 분명히 JIT에게는 달려 있습니다. 누가 EAX를 사용하지 않을 것인지에 대해 어떤 미친 최적화를 결정할 수 있습니까? ). 정수 유형의 경우 (주로?) 작동합니다. 큰 값 유형은 다른 문제입니다 (그리고 일부 블로그 게시물에서 기억하는 한 VS2013에도 표시되지 않습니다).
JimmiTh

10

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


VS2005와 VS2008에서 모두 시도했지만 실제로는 보지 못합니다. "자동"창이 열려 있지만 "go"기능에있을 때 자동 창이 비어 있습니다. 또한 기능에서 벗어날 때 (기능의 닫는 중괄호는 노란색입니다). 힌트 하나 더 주실 래요?
doekman

go () 함수 내부에 자동 창이 비어있을 것으로 예상합니다. 함수에서 COMPLETELY OUT 단계를 수행해야합니다 (예 : 디버그 커서가 CALLED go ()가있는 함수를 가리켜 야 함). 그러면 Autos 창에 go ()에 대한 반환 값이 표시되어야합니다.
LeopardSkinPillBoxHat

@LeopardSkinPillBoxHat : 추가 힌트가 있어도 작동하지 않습니다. Visual Basic에서 이것을 시도하고 있습니까? ... 반환 값을 관찰하고 변화에 대한 더 나은 지원이 보인다
로마 Starkov

@romkyns- "자동"창에 무엇이 나타 납니까? 마지막으로 호출 된 함수가 반환 한 것을 나타내는 줄이 표시되지 않습니까?
LeopardSkinPillBoxHat

2
@ LeopardSkinPillBoxHat : 아니요, C #에서는 그렇게하지 않습니다. 추신 : 와우, 이것을 다시 볼 시간이 걸렸습니다.
Roman Starkov

7

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

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


@Doug 질문이 2008 년 11 월에 요청되었고 2014 년 9 월에 답장을 받았기 때문에 원래 포스터는 만족스럽고 크레딧을 옮기고 싶지 않습니다. 그러나 나는 당신에게 동의합니다-나는 내 대답에 대한 몇 가지 더 많은 걱정을하지 않을 것입니다. 나는 upsies와 rep gain을 좋아한다. :)
Konrad Viltersten

오늘이 문제가있었습니다. 초기 문제는 2008 년이지만 2014 년에 답장을 보내 주셔서 감사합니다. 귀하의 답변은 제가 찾고 있던 것입니다.
AP

@AP 문제 없습니다. 이 게시물을 보는 타임머신 같은 느낌입니다. 과거로부터의 폭발.
Konrad Viltersten

5

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

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

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

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

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

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


변수 (잘 정의 된 로컬)와 스택의 값 사이에는 큰 차이가 있습니다. 스택의 값이지만 변수가 아닙니다 (= local).
Marc Gravell

@Marc : CLR의 작동 방식을 잘 모르겠지만 많은 컴파일러가 스택 포인터 (sp) 아래 스택에 함수 인수를, 스택 포인터 위에 스택의 로컬 변수를 넣습니다. 그것이 내가 보여 주려고하는 것입니다. 그리고 반환 값이 참조 유형 일 때 포인터 값을 얻습니다.
doekman

1
반드시 스택에있는 것은 아닙니다. 실제로 디버그-> 레지스터를 보면 EAX에서 볼 수 있습니다
Mark Sowul

5

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

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

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


2

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

someTableAdapter.getSomeData();

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


5
표현식에 람다가없는 경우에만 작동합니다.
Roman Starkov

1

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


직접 창을 너무 자주 사용하기 때문에 질문에 람다를 포함시켜야합니다.
Chris S

1

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


1

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


2
VS2008 자동 창에 그런 것을 표시하지 못했습니다. 명확하게 설명해 주시겠습니까?
Roman Starkov

return x + y; 이 줄에 중단 점을 설정하면 Debug-Autos 창에 x 및 y의 현재 값이 표시됩니다. 내가 말했듯이, 그것은 단지 당신을 가까이합니다. 그냥 도움을 주려고 나는 그것이 공감할 가치가 있다고 생각하지 않습니다.
GeekyMonkey

1

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

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

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

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


1

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


허용 된 답변을 편집하여 의견을 포함 할 수도 있습니다.
doekman

0

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


-1

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

예를 들어, 진술에서

return someTableAdapter.getSomeData();

끌어서 놓기

someTableAdapter.getSomeData()

조사 식 창에 값이 표시됩니다.

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


2
그 문제 :식이 두 번 평가됩니다.
doekman

6
시계 식에는 람다 식을 포함 할 수 없으며 공정한 비트를 사용합니다.
Steve Crane
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.