반응형
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
반응형
'Development Tip' 카테고리의 다른 글
matplotlib 그림을 만든 후 어떻게 메모리를 해제 할 수 있습니까? (0) | 2020.12.27 |
---|---|
블렌더 : 구 주변 걷기 (0) | 2020.12.27 |
C ++ 11의 유니 코드 (0) | 2020.12.27 |
java.lang.RuntimeException : java.lang.IllegalArgumentException으로 활동을 재개 할 수 없습니다. (0) | 2020.12.27 |
Resharper 대 Coderush-2010 리메이크 (0) | 2020.12.27 |