2014-09-11 2 views
1

멍청한 질문에 대해 죄송합니다. 나는 Xperf를 처음 사용합니다.Xperf에서 콜백 및 이벤트 캡처

저는 64 비트 Windows 8.1이고 응용 프로그램 또한 x64입니다. Xperf를 사용하여 응용 프로그램에서 호출 스택과 정의 된 이벤트를 모두 캡처하려고합니다.

내 응용 프로그램에 GUID 35f7872e-9b6d-4a9b-a674-66f1edd66d5c을 등록했습니다.

내가 사용했다

:

xperf -on PROC_THREAD+LOADER+Base -start UserSession -on 35f7872e-9b6d-4a9b-a674-66f1edd66d5c -BufferSize 1024 -stackwalk profile 

나는 모든 이벤트하지만 호출 스택을 얻을 수 있습니다. 나는 -on 35f7872e-9b6d-4a9b-a674-66f1edd66d5c 를 제거하고 명령 줄이된다 그러나 경우 :

xperf -on PROC_THREAD+LOADER+Base -start UserSession -BufferSize 1024 -stackwalk profile 

이 방법은, 나는 모든 호출 스택하지만 정의 이벤트를 캡처 할 수 있어요.

콜 스택 (callstack)과 이벤트를 모두 캡처하는 데 올바른 명령 줄이 무엇인지 알 수 있습니까? 또한 당신이 좋은 Xperf 레퍼런스로 나를 가리킬 수 있다면 그것은 더 커질 것입니다.

+0

'-stackwalk profile'을'-start UserSession' 이전의 위치로 옮겨서 문제를 해결했습니다. 이 방법으로 커널 로거는 호출 스택을 기록합니다. 나는 또한 사용자 세션이 callstack을 기록 할 수 있도록'::: stack'을 시도했지만 작동하지 않는 것처럼 보였다. 또 다른 사실은'xperf.exe -stop -stop UserSession -d test.etl'을 사용하여 커널 로거와 사용자 로거를 모두 중단하고 버퍼를 함께 결합하는 것입니다. – stanleyli

답변

1

사용자 모드 이벤트에 대한 스택을 캡처하려면 명령 줄에 :::'stack'을 추가해야합니다.

xperf -start UserSession -on 35f7872e-9b6d-4a9b-a674-66f1edd66d5c:::'stack' 

좋은 xperf 참조

"Inside Windows Debugging"this blog입니다.

+0

감사합니다! 필자는'-stackwalk profile'을'-start UserSession '이전의 위치로 옮기면 커널 로거가 콜 스택을 기록한다는 것을 알게되었습니다. 나는 또한 사용자 세션이 콜 스택을 기록하도록하기 위해'::: stack'을 시도했지만 작동하지 않는 것처럼 보였다. 나를 위해 – stanleyli

+0

이 작동합니다. ** ''** 스택 주위에 놓칠 수 있습니다. – magicandre1981

+0

쉬운 방법으로 xperf 추적을 기록하는 방법에 대한 자세한 내용은 https://randomascii.wordpress.com/2013/04/20/xperf-basics-recording-a-trace-the-easy-way/ 및 다른 게시물을 참조하십시오. 내 블로그. 특히 stack walk에 대해서는 pigscanfly에 대한 첫 번째 xperf 블로그 게시물이 자세히 설명되었습니다. http://blogs.msdn.com/b/pigscanfly/archive/2009/08/06/stack-walking-in-xperf.aspx –

3

내가 혼란의 공통적 인 원인을 보여주기 때문에 나는 그것이 형편없이 형성 되었음에도 불구하고이 질문에 투표했다. 원래의 질문은 "콜 스택을 기록하는 방법"에 대해 질문했지만 잘 형성된 질문이 아닙니다. xperf는 샘플링 프로파일 러, 컨텍스트 스위치, 파일 I/O, 디스크 I/O, 레지스트리 활동 또는 사용자 지정 이벤트에 대한 호출 스택을 기록 할 수 있습니다. 이 질문은 어떤 유형의 호출 스택이 기록되었는지를 지정하지 않았기 때문에 다소 혼란 스럽습니다.

원래 명령 줄을 살펴 보겠습니다. 나는 BASE가 그것들을 포함하기 때문에 PROC_THREAD + LOADER를 제거함으로써 그것을 단순화했다. 또한 잘못 배치했다고 생각하여 -BufferSize 1024를 제거했으며 GUID를 이름으로 바꿨습니다. 공급자에게 이름을 지정하고 사용해야합니다. 따라서 우리는 :

xperf -on Base -start UserSession -on MyProvider -stackwalk profile 

두 개의 "-on"지시문이 있음에 유의해야합니다. 즉, 우리는 두 개의 세션을 시작합니다.

첫 번째 명령은 '기본'공급자와 함께 커널 로거 (세션 이름 없음)를 시작하거나 연결합니다. 두 번째 명령은 "MyProvider"공급자를 사용하여 "UserSession"이라는 사용자 세션을 시작합니다.

이제 문제를 확인할 수 있습니다. "profile"은 커널 로거의 컨텍스트에서 -stackwalk에 대한 유일한 옵션입니다. 프로파일 이벤트를 기록하지 않기 때문에 프로파일 세션에 호출 스택을 기록하도록 사용자 세션에 요청하는 것은 이치에 맞지 않습니다! 따라서 OP 질문에 대한이 변형에 도달하게됩니다.

xperf -on Base -stackwalk profile 
xperf -start UserSession -on MyProvider 
@rem Run tests here 
xperf -stop UserSession -stop -d trace.etl 

기다려라! MyProvider의 사용자 이벤트에 대한 호출 스택은 어떻습니까?즉, 첫 번째 대답은 설명하려고했던거야 - 우리가 ::: 추가하는 '스택'이 필요 : 일반 이벤트의 스택 열이 WPA에서 볼 때

xperf -on Base -stackwalk profile 
xperf -start UserSession -on MyProvider:::'stack' 
@rem Run tests here 
xperf -stop UserSession -stop -d trace.etl 

그 호출 스택을 사용할 수 있습니다. 콜 스택을 기록 할 수있는 기타 내용 목록은 "xperf -help stackwalk"를 참조하십시오. 실제로 녹음하는 이벤트에 대한 호출 스택을 요청하는 것만 기억하십시오. 운 좋게 Base에는 프로필이 포함되어있어 괜찮습니다.

오, 예 - 버퍼 크기와 버퍼 수를 설정하려면 에 대해 세션 (둘 다 가능)으로 설정해야합니다. 특히 참조 xperf 추적을 분석하는 방법에 대한 많은 정보를

: https://randomascii.wordpress.com/category/xperf/

을 추적 녹화를 제어하기위한 ETW 추적이 오픈 소스 UI를 볼 기록하는 훨씬 쉬운 방법을 위해 - 당신은 쉽게 자신을 추가 할 수 있습니다 제공자가 목록에 기록되고있다 : https://github.com/google/UIforETW/releases