2011-02-23 2 views
1

문제를 이해하려고하는데 많은 부분을 읽었지만이 이상한 조합을 설명하는 리소스를 찾을 수없는 것 같습니다.StackFrame.GetFileLineNumber() 동작은 어셈블리에 따라 다릅니다. 플랫폼 및 최적화 플래그

실험 조금 나는에서 /를 anycpu를/x86 플랫폼에 대한 해제 및 건물 컴파일러 최적화 설정의 조합 StackFrame.GetFileLineNumber()의 동작을 변경 것으로 나타났습니다 후

난 왜 이해가 안 나는 다음 결과를 얻는 중 (내 x64 시스템에서)

Optimisations  | Platform  | Line Number Reported | Result 
-------------------|---------------|-----------------------|---------- 
    off    | anycpu  | 10     | Correct 
    off    | x86   | 10     | Correct 
    on    | anycpu  | APPCRASH    | WTF? 
    on    | x86   | 12     | WTF? 

아래의 코드는 문제를 재현합니다. 당신이 최적화를 켜면

csc /t:exe /debug+ /out:anycpu-optimisation-on.exe /platform:anycpu /optimize+ code.cs 
csc /t:exe /debug+ /out:anycpu-optimisation-off.exe /platform:anycpu /optimize- code.cs 
csc /t:exe /debug+ /out:x86-optimisation-on.exe /platform:x86 /optimize+ code.cs 
csc /t:exe /debug+ /out:x86-optimisation-off.exe /platform:x86 /optimize- code.cs 

답변

0

당신이있어 : 다음 스크립트 배치 파일을 만들 code.cs로 위의 코드를 저장하는 경우

using System; 
using System.Diagnostics; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main() 
     { 
      GetLineNumberOfThisCall(); 

      Console.WriteLine("\r\nPress any key to exit..."); 
      Console.ReadKey(); 
     } 

     private static void GetLineNumberOfThisCall() 
     { 
      var stackTrace = new StackTrace(true); 
      var callingFrame = stackTrace.GetFrame(1); 

      Console.WriteLine("The call to the stack-walking method was found on line: {0}", callingFrame.GetFileLineNumber()); 
     } 
    } 
} 

, 그것은에 쉽게 문제 REPO 어셈블리를 컴파일 JITter에게 다르게 행동하도록 알려줍니다.

일부 함수 호출은 스택 프레임을 저장하기 위해 다른 함수 호출과 병합되며, 루프는 풀립니다. MSIL의 구조는 크게 변경 될 수 있습니다.

함수 호출이 축소되어 추출하려는 스택 프레임이 존재하지 않아 충돌이 일어날 수 있습니다. 10 번 줄에서 12 번 줄로 점프하는 것은 컴파일러가 명령을 따라 가면서 최상의 퍼포먼스를 얻을 수 있기 때문입니다.

그냥 내 $ 0.02 :

+0

내가 추가 할 경우는 MethodImpl 속성 다음, 그것은 가'[MethodImpl (MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining가)]를 anycpu를의 APPCRASH 해결' 이에 부합하는 것으로 보인다 무엇 인라이닝에 관한 한 AnyCPU에 대해 설명하지만 최적화가 비활성화 된 경우 줄 번호가 다른 이유는 여전히 설명하지 않습니다. – Xerxes

+0

나는 그 차이점을 일리노이 또는 생성 된 PDB가 바이너리와 충돌하는 것을 막을 것이다. 그러나 나는 여기서 조금 추측하고있다. –