附录

此主题提供了查找线程问题文档中引用的附录。

附录 A - 批处理文件以创建 ETL 跟踪

echo OFF
REM Use the name on the command line for the capture or use the default.
set ETWName=%1
if "%1"=="" set ETWName=ThreadData

REM Wait until a game has been launched.
xbconnect /WT /QG

REM This is the save path on the console, not on your computer.
set SavePath=d:\
xbdir /x/title xd:\profile > NUL
if %ERRORLEVEL% EQU 0 set SavePath=%SavePath%profile\

REM Start the capture on the Default Console.
xbrun /x/title /O xperf -start -on DISPATCHER+PROC_THREAD+LOADER+CSWITCH+PROFILE -stackwalk PROFILE+CSWITCH+READYTHREAD -f %SavePath%%ETWName%.etl

REM Wait for the user to press a key to stop the capture.
PAUSE

REM Stop the capture, merging the file to resolve events.
xbrun /x/title /O xperf -stop -d %SavePath%%ETWName%_merge.etl
REM Copy the .etl file over to the PC, and then open it.
xbcp /x/title x%SavePath%%ETWName%_merge.etl
start %ETWName%_merge.etl

附录 B:了解线程状态 - 正在运行、已挂起/正在等待和就绪

线程可以有多种不同的状态。 然而,为了本节的目的,必须了解以下三类高级状态。

  • 正在运行:此线程目前正在一个 CPU 核心上运行。
  • 已暂停/正在等待:此线程未运行且正在等待进入另一个状态。
  • 就绪:此线程已准备好将线程安排在 CPU 核心上,但尚未安排运行。

下面是这些状态如何互动的一个例子。 ThreadA 正在运行并获取一个锁,该锁可以防止共享资源一次被多个线程访问。 ThreadB 也正在运行,并且将访问相同的资源并尝试获取相同的锁。 但是由于该锁当前由 ThreadA 持有,因此 ThreadB 将等待。 稍后 ThreadA 释放对共享资源的锁定,从而使 ThreadB 进入就绪状态。 它将通知计划程序 ThreadB 准备就绪,可在 CPU 内核中进行安排。 当 ThreadB 被调度时,会有一个上下文切换。 ThreadA 将被列为 "Readied By "线程(有时也被称为 "准备好的线程"),其调用栈使 ThreadB 进入准备好的状态。