이 명령어 포인터에서 사용할 수 없으므로 로컬 또는 인수의 값을 얻을 수 없습니다.


211

Visual Studio 2010은 안전하지 않은 블록에서 함수의 인수 중 하나에서 데이터를 제거합니다 (다른 단어는 없음). 이 오류의 원인은 무엇입니까? 다음 메시지는 디버거에 의해 표시됩니다.

Cannot obtain value of local or argument as it is not available at this instruction pointer, possibly because it has been optimized away.

2
나는 정확히 같은 문제가 있고 디버그 빌드를 사용하고 있습니다. Cannot obtain value of local or argument '<this>' as it is not available at this instruction pointer, possibly because it has been optimized away. System.Threading.Tasks.TaskExceptionHolder
javapowered

19
죄송합니다. 실수로 릴리스를 선택했습니다.
Daniel Little

VS 2017 에서이 문제가 발생했으며 아래 게시물의 모든 지침을 따랐습니다. 다른 옵션이 있습니까?
매트 W

메뉴 빌드-> 구성 관리자를 잊지 마십시오. 구성을 디버그로 설정해야합니다. 그렇지 않으면 여전히 문제가 발생합니다.
밥 클레 그

답변:


344

프로젝트 속성으로 이동하여 빌드에서 "코드 최적화"체크 상자가 선택 해제되어 있는지 확인하십시오.

또한 고급 옵션 (빌드 탭 아래)에서 "디버그 정보"드롭 다운을 "전체"로 설정하십시오.


128
먼저 빌드 구성이 릴리스가 아닌 디버그인지 확인하십시오.
ApceH Hypocrite

그런데 릴리스 모드에서 테스트하려면 "Debugger.Launch ();"를 추가하면됩니다. 코드에서
Jason

두 단계를 모두 수행하고 구성을 "릴리스"에서 "빌드"로 변경했습니다. Visual Studio 2017 Community Edition에서 작업했습니다.
Neo

1
VS 2017을 사용하는 경우 허용되는 답변과 xyq.384.b의 답변이 모두 도움이됩니다. 나를 위해 xyq.384.b 대답은 포인터를 억제하는 JIT 디버거 였으므로 수정되었습니다 ... JIT가 "최적화되었습니다"...
BillRuhl

디버그 구성으로 전환 한 후 최적화 코드 상자가 이미 선택되어 있지 않은 것을 발견했습니다. 교훈 : 릴리스 구성 모드에서 디버깅하지 마십시오.
eliteproxy

135

VS 2015 Community Edition에서도

디버그-> 옵션 또는 도구-> 옵션으로 이동하십시오.

모듈로드에서 디버깅-> 일반-> JIT 최적화 억제 (관리 전용)를 확인하십시오.


7
위에서 언급 한 모든 솔루션을 적용한 후에 문제가 해결되었습니다.
masih

1
제안 된 답변 중 어느 것도 나를 위해 작동하지 않습니다. 내 변수는 여전히 최적화되어 있습니다 ...
Sushi271

왜 갑자기 이런 일이 발생했는지 모르겠습니다.
Murphybro2

이런 쓰레기, 이것은 VS2017 커뮤니티에서 나를 위해 고쳤습니다! 아니 생각하는 경우 또는이 옵션을 ... 선택 해제 됐는지
이안 켐프

챔피언처럼 작동합니다!
BillRuhl

59

최적화가 활성화 된 상태에서 컴파일하면 많은 변수가 제거됩니다. 예를 들면 다음과 같습니다.

SomeType value = GetValue();
DoSomething(value);

여기서 로컬 변수 value는 일반적으로 스택에 값을 유지하면서 제거됩니다.

DoSomething(GetValue());

또한 반환 값 이 전혀 사용되지 않으면 "stloc"을 통해 로컬에 저장되지 않고 "pop"을 통해 삭제되고 로컬은 존재하지 않습니다.

이 때문에, 그러한 빌드에서 디버거는 존재하지 않기value 때문에 현재 값을 얻을 수 없습니다.- 와 사이의 짧은 순간에 대해서만 존재합니다 .GetValue()DoSomething(...)

그래서; 디버그하고 싶다면 릴리스 빌드를 사용하지 마십시오! 또는 디버깅하는 동안 최적화를 비활성화하십시오.


