10

.NET 4.5 より前のランタイム (SL/WP を含む) は非同期対応ではないため、それらが生成するスタック トレースには、コンパイラによって生成されたクラス/メソッド名 ( などd_15) が表示されます。

ランタイム スタック トレース、アセンブリ、および pdb を指定して、より優れたスタック トレースを生成するユーティリティを知っている人はいますか?

明確にするために:私は完全な非同期スタックを探しているのではなく、実際に例外をスローしたメソッドのより良いビューを探しているだけです

上記のステートメントは十分に明確ではないように思われるため、ここに例を示します。

public async void Foo()
{
    await Bar();
}

public async Task Bar()
{
    async SomethingToMakeThisMethodAsync();

    throw new Exception()
}

例外がスローされるとBar、スタックトレースには生成されたメソッド名 ( d_15()) のみが含まれます。フーがバーに電話したことはどうでもいい。Bar が例外をスローしたメソッドであることを知りたいだけです

4

2 に答える 2

4

Andrew Stasyuk は、MSDN マガジンhttp://msdn.microsoft.com/en-us/magazine/jj891052.aspxに素晴らしい記事を掲載しており、ばらばらで混乱を招くスタック トレースに照らしてデバッグを支援する方法として、Async Causality Chains について詳しく説明しています。

于 2013-05-05T23:47:03.580 に答える
1

この質問は、たとえば次のように、以前に数回尋ねられたため、報奨金で担当者を無駄にしたようです。

私が思い出すことができるように、賞金はほとんどありませんでしたが、参照よりもはるかに進んでいませんでした:

または、このSOの質問で:

への回答を参照して:

別の同様の SO の質問:

Daniel Moth による Visual Studio 2010 のParallel Debugging (Parallel Stacks, Parallel Tasks) に関する参照のコレクションが非常に役立つことがわかりました。

アップデート:

コードを実行した

using System;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
  class Program
  {
    static void Main(string[] args)
    {
        Foo();
    }
    public static async void Foo()
    {
      await Bar();
    }

    public static async Task Bar()
    {
      try
      {
        //async SomethingToMakeThisMethodAsync();
        //to make this async
        await TaskEx.Delay(2000);//await Task.Delay(2000);//in .NET 4.5
        throw new Exception();
      }
      catch (Exception)
      {
        throw new Exception("This is Excptn in Bar() method");
      }
    }
  }
}

VS2010 + Async CTP デバッグ モード (F5) では、「This is Excptn in Bar() method」という識別例外メッセージがはっきりと表示されます。

ここに画像の説明を入力

ここに画像の説明を入力

いずれにせよ、追加のマーキング (カスタム メッセージによる例外のキャッチと再スロー) がなくても、スタック トレース (ローカル ウィンドウ) でConsoleApplication1.Program.< Bar > として識別されます。つまり、上記のコードで Bar() メソッドを次のように置き換えています。

public static async Task Bar()
{
    //async SomethingToMakeThisMethodAsync();
    //to make this async
     await TaskEx.Delay(2000);//await Task.Delay(2000);//in .NET 4.5
     throw new Exception();
}

例外がスローされたことをスタック トレースで確認しますConsoleApplication1.Program.<Bar>

+ $exception    
{System.Exception: Exception of type 'System.Exception' was thrown.

Server stack trace: 
   at ConsoleApplication1.Program.<Bar>d__3.MoveNext() in R:\###Debugging\#seUnmangling (pre .NET 4.5) asyncawait stack traces\AsyncConsole_Sln\1Cons_Prj\Program.cs:line 29

Exception rethrown at [0]: 
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
   at ConsoleApplication1.Program.<Foo>d__0.MoveNext() in R:\###Debugging\#seUnmangling (pre .NET 4.5) asyncawait stack traces\AsyncConsole_Sln\1Cons_Prj\Program.cs:line 19

Exception rethrown at [1]: 
   at System.Runtime.CompilerServices.AsyncVoidMethodBuilder.<SetException>b__1(Object state)
   at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
   at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
   at System.Threading.ThreadPoolWorkQueue.Dispatch()
   at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()}   System.Exception

ここに画像の説明を入力

于 2013-05-06T10:57:55.727 に答える