[C#] 예외없이 .NET에서 현재 스택 추적을 인쇄하는 방법은 무엇입니까?

일반 C # 코드가 있습니다. 나는 예외가 없다 . 디버깅 목적으로 현재 스택 추적을 프로그래밍 방식으로 기록하고 싶습니다. 예:

public void executeMethod()
{
    logStackTrace();
    method();
}



답변

System.Diagnostics네임 스페이스를 살펴보십시오 . 거기에 많은 케이크!

System.Diagnostics.StackTrace t = new System.Diagnostics.StackTrace();

이것은 후드 아래에서 일어나는 일을 배우기 위해 주위를 찌르는 것이 정말 좋습니다.

NLog, log4net 또는 Microsoft 패턴 및 사례 엔터프라이즈 라이브러리와 같은 로깅 솔루션을 살펴보고 목적을 달성하고 일부를 달성하는 것이 좋습니다. 행운을 빌어 친구!


답변

다른 대안 은 스택 추적의 문자열 표현을 반환하는 System.Environment.StackTraceSystem.Diagnostics.StackTrace 를 사용 하는 것입니다.

또 다른 유용한 옵션은 Visual Studio에서$CALLER$CALLSTACK 디버깅 변수 를 사용하는 것 입니다. 응용 프로그램을 다시 빌드하지 않고도 런타임을 활성화 할 수 있기 때문입니다.


답변

이를 수행하는 두 가지 방법이 있습니다. 는 System.Diagnostics.StackTrace()당신에게 현재의 스레드에 대한 스택 추적을 줄 것이다. Thread인스턴스에 대한 참조가 있으면 오버로드 된 버전의를 통해 스택 추적을 얻을 수 있습니다 StackTrace().

스택 오버플로 질문 비 현재 스레드의 스택 추적을 얻는 방법은 무엇입니까? .


답변

코드를 수정하지 않고 Visual Studio 디버거에서이 작업을 수행 할 수도 있습니다.

  1. 스택 추적을 보려는 중단 점을 작성하십시오.
  2. 중단 점을 마우스 오른쪽 단추로 클릭하고 VS2015에서 “조치 …”를 선택하십시오. VS2010에서 “히트시 …”를 선택한 다음 “메시지 인쇄”를 활성화하십시오.
  3. “계속 실행”이 선택되어 있는지 확인하십시오.
  4. 인쇄 할 텍스트를 입력하십시오.
  5. 스택 추적을보고 싶은 곳에 $ CALLSTACK을 추가하십시오.
  6. 디버거에서 프로그램을 실행하십시오.

물론 다른 컴퓨터에서 코드를 실행하는 경우에는 도움이되지 않지만 릴리스 코드에 영향을주지 않거나 프로그램을 다시 시작할 필요없이 스택 추적을 자동으로 추출 할 수 있으면 매우 편리합니다.


답변

Console.WriteLine(
    new System.Diagnostics.StackTrace().ToString()
    );

출력은 다음과 유사합니다.

YourNamespace.Program.executeMethod (String msg)에서

YourNamespace.Program.Main (String [] args)에서

대체 Console.WriteLine당신과 Log방법. 실제로 .ToString()Console.WriteLine 사례
가 필요하지 않습니다 object. 그러나 Log (string msg) 메소드에는 필요할 수 있습니다.


답변

   private void ExceptionTest()
    {
        try
        {
            int j = 0;
            int i = 5;
            i = 1 / j;
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error: " + ex.Message);
            var stList = ex.StackTrace.ToString().Split('\\');
            Console.WriteLine("Exception occurred at " + stList[stList.Count() - 1]);
        }
    }

나를 위해 일하는 것 같습니다


답변