2011-01-31 4 views
5

System.Diagnostics.StackTrace를 사용하는 logger/exceptionfactory 모듈을 작성하여 호출 메소드 및 해당 선언 유형에서 속성을 가져 왔습니다. 그러나 릴리스 모드에서 Visual Studio 외부에서 코드를 실행하면 짧은 메서드 중 일부가 스택 추적에서 인라인되고 누락되는 것으로 나타났습니다. 이제 메소드가 런타임에 인라인 될지 테스트 할 방법이 없지만 모든 중요한 메소드를 [MethodImpl(MethodImplOptions.NoInlining)]에 넣고 싶지는 않습니다. 그러나 기본 클래스의 메소드가 없어져서 레이어와 조작 정보를 잘못 읽을 수 있으며 잘못된 로그 또는 오판 된 예외가 발생할 수 있습니다..NET에 로그인하기위한 스택 추적

어디에서 언제 인라인됩니다. 가상 메소드, 정적 메소드, 기본 클래스 메소드가 다르게 취급됩니까? 어셈블리 내부를 인라인하는 것에 대해 걱정할 필요가 있습니까? 내부 네임 스페이스?

+0

가능한 복제본 [CLR에서 인라인 될 수있는 방법은 언제입니까?] (http://stackoverflow.com/questions/4660004/when-is-a-method-eligible-to-be-inlined-by -the-clr) –

답변

5

예, 규칙이 있지만 JIT 컴파일러에서 사용하는 경험적 방법이며 이러한 발견 적 방법은 잠시 후 변경 될 수 있습니다.

  1. 가상 메소드는 인라인 될 수 없습니다.
  2. 반면 인터페이스 메서드는 스택 추적을 축소할지 여부를 100 % 확신 할 수는 없지만 인라인 될 수 있습니다.
  3. 정적 메서드 및 비 가상 인스턴스 메서드를 확실히 인라인 할 수 있습니다.
  4. 인라인은 런타임시 JIT가 메서드 호출을 컴파일 할 때 발생하기 때문에 네임 스페이스 (물론)와 어셈블리를 교차시킬 수 있습니다.
  5. "무거운"방법은 인라인되지 않습니다. 이것은 "heavy"의 정의에 달려 있으며 JIT가 적용하는 휴리스틱의 일부입니다.

제가 알고 "무거운"에 대한 추론의 일부 : 예외 처리를 사용

  • 방법 (즉-캐치를 시도하거나 시도 - 마지막 블록) 인라인되지 않습니다.
  • 큰 코드 (~ 32 IL 바이트가 있지만이 오류를 기억할 수 있음)가있는 메소드는 인라인되지 않습니다.
  • 루프가있는 메서드는 인라인되지 않습니다 (루프를 완전히 풀거나 제거 할 수있는 경우 제외).
+0

그냥 이상 :). 내 모든 중요한 방법은 시도 잡으로 시작 ... – TDaver

2

경험적 방법은 지터의 구현 세부 사항으로 공식적으로 문서화되지 않았으며 언제든지 변경 될 수 있습니다.