2009-09-29 4 views
2

Windows에서 실행중인 C++ 응용 프로그램에 대해 다중 스레드 디버그 DLL에 대해 컴파일하고 감사하고 있습니다. 스레드를 생성 할 수있는 많은 타사 종속성이 있습니다. 왜 각 스레드가 거기에 얼마나 많은 스택 공간을 할당하고 추적해야합니다.내 C++ 응용 프로그램에서 스레드가 생성되는 이유와 그 스레드가 수행하는 작업을 확인하는 가장 좋은 방법은 무엇입니까?

스레드가 생성 된 곳으로 추적하여 스레드가 생성 된 위치를 확인할 수있는 좋은 방법은 무엇입니까?

업데이트 : Microsoft의 종속 관계가 아닌 전체 응용 프로그램에 대한 소스 코드가 있음을 지적해야합니다. 그러나 많은 스레드에는 ntdll.dll 및 kernel32.dll과 같은 OS와 함께 제공되는 라이브러리 내부에 독점적으로 존재하는 콜 스택이 있습니다.

답변

0

grep 왜 소스 코드를 찾고 그것을 찾으십니까? (이유를 알려줍니다)

5

Windows Performance Toolkit을 사용하면 ThreadCreate 이벤트를 볼 수 있습니다. Vista를 사용하면 각 스레드 작성마다 스택을 얻을 수 있으므로 어떤 코드가 스레드를 작성하는지 확인할 수 있습니다.

가와 추적 수집 :

xperf -stop -d mylog.etl 

보기와 추적 파일 : 추적에서

xperf mylog.etl 

xperf -on base -stackwalk ThreadCreate 

하는 시나리오를 실행을의와 추적을 쓰기 메뉴 옵션에서 기호 경로를 적절히 설정하고 기호를로드하십시오. Microsoft Symbol Server을 사용하여 운영 체제에 대한 공개 기호를 얻을 수 있습니다.

"프로세스 수명"에서 마우스 오른쪽 버튼으로 클릭하고 "스레드 요약 표"를 선택하십시오. 생성 스택 및 사용자 스택 크기에 대한 열을 추가 할 수 있습니다. 프로세스를 확장하면 생성 된 모든 스레드, 해당 스레드를 생성 한 스택 및 스택 크기를 볼 수 있습니다.

0

소스 코드에 액세스 할 수 있습니까? 이 경우 스레드 ID와 할당 된 메모리를 표시하고 모든 스레드에 대해 호출하는 함수를 만듭니다.

4

Process Explorer은 스레드와 호출 스택을 나열 할 수 있습니다. 실제 디버거를 부착하지 않고 프로세스를 검사하려는 경우 매우 유용합니다.

0

CreateThread 호출로 다시 추적하는 방법을 찾지 못했지만이 정보를 스레드에 사용할 수 있다고 생각하지 않습니다.

내가 제어하는 ​​스레드의 이름을 지정하는 것이 도움이 된 이유는 MSDN입니다. 스레드가 생성되어 타사 라이브러리에서 실행되는 경우에는 도움이되지 않습니다.

관련 문제