3

C# 멀티 스레드 프로그래밍에서, 방법 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() 호출 경로에 대해 아무것도 모르는 B().

전체 논리 스택 추적을 볼 수있는 방법이 있습니까? 예외가있는 경우 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