code

async / await로 추적 스택

codestyles 2020. 12. 26. 10:04
반응형

async / await로 추적 스택


스택 추적이 Microsoft의 새로운 프로그래밍 패러다임에 영향을받는 이유가 분명합니다. 이제 의미 스택과 물리적 스택 (내가 선택한 단어) 두 개가 있습니다.

내가 보게되는 것은 예외의 StackTrace속성 (그리고 디버거에서)은 연결된 물리적 속성입니다.

private async Task CheckFooAndBar()
{
    var log = LogManager.GetLogger("Test");
    log.Info("CheckFooAndBar");
    try
    {
        await Foo();
    }
    catch (Exception ex)
    {
        log.Info("StackTrace of last exception: " + ex.StackTrace);
    }
    Console.ReadKey();
}
private async Task Foo()
{
    await Task.Factory.StartNew(() => Thread.Sleep(1000));
    await Bar();
    await Task.Factory.StartNew(() => Thread.Sleep(1000));
}
private async Task Bar()
{
    await Task.Factory.StartNew(() => Thread.Sleep(1000));
    throw new Exception();
    await Task.Factory.StartNew(() => Thread.Sleep(1000));
}

이것은 다음을 제공합니다.

StackTrace of last exception:    at NLogAsyncExceptionTestCase.Program.<Bar>d__d.MoveNext() in c:\Users\Jens\Documents\Visual Studio 2012\Projects\NLogAsyncExceptionTestCase\NLogAsyncExceptionTestCase.Console\Program.cs:line 53
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
   at NLogAsyncExceptionTestCase.Program.<Foo>d__8.MoveNext() in c:\Users\Jens\Documents\Visual Studio 2012\Projects\NLogAsyncExceptionTestCase\NLogAsyncExceptionTestCase.Console\Program.cs:line 44
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
   at NLogAsyncExceptionTestCase.Program.<CheckFooAndBar>d__0.MoveNext() in c:\Users\Jens\Documents\Visual Studio 2012\Projects\NLogAsyncExceptionTestCase\NLogAsyncExceptionTestCase.Console\Program.cs:line 30 

내 질문은 : 이것을 의미 론적 의미에서 적절한 역 추적로 변환하는 (편리하고 표준적인) 방법이 있습니까?

CheckFooAndBar
Foo
Bar

물론 스택에 awaits와 inline path 조각이 섞여있을 수 있습니다.

비동기 타게팅 팩이있는 .NET 4.5 및 SL5와 함께 스택을 살펴 보았지만 아직 WinRT를 사용하지 않았습니다. 출력은 .NET 4.5에서 가져온 것입니다.

제가 주로하는 SL5에서는 상황이 더 문제가됩니다. Silverlight의 스택 추적에서 줄 번호를 얻지 못하기 때문에 컨텍스트가 더 중요해집니다.


Visual Studio 2013 및 .NET 4.5.1에서이 문제는 .NET뿐만 아니라 해결 된 것으로 보입니다.

자세한 내용은 이 블로그 게시물을 참조하십시오 .

참조 URL : https://stackoverflow.com/questions/13884437/stack-traces-with-async-await

반응형