2010-08-06 4 views
12

여러 이유 때문에 필자는 함수에 대한 최적화 된 컴파일러 출력을 살펴 보는 것이 유용하거나 흥미로운 경우가 종종 있습니다.최적화 된 jitted .NET 코드의 디스 어셈블리를 보려면 어떻게해야합니까?

언 매니지 된 C/C++ 코드의 경우 가장 좋아하는 방법은 릴리스 모드에서 컴파일하고 관심있는 기능에 중단 점을 지정하고 실행 한 다음 중단 점에 도달하면 Visual Studio에서 디스 어셈블리를 확인하는 것입니다.

최근에 C# 프로젝트에서이 작업을 시도했지만 그 기술이 작동하지 않는다는 것을 발견했습니다. 릴리스 모드에서도 볼 수있는 디스 어셈블리가 분명히 최적화되어 있지 않습니다. 디버그 ... 옵션 및 설정 ... 디버깅 ... 일반 ... 모듈로드시 JIT 최적화 사용 안 함 옵션을 선택했는데, 원하는대로 더 가까이 다가 갈 수 있습니다. 이제는 실행하려고 할 때 경고 메시지가 나옵니다. 그런 다음 중단 점에서 멈추어서 해체를 볼 수 없습니다.

그렇다면 함수에 대한 CLR (4.0) 지터의 분해되고 최적화 된 출력을보고 싶다면 그것에 대해 가장 좋은 방법은 무엇입니까? 분명한 것은 IL 분해 (반사경에서 볼 수 있음)가 아닌 x86 (또는 선호하는 x86_64) 분해를보고 싶습니다.

답변

11

물론,이 하나에 대한 답변을 검색 반나절 후, 나는 5 분 후에 내가 물어 후에 대답을 찾으십시오.

나는 가까웠다. 내가 가진 질문에서 빠진 유일한 단계는 옵션에서 "내 코드 만 사용"을 선택 취소해야한다는 것입니다.

전체 가이드는 여기에 있습니다 : http://blogs.msdn.com/b/vancem/archive/2006/02/20/535807.aspx

+0

그런 일이 발생하면 그 사람을 사랑 (증오)하지 않으시겠습니까? :) – leppie

+0

@ leppie : 꽤 많이. 해결책을 찾기 위해 검색 할 문구를 아는 솔루션을 알아야 할 필요가있는 경우입니다 ... –

0

NGEN 어셈블리를 검사 해 볼 수는 있지만 메타 데이터가 없으면 상당히 어려울 것입니다. 하지만 그것은 작동 할 수 있습니다 :)

3

난 당신이 디버거에서 실행중인 경우 JIT 알고 생각하고, 86 코드는 당신이 본 이유를 설명 할 더 "디버거 친화적 인"86 코드를 생성 최적화되지 않았습니다.

독립 실행 형 응용 프로그램을 실행하여 적어도 한 번 이상 (예 : 디버거가 연결되지 않은 JIT) 원하는 코드를 실행 한 다음 디버거를 프로세스에 연결하고 중단 점을 설정할 수 있습니다.

0

디버그 또는 릴리스 모드에 있는지 여부에 관계없이 VisualStudio에서 실행하면 여전히 디버거에서 실행됩니다. 디버거에서 실행 중이므로 최적화 된 코드로는 작동하지 않습니다.

+1

사실입니까? 그렇다면 왜 디버거를 독립적으로 실행되는 프로세스에 디버거를 연결할 수 있습니까? VS가 네이티브 앱도 디버깅 할 수 있다는 것을 잊지 마십시오. C# 또는 IL 대신 디스 어셈블리 (어셈블리 명령어) 만 볼 수 있으며 로컬 대신 레지스터를 볼 수 있습니다. 디버거를 사용하여 시작하지 않은 프로세스에 연결하는 경우 SOS.dll을로드하여 메모리로 추가로 가져올 수 있는지 확실하지 않습니다. 또한 .NET 4, iirc를 사용하여 기본 디버깅/계측 API에 대한 일부 내용을 변경했습니다. –

1

최적화 된 코드의 중단 점은 인라인 된 함수에서 작동하지 않습니다. 인라인 함수의 디스 어셈블리를 보려면 소스 코드에 System.Diagnostics.Debugger.Break(); 명령을 삽입하면됩니다.

관련 문제