DkmThread 类

定义

DkmThread 表示在目标进程中运行的线程。

派生类:DkmGPUComputeThread、DkmVirtualThread

public ref class DkmThread : Microsoft::VisualStudio::Debugger::DkmDataContainer
[System.Runtime.InteropServices.Guid("ac420a23-b721-57c1-375d-a5053f90f94c")]
public class DkmThread : Microsoft.VisualStudio.Debugger.DkmDataContainer
[<System.Runtime.InteropServices.Guid("ac420a23-b721-57c1-375d-a5053f90f94c")>]
type DkmThread = class
    inherit DkmDataContainer
Public Class DkmThread
Inherits DkmDataContainer
继承
继承
派生
属性

属性

Connection

这表示监视器与 IDE 之间的连接。 如果监视器与 IDE 在同一进程中运行,则它可以是本地连接,也可以是远程连接。 在监视过程中,只有一个连接。

IsMainThread

如果这是此进程的main线程,则为 True。 main线程是启动的第一个线程。

IsUnloaded

如果为此对象引发了“unloaded”事件,则返回 true (示例:DkmThread::Unload 被调用) 或对象已关闭。 请注意,检查此状态时必须小心,因为如果不进行同步,返回的状态在读取指令后可能不再准确。

(继承自 DkmDataContainer)
NativeStartAddress

如果可用,这是此线程的 Win32 开始地址 (传递给 CreateThread API) 的值。 值不会始终可用,例如,在附加调试器后启动线程或在小型转接中,该值通常不可用。

Process

DkmProcess 表示正在调试的目标进程。 调试器调试进程,因此这是调试的基本单元。 DkmProcess 可以表示系统进程或虚拟进程,例如小型转用。

SystemInformation

包含有关运行此线程的计算机系统的信息。 如果此线程在 WOW (64 位操作系统上的 32 位仿真下运行,) 此信息将针对 32 位子系统而不是 64 位子系统。

SystemPart

[可选]描述与完整 Win32 线程相关的线程的特征。 目前,此值是必需的,并且所有线程都将具有“System”块。 将来,如果 DkmThread 表示非完整 Win32 线程,则此值可能为 NULL。

TebAddress

目标进程中的地址,其中存储了 Win32 线程环境块。 有关详细信息,请参阅 MSDN 中有关 TEB 结构的文档。

UniqueId

唯一标识此线程对象的 Guid。

方法

BeginFuncEvalExecution(DkmFuncEvalFlags)

此方法用于恢复目标进程,以便可以进行函数计算。 运行时调试监视器在设置函数评估以使目标进程运行后调用此函数。 运行时监视器将首先更新线程上下文,更新目标进程中的任何必要内存,并设置函数评估已完成的任何检测。

此方法的调用方在从触发函数计算的操作返回之前,必须始终调用 EndFuncEvalExecution。 如果调用方未能这样做,则行为是未定义的。

此方法在基本调试监视器中实现,方法是先将目标进程更新为处于函数评估模式 (DkmThread.OnBeginFuncEvalExecution) ,然后挂起和/或恢复函数评估标志指定的线程,最后继续目标进程。

此方法可以从任何线程调用,但必须从停止事件线程调用 OnBeginFuncEvalExecution,因此基础调试监视器可能需要作为线程开关执行,作为此方法实现的一部分。 在目标恢复之前,基本调试监视器不应从 BeginFuncEvalExecution 返回。

CanBeginFuncEvalExecution(DkmFuncEvalFlags)

可以调用 CanBeginFuncEvalExecution 来了解进程的当前状态是否允许函数计算。 这将返回 false,例如,如果基本 DM 已调用 StoppingEventProcessingBegin,但不调用 StoppingEventProcessingContinue。

位置约束:必须从监视组件 (组件级别 < 100,000) 调用 API。

此 API 是在 Visual Studio 16 Update 5 (DkmApiVersion.VS16Update5) 中引入的。

Create(DkmProcess, UInt64, UInt64, Boolean, DkmThread+System, DkmDataItem)

调试监视器调用 DkmThread 以创建新的 DkmThread 实例。 系统线程的 DkmThread 对象由基本调试监视器创建。 必须在事件线程上调用此方法。

此方法将发送 ThreadCreate 事件。

位置约束:必须从监视组件 (组件级别 < 100,000) 调用 API。

CreateFrameRegisters(DkmUnwoundRegister[], UInt32)

将 DkmUnwoundRegisters 数组转换为包含 DkmUnwoundRegisters 的排序 DkmReadOnlyCollection 的 DkmFrameRegisters 实例。

CreateRegistersObject(Byte[], DkmUnwoundRegister[], DkmUnwoundRegister[])

从提供的包含 Win32 CONTEXT 结构的字节数组创建 DkmFrameRegisters 对象。

