3

C#マルチスレッドプログラミングでは、方法A()がメソッドB()を新しいスレッド、例えば、スタックトレースは、順番に方法B()の実行トリガ方法A()の呼び出しパスについては何も知らないB()メソッド内言い換えれば複数のスレッド間で完全なスタックトレースを確認する方法はありますか?

Task A() 
{ 
    // ... 

    // I want B to run in parallel, without A() waiting for it. 
    Task.Factory.StartNew(B); 
} 

void B() 
{ 
    // I attach a debugger here to look at the Call Stack. 
    // But that is empty and I can't see that A() actually called it (logically). 

    // Also Environment.StackTrace is pretty much empty of that path. 
} 

:このようなものを使用します。

完全な論理スタックトレースを見る方法はありますか。例外の場合はB()にありますので、それは実質的にA()ということを知ることができますか?

+0

@SimonPrice、それはマルチスレッドプログラムを一般的にデバッグする方法です。 OPは、そのスレッドが例外をスローすると、どのスレッド(およびそのポイントへの呼び出しスタック)が別のスレッドを開始したか/スケジュールされたタスクを見つけ出す方法を探しています。もっと具体的なものは何ですか? –

+0

私は詳細を質問で更新しました。 Visual Studioでこのシナリオを簡単に作成して、自分で確認することができます。 – Paymon

+0

UWPアプリケーションでこれをテストしています。 – Paymon

答えて

1

一般的に答えはNoです。StackTraceには他のスタックの情報を含めることはできません。あなたは、Visual Studioでアプリケーションをデバッグする場合は、それはあなたのためにいくつかの作業を行う(これはC++ですが、それはすべての言語についても同様です):

enter image description here

ここで、外部コードがあなたよりも調光器であり、いくつかの "親"スレッド情報を確認することができます。しかし、通常この画面はそれほど役に立ちません。 Visual Studioは、できるだけ多くのデバッグ情報を収集するために、vshost.exeファイルを作成します。

また、親にそれらを接続するタスクを作成し、いくつかの例外がある場合は、例外のToStringメソッドで完全なスタックトレースを取得しますが、依然として必要なものではありません。

+1

私は自身のSynchronizationContextを作成して、ネストされたスレッド呼び出しを追跡しました。 – Paymon

+0

@Paymonあなたが最後に何を詳細に説明できますか? –

+0

説明が少し複雑すぎます。私はフレームワーク内でマルチスレッドを中心にAPI全体を設計して動作させました。私はあなたがそこに行きたいとは思わない。 – Paymon

関連する問題