2013-06-20 2 views
6

실행 파일을 릴리스 모드로 컴파일 할 때 (코드 최적화가 활성화 된 경우) 컴파일러는 성능을 향상시키기 위해 특정 조건을 충족하는 함수를 인라인하도록 선택할 수 있습니다.throw 된 예외에서 인라인 된 함수의 스택 추적이 보존됩니까?

내 질문은 : 인라인 된 함수 본문에 예외가 throw되면 stacktrace 정보가 인라인 확장에 관계없이 유지됩니까? 즉, 원본 함수를 오류의 원인으로 표시하거나 대신 호출 함수를 표시합니까?

답변

5

예외가 발생하는 방법에 따라 다릅니다. throw 문을 사용하면 문제가 없지만 지터는 throw가 포함 된 인라인 메서드를 사용하지 않습니다. 당신이 속성 세터가 필요할 때를 알아야 할 것.

그러나 NullReferenceException 또는 IndexOutOfRangeException 등의 정상적인 실행으로 인해 예외가 발생하면 인라인 된 경우 스택 추적에 메서드 이름이 표시되지 않습니다. 약간 당황 스러울 지 모르지만 일반적으로 호출하는 메소드의 소스 코드와 예외 유형에서 알 수 있습니다. 바라기를 그것은 상대적으로 작다. [MethodImpl(MethodImplOptions.NoInlining)] 특성을 사용하여 인라인을 억제 할 수 있습니다. 당신이 그것을 발견했을 때 그것은 일반적으로 너무 늦었다;)

+0

한스, 언제나처럼, 바로 그 자리에 고맙습니다! =) –

6

이 최종 답변 아니지만 난 .NET 4.5에서 인라인을 (실제로 인라인을 수행)에 JIT 에 대한 힌트를 제공하는 [MethodImpl(MethodImplOptions.AggressiveInlining)] 속성 0으로 만 분할을 수행하는 간단한 방법을 장식하려고 특정 메서드 및 해제 모드에서 프로그램을 실행할 때, 예외가 호출 메서드에서보고 된 아니라 분 할부 함께. 한편, 한스 (Hans)가 말했듯이, throw 문 및 복잡한 흐름 논리가있는 메소드는 인라인되지 않습니다. This Article MSDN 블로그 (2004 년부터)은 JIT에서 인라인하는 방법에 대한 개요를 제공합니다.

+1

감사합니다 스니퍼, 그것을 테스트하는 영리한 방법. 나는 인라인 힌트를 알지 못했다! +1 –

관련 문제