내가 혼란의 공통적 인 원인을 보여주기 때문에 나는 그것이 형편없이 형성 되었음에도 불구하고이 질문에 투표했다. 원래의 질문은 "콜 스택을 기록하는 방법"에 대해 질문했지만 잘 형성된 질문이 아닙니다. 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
'-stackwalk profile'을'-start UserSession' 이전의 위치로 옮겨서 문제를 해결했습니다. 이 방법으로 커널 로거는 호출 스택을 기록합니다. 나는 또한 사용자 세션이 callstack을 기록 할 수 있도록'::: stack'을 시도했지만 작동하지 않는 것처럼 보였다. 또 다른 사실은'xperf.exe -stop -stop UserSession -d test.etl'을 사용하여 커널 로거와 사용자 로거를 모두 중단하고 버퍼를 함께 결합하는 것입니다. – stanleyli