EndFuncEvalExecution(DkmFuncEvalFlags)

EndFuncEvalExecution 由事件线程上的运行时调试监视器调用,以退出函数评估模式。 EndFuncEvalExecution 将更新 DkmProcess 对象的内部状态,以指示函数计算已结束。 这还将发送 FuncEvalEnded 事件,并将进程标记为已停止。

在处理“已接收”停止事件通知时,可以 (1) 调用此方法 -- 在处理线程退出等非停止事件时 (2) -或 - (3) 目标仍然停止时(例如,如果函数评估设置失败)。

GetContext(Int32, Byte[])

获取当前上下文 () 线程的寄存器值。

GetContext(Int32, Void*, Int32)

获取当前上下文 () 线程的寄存器值。

GetCurrentFrameInfo(UInt64, UInt64, UInt64)

GetCurrentFrameInfo 用于获取线程当前上下文的帧基址和返回地址。 这考虑了帧指针省略以及当前指令指针是否位于 prolog、epilog 等中...注意:在某些情况下,如果帧有“帧指针省略”且未加载符号,则会出现错误。

位置约束:必须从监视组件 (组件级别 < 100,000) 调用 API。

GetCurrentFuncEvalMode()

组件可以在事件处理过程中调用 GetCurrentFuncEvalMode,以确定是否启用了函数评估。 此函数只能作为事件处理的一部分调用。

GetCurrentLocation(DkmWorkList, DkmCompletionRoutine<DkmGetCurrentLocationAsyncResult>)

提供线程的位置(如线程窗口中可见)或调试位置工具栏中的线程下拉列表。

此方法会将新工作项追加到指定工作列表,并在追加工作项后返回。 工作项的实际处理是异步的。 将通过完成例程通知调用方请求已完成。

位置约束:必须从 IDE 组件 (组件级别 > 100,000) 调用 API。

GetCurrentRegisters(DkmUnwoundRegister[])

返回包含线程当前寄存器值的 DkmFrameRegisters 对象。

GetDataItem<T>()

获取已添加到此容器实例的“T”的实例。 如果此容器不包含“T”,则此函数将返回 null。

(继承自 DkmDataContainer)
GetDebuggerSuspensionCount()

返回由调试器 (即调用 DkmThread::Suspend 而不调用 DkmThread::Resume) 导致的挂起总数。 这不包括调试器外部的任何挂起。

GetExtendedRegisters()

从线程上下文中获取扩展寄存器。

GetManagedThreadProperties(DkmWorkList, DkmCompletionRoutine<DkmGetManagedThreadPropertiesAsyncResult>)

获取托管线程的属性。

此方法会将新工作项追加到指定工作列表,并在追加工作项后返回。 工作项的实际处理是异步的。 将通过完成例程通知调用方请求已完成。

GetManagedThreadProperties(Int32)

获取托管线程的属性。

GetMinidumpThreadInfo(DkmMinidumpThreadInfo)

获取存储在微型转储中的线程状态信息。

此 API 是在 Visual Studio 17 RTM (DkmApiVersion.VS17RTM) 中引入的。

GetStackAddressRange()

检索给定线程的堆栈限制/堆栈基数。 请注意,此值可能会随时间而更改,例如,在光纤的情况下。

GetSteppers()

GetSteppers 枚举此 DkmThread 对象的 DkmStepper 元素。

GetSuspensionCount(Boolean)

返回此线程的当前挂起计数。

GetSuspensionCount(DkmWorkList, Boolean, DkmCompletionRoutine<DkmGetSuspensionCountAsyncResult>)

返回此线程的当前挂起计数。

此方法会将新工作项追加到指定工作列表,并在追加工作项后返回。 工作项的实际处理是异步的。 将通过完成例程通知调用方请求已完成。

GetThreadCurrentWinRtErrorInfo()

GetThreadCurrentWinRtErrorInfo 用于获取此线程的当前 IErrorInfo 对象的地址。

此 API 是在 Visual Studio 12 RTM (DkmApiVersion.VS12RTM) 中引入的。

GetTlsValue(Int32)

检索调试对象线程的线程本地存储中的值, (指定 TLS 索引的 TLS) 槽。 进程中的每个线程都具有自己的针对每个 TLS 索引的槽。

GetTopStackFrame()

返回线程的顶部调用堆栈帧。 此值通常在第一个堆栈遍历后缓存,并在继续时清除。 这只能在客户端进程中的堆栈提供程序上调用。 若要获取服务器进程中的顶部帧,请调用 GetTopStackWalkFrame。

位置约束:必须从 IDE 组件 (组件级别 > 100,000) 调用 API。

GetTopStackWalkFrame(DkmRuntimeInstance)