4
귀하의 답변에 감사드립니다-그러나 프로젝트에서 코드 최적화 속성을 선택했는데 선택되지 않았습니다 = (
curiousity

4
@Marc-나는 당신이 말하는 것을 이해하지만 Microsoft의 참조 소스 라이브러리를 사용하여 자체 쓰레기를 단계별로 코딩하고 있습니다. 나는 지금 방법을 밟고 있지만 지역 주민의 가치를 보지 못하는 것 같습니다. 그렇다면 .Net 소스를 디버깅하는 요점은 무엇입니까? 어떤 제안? stackoverflow.com/questions/13147132/…
one.beat.consumer

@ one.beat.consumer와 같은 일을하는 것 같습니다. ASP.NET 프레임 워크가 작동하지 않는 이유를 이해하기 위해 Microsoft 공개 기호를 단계별로 시도합니다. 내 경우에는 MVC 3에서 모델 바인딩 ...
bambams

@ one.beat.consumer Microsoft 참조가 최적화를 사용하여 컴파일 되었기 때문에 가정합니다. 소스 코드를 다운로드하여 값이 사라지는 것을 볼 수는 있지만 최적화를 사용하여 프로젝트를 컴파일하는 것처럼 가능. 특정 프로젝트 (dll)입니다. MS 참조의 "디버그"버전을 얻을 수 있으면 값을 볼 수 있습니다. 주 프로젝트가 참조하는 다른 프로젝트에서 MS dll을 참조한 경우 "하위 참조"는 다른 프로젝트의 설정과 일치 할 수 있습니다.
drzaus

22

http://www.guntucomputerhacks.blogspot.com.au/2014/07/cannot-obtain-value-of-local-or.html

이것은 Visual Studio 2013에서 저에게 효과적이었습니다.

당신이해야 할 일은 ..

  1. 디버깅 할 수없는 프로젝트를 마우스 오른쪽 버튼으로 클릭하십시오.
  2. 프로젝트 속성으로 이동하십시오.
  3. 빌드 메뉴를 클릭하십시오.
  4. 고급 버튼을 클릭하십시오.
  5. 디버그 정보 드롭 다운 값을 전체로 설정하십시오.
  6. 프로젝트를 다시 빌드하십시오.

20

방금 이것에 부딪 쳤고 Release빌드 구성 대신 빌드 구성 으로 실행 중이었습니다 Debug. Debug변수 로 다시 전환 하면 시계에 다시 표시됩니다.



8

동일한 문제에 직면했을 때 다시 빌드하기 전에 솔루션을 청소해야했습니다. 그것은 나를 위해 그것을 처리했다.


6

"코드 최적화"속성이 확인되지 않은 문제와 관련하여 코드는 여전히 최적화 된 상태로 컴파일됩니다. 모든 것을 시도한 후에 마지막으로 도움이 된 것은 동일한 설정 페이지 (프로젝트 속성-디버그)에서 "관리되지 않은 코드 디버깅 사용"확인란을 선택하는 것입니다. 코드 최적화와 직접 관련이 없지만이 기능을 사용하면 VS가 더 이상 내 라이브러리를 최적화하지 않으므로 디버깅 할 수 있습니다.


1
두 번째 제안은 모두 다시 작동하게 해주었습니다. 감사합니다!
CodeMilian

1
VS 2015에서는 보이지 않습니다 Enable unmanaged code debugging. 이 Enable native code debugging검사를 시도했지만 아무런 차이가 없었습니다.
알 Lelopath

1
VS 2015에서 프로젝트 빌드, 웹, 디버거에서 "기본 코드 사용"을 확인했으며 모두 작동했습니다.
머펫

6

나는 같은 문제에 직면 해 있었고 해결책은 변화입니다. Solution Configuration 에서 Release로 되었습니다 Debug. 그것이 도움이되기를 바랍니다.


4

필자의 경우 웹 API 프로젝트에서 작업하고 있었고 프로젝트가 전체 디버그로 올바르게 설정되었지만 IIS 프로세스에 연결할 때마다 디버깅하려고 할 때 마다이 오류가 계속 발생했습니다. 그런 다음 공개 프로파일이 릴리스 구성을 사용하도록 설정되었음을 깨달았습니다. 따라서 닷넷 웹 API 프로젝트의 '게시'기능을 사용하는 경우 공개 프로파일이 한 가지 더 있습니다.


3

IIS 프로세스에 연결하여 프로젝트를 실행하고 디버깅 할 때도 같은 문제가 있음을 알았습니다. 또한 최적화가 꺼진 상태에서 디버그 모드로 실행 중이었습니다. 코드가 잘 컴파일되었다고 생각했지만 분리하고 컴파일하려고 할 때 참조 중 하나를 찾을 수 없었습니다. 이것은 다른 개발자가 여기에서 수정하고 참조 위치를 변경했기 때문입니다. 참조에는 경고 기호가 표시되지 않았으므로 컴파일을 완료 할 때까지 모든 것이 정상이라고 생각했습니다. 참조를 수정하고 다시 실행하면 작동했습니다.


1

Azure 웹 사이트의 웹앱을 디버깅 할 때이 문제가 발생하는 사람들을위한 추가 답변 :

예를 들어 GitHub에서 배포 할 때 코드는 Azure 서버 최적화로 컴파일됩니다. 기본적으로 됩니다.

서버를 다음과 같이 설정 SCM_BUILD_ARGS하여 디버깅 가능한 방식으로 컴파일하도록 지시합니다./p:Configuration=Debug

그러나 더 많은 옵션이 있습니다. 참조 : http://azure.microsoft.com/blog/2014/05/08/introduction-to-remote-debugging-on-azure-web-sites-part-3-multi-instance-environment-and-git /


1

Visual Studio 2012에서 :

프로젝트 속성으로 이동-> 디버그-> "Visual Studio 호스팅 프로세스 활성화"를 선택 취소하십시오.


1

웹 응용 프로그램의 경우 중요한 또 다른 문제가 있으며 응용 프로그램 게시 프로세스 중에 올바른 구성을 선택하고 있습니다.

앱을 디버그 모드에서 빌드 할 수 있지만 기본적으로 코드를 최적화하는 릴리스 모드로 앱을 게시 할 수 있지만 게시 된 코드가 릴리스 모드에있는 동안 디버그 모드를 표시하므로 IDE가 잘못 표시 될 수 있습니다. 아래 스냅 샷에서 세부 사항을 볼 수 있습니다. 여기에 이미지 설명을 입력하십시오


0

AssemblyInfo 파일에 디버그 가능 속성이 있는지 확인하십시오. 있는 경우 제거하고 솔루션을 다시 빌드하여 로컬 변수를 사용할 수 있는지 확인하십시오.

내 디버그 가능 속성은 다음으로 설정되었습니다. DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints 이 MSDN 기사 에 따르면 JIT 컴파일러에 최적화를 사용하도록 지시합니다. AssemblyInfo.cs 파일에서이 행을 제거했으며 로컬 변수를 사용할 수있었습니다.


0

Visual Studio 2017 또는 2015에서 :

솔루션으로 이동하여 솔루션을 마우스 오른쪽 버튼으로 클릭하고 속성-> 모든 구성-> 디버그를 선택한 다음 확인을 클릭하십시오. 다시 빌드하고 실행 한 후에이 솔루션이 효과적이었습니다.


0

나는 같은 문제가 있었다. 위의 모든 것을 시도하고 내 프로젝트의 {PROJECT_ROOT} \ bin \ Release \ netcoreapp2.2 및 {PROJECT_ROOT} \ obj \ Release \ netcoreapp2.2 내부의 모든 항목도 삭제해야한다는 것을 알았습니다. Azure Web App에서 배포 도구 / 비트 버킷을 사용하더라도 실제로 배포 된 파일을 검사하기 위해 빌드 >> 게시 >> 게시를 시도했기 때문에 게시와 관련이있었습니다.


0

WPF 응용 프로그램에서 이전에 동일한 문제가 있었으며 여기에있는 모든 솔루션으로 문제가 해결되지 않았습니다 . 문제는 모듈이 이미 최적화되어 다음 솔루션이 작동하지 않거나 문제를 해결하기에 충분하지 않다는 것입니다.

  • " 코드 최적화 "체크 상자가 선택 해제 됨
  • " 모듈로드시 JIT 최적화 억제 "가 선택되었습니다.
  • DEBUG의 솔루션 구성

모듈은 여전히 ​​최적화되어 있습니다. 다음 스크린 샷을 참조하십시오 : 최적화 된 모듈


이 문제를 해결하려면 최적화 된 모듈을 삭제해야합니다. 최적화 된 모듈 경로를 찾으려면 Process Hacker 와 같은 도구를 사용할 수 있습니다 .

" 프로세스 패널 " 에서 프로그램을 두 번 클릭 한 다음 새 창에서 " .NET 어셈블리 " 탭을 엽니 다 . 그런 다음 " 기본 이미지 경로 " 열에 모든 최적화 된 모듈 경로가 있습니다. 최적화를 해제 하고 폴더를 삭제하려는 폴더 를 찾으십시오 (아래 스크린 샷 참조). 여기에 이미지 설명을 입력하십시오 (명백한 이유로 회사 이름을 흐리게 표시했습니다)

1 단계의 확인란을 올바르게 선택 하여 응용 프로그램을 다시 시작 하면 작동합니다.

참고 : 다른 프로세스에서 파일 을 열었을 때 파일이 잠겨있 을 수 있습니다 . Visual Studio를 닫으십시오. 파일이 여전히 잠겨 있으면 Lock Hunter 와 같은 프로그램을 사용할 수 있습니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.