2010-04-21 3 views
5

나는 스택 트레이스에서보고 싶지 않은 죽은 단순한 one-liner 방법을 가지고있다 : 가능한가? 어쩌면 속성으로 표시할까요?C# : 스택 추적에서 메서드를 숨기는 방법?

그냥 명확히하기 위해 디버거에서 추적을 인쇄하거나 다시 게시하거나 자동 단계 실행을 시도하지 않습니다. 트레이스가 제 3 자 코드에 의해 처리되기 때문에, 먼저 트레이스에 메소드가 나타나지 않도록하고 싶습니다. 나는 런타임에 제어를 원한다. 디버깅에 관심이 없다. StackTrace에서 읽은 대부분의 내용이이 주제와 관련이있는 것으로 보입니다.

+0

간단한 한 줄이면 자동입니다. JIT 최적화 프로그램이 인라인을 수행합니다. 그러나 디버거가 연결되어있는 동안은 아닙니다. –

+0

한스, 내 의견을 스티븐의 대답을보십시오. – benblo

+0

좋아하는 답변에 플래그를 지정하는 것을 잊지 마세요. – Steven

답변

2

이 방법은 메소드가 인라인 될 때만 수행 할 수 있습니다. JIT가 수행하거나 코드를 변경합니다. 그러나 JIT는 인라 인 방법에 대해 상당히 보수적이며 실제적으로 메소드가 매우 작거나 메소드가 루프에서 사용될 때만 수행합니다.

+0

흠 ... 솔직히 말해서 의심 스럽습니다 : 인라인 된 경우에도 StackTrace가 어떻게 든 추적 할 수 없습니까? 그리고 내 방법은 디버그와 릴리스에서 모두 존재하므로 실제로는 체크 아웃하지 않으며 단지 한 줄짜리 래퍼입니다. – benblo

+1

아니요. 메서드가 인라인 될 때 ​​실제로 사라집니다. 따라서 메서드 호출이 없으므로 스택 워크에서는 메서드를 호출하지 않습니다. 스택 추적은 스택 워크를 사용하여 작성되기 때문에 더 이상 스택 추적에 메서드가 표시되지 않습니다. – Steven

-1

다른 질문 Most Useful Attributes에 대한 대답에서 말한 것처럼 메서드에 System.Diagnostics.DebuggerHidden 특성을 지정해야합니다.

+0

불행하게도 여기서는 적용되지 않습니다. 이름에서 알 수 있듯이 (그리고 문서에 명시된 바와 같이) 디버거 속성 일 뿐이므로 표시된 메서드를 필터링하는 것은 디버거에 달려 있지만 메서드는 여전히 스택 추적에 첫 번째 장소. 내 컨텍스트는 디버그 시간이 아닙니다. Unity (게임 엔진)는 로그 또는 예외의 전체 스택을 출력하므로 Unity는 의도적으로 메서드를 필터링해야합니다. 나는 무엇을 찾고 있었는지 두려워한다. (스택 트레이스에 등록하지 않는다.) 단순히 불가능하다. – benblo

관련 문제