返回线程的顶层堆栈帧。 此帧可以来自运行时实例或监视器展开器。 这只能从服务器进程调用。 若要在客户端进程中获取顶部帧,请使用 GetTopStackFrame。

位置约束:必须从监视组件 (组件级别 < 100,000) 调用 API。

GetVolatileFlags()

获取有关线程的易失性标志。 例如,如果线程是用户模式计划的线程,则返回 。

GetVolatileFlags(DkmWorkList, DkmCompletionRoutine<DkmGetVolatileFlagsAsyncResult>)

获取有关线程的易失性标志。 例如,如果线程是用户模式计划的线程,则返回 。

此方法会将新工作项追加到指定工作列表,并在追加工作项后返回。 工作项的实际处理是异步的。 将通过完成例程通知调用方请求已完成。

GetVolatileProperties(DkmWorkList, DkmCompletionRoutine<DkmGetVolatilePropertiesAsyncResult>)

获取线程的动态属性。

此方法会将新工作项追加到指定工作列表,并在追加工作项后返回。 工作项的实际处理是异步的。 将通过完成例程通知调用方请求已完成。

GetVolatileProperties(Int32, UInt64)

获取线程的动态属性。

IsStoppingEventQueued(Boolean)

指示给定线程是否在队列中具有停止事件。 执行管理器使用此信息来确定是否可能会滑落线程。

OnBeginFuncEvalExecution(DkmFuncEvalFlags)

OnBeginFuncEvalExecution 由事件线程上的基本调试监视器调用。 此方法作为 IDkmBaseFuncEvalService.BeginFuncEvalExecution 实现的一部分调用,该调用是为了恢复函数评估的过程。 OnBeginFuncEvalExecution 将更新 DkmProcess 对象的内部状态,以指示函数评估正在进行中。 这还将发送 FuncEvalStarting 事件,并将进程标记为正在运行,以便不允许任何需要停止进程的操作。

OnContinueExecution()

OnContinueExecution 由事件线程上的基本调试监视器调用。 此方法作为 IDkmContinueExecution.ContinueExecution 实现的一部分调用,IDE 使用该方法继续执行目标进程。 调度程序使用此方法来调度之前无法处理的停止事件,或更新 DkmProcess 对象的内部状态,以指示目标进程现在正在运行。 在将进程标记为正在运行之前,调度程序将发送 Continue 事件。

当基本调试监视器位于此方法中时,它应该被重新调用。

OnEmbeddedBreakpointHit(DkmInstructionAddress, Boolean)

引发 EmbeddedBreakpointHit 事件。 实现事件接收器接口的组件将收到事件通知。 此方法会将事件排入队列,控件将立即返回到调用方。

OnInterceptExceptionCompleted(UInt64)

引发 InterceptExceptionCompleted 事件。 实现事件接收器接口的组件将收到事件通知。 此方法会将事件排入队列,控件将立即返回到调用方。

OnThreadNameChange()

当监视器调用 DkmThread::NameChange 时,调度程序发送 ThreadNameChange。

此 API 是在 Visual Studio 14 RTM (DkmApiVersion.VS14RTM) 中引入的。

RaiseExecutionControlException(UInt32)

可从 IDkmSingleStepCompleteReceived 或 IDkmRuntimeBreakpointReceived 实现调用的 API,以强制基本 DM 在恢复执行时在目标进程中触发EXCEPTION_BREAKPOINT或EXCEPTION_SINGLE_STEP异常。 通常,断点或单步异常是隐式取消的。 这允许目标进程中的异常处理程序处理EXCEPTION_BREAKPOINT/EXCEPTION_SINGLE_STEP。 如果线程当前未处于步骤完成或断点事件,则此 API 将失败。

位置约束:必须从监视组件 (组件级别 < 100,000) 调用 API。

RemoveDataItem<T>()

从此容器中删除“T”的实例。 通常不需要调用此方法,因为数据容器会在对象关闭时自动清空。

(继承自 DkmDataContainer)
Resume(Boolean)

继续此线程。

SetContext(Byte[])

更新上下文 (注册线程) 的值。

SetDataItem<T>(DkmDataCreationDisposition, T)

在数据容器中放置一个新项。

(继承自 DkmDataContainer)
SetExtendedRegisterValue(Int32, ReadOnlyCollection<Byte>)

设置线程上下文中扩展寄存器的值。

SetTlsValue(Int32, UInt64)

将值存储在调试对象线程的线程本地存储 (指定 TLS 索引的 TLS) 槽中。 进程中的每个线程都具有自己的针对每个 TLS 索引的槽。

Suspend(Boolean)

挂起此线程。

Unload(Int32)

当监视器调用 DkmThread::Unload 时,调度程序发送 ThreadExit。

此方法只能由创建对象的组件调用。

适用于