Joh*_*ohn 57 c# logging stack-trace visual-studio-debugging async-await
很清楚为什么堆栈跟踪会受到微软新编程范式的影响.我们现在有一个语义堆栈和几个物理堆栈(我选择的单词).
我看到的是异常的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));
}
Run Code Online (Sandbox Code Playgroud)
这给出了:
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
Run Code Online (Sandbox Code Playgroud)
我的问题是:是否有(方便的,标准的)方法将其转换为语义意义上的适当回溯,例如:
CheckFooAndBar
Foo
Bar
Run Code Online (Sandbox Code Playgroud)
当然,堆栈中可能存在混合的等待和内联路径片段.
我尝试使用带有异步目标包的.NET 4.5和SL5来查看堆栈,但还没有使用WinRT.输出来自.NET 4.5.
在SL5中,这是我主要做的,情况更成问题:你没有在Silverlight中的堆栈跟踪中获取行号(即使使用提升的权限),这使得对上下文的需求更加重要.
归档时间: |
|
查看次数: |
18090 次 |
最近记录: |