2011-09-11 1 views
2

내가하는 방법 어설() 쓴 현재의 행/열 : I 줄과 열 트리거 될 때 0으로 동일하고 모두가 이유는 무엇입니까.NET StackFrame을하고

[System.Diagnostics.Conditional("DEBUG")] 
internal static void Assert(bool condition) 
{ 
    if (!condition) 
    { 
     var message = 
       "Line:" + (new System.Diagnostics.StackFrame(1)).GetFileLineNumber() + "\r\n" + 
       "Column:" + (new System.Diagnostics.StackFrame(1)).GetFileColumnNumber() + "\r\n" + 
       "Where:" + (new System.Diagnostics.StackFrame(1)).GetMethod().Name; 
      Log("ASSERTION", message); 
     } 
    } 

를? 그것은 Debug.Assert (false)가 호출되는 장소로되어 있습니다.

안부,

+0

왜 당신은 자신의 주장 방법을 쓰고 있습니까? –

+0

내 자체 로그 시스템에 쓰기 때문에. 어셈블리는 SQLCLR 트리거이므로 출력은 특수 테이블에 저장됩니다. – noober

+0

.pdb가 .exe/.dll과 같은 폴더에 있습니까? 이전 버전의 모노를 사용하고 있습니까? – Sklivvz

답변

8

당신은 StackFrame(int, bool) 오버로드를 사용하고 두 번째 인수로 true를 지정해야합니다. StackFrame(int) 오버로드가 소스 정보를 캡처하지 않는 것 같습니다.

샘플 코드 :

using System.Diagnostics; 

... 

[Conditional("DEBUG")] 
internal static void Assert(bool condition) 
{ 
    if (!condition) 
    { 
     StackFrame frame = new StackFrame(1, true); 
     var message = string.Format("Line: {0}\r\nColumn: {1}\r\nWhere:{2}", 
            frame.GetFileLineNumber(), 
            frame.GetFileColumnNumber(), 
            frame.GetMethod().Name); 
     Log("ASSERTION", message); 
    } 
} 

(그런데 귀하의 의견을 보면, 당신 것이다 PDB의 파일이 필요 즉, 디버그 정보가 저장되는 곳이 의지 여부를 나에게 전혀 분명하지 않다입니다.. 솔직히 SQLCLR 트리거에서 작동합니다. 위의 콘솔 응용 프로그램에서 나를 위해 작동하지만, 그게 전부입니다 ...)

+0

자세한 답변 해 주셔서 감사합니다! – noober

+0

흠 ... PDB가 필요하다면, 왜 프레임 .GetMethod(). Name은 Release 구성과 최적화에서 작동합니까? (나는 그것을 이전에 점검했다). BTW, 라인/열이 0 일 때 새로운 StackFrame (1)도 작동합니다. – noober

+1

@noober : 메서드 이름은 .NET 어셈블리를 구성하는 일반 메타 데이터의 일부입니다. 디버그 정보가 아닙니다. –