控制断点标志和参数

有许多方法可用于确定有关断点的基本信息:

  • GetId 返回断点 ID。

  • GetType 返回软件或处理器) (断点类型,以及设置断点的有效处理器的类型。

  • GetAdder 返回添加了断点的客户端。

  • GetOffset 返回断点的地址。

  • GetOffsetExpression 返回指定断点位置的表达式字符串。

除了位置和断点类型之外,断点还具有多个控制其行为的参数。

可以通过各种特定方法控制断点参数。 此外,可以使用 GetParameters 一起查询大多数参数。

断点标志

断点标志是一种断点参数。

可以使用 GetFlags 查询断点标志。 可以使用 AddFlagsRemoveFlagsSetFlags 更改它们。

断点标志形成位字段。 可在此位字段中使用的可能标志及其含义如下所示:

DEBUG_BREAKPOINT_ENABLED
设置此标志后,将 启用 断点,并具有正常效果。 如果未设置此标志,则 禁用 断点,不会有任何影响。 如果要暂时停用断点,可以删除此标志;然后,当想要重新启用此断点时,可以轻松地重新添加此标志。

DEBUG_BREAKPOINT_ADDER_ONLY
设置此标志时,断点为 专用断点。 此断点仅对添加它的客户端可见。 在这种情况下,其他客户端将无法在引擎中查询断点,并且引擎不会将断点生成的事件发送到其他客户端。 与此断点相关的所有回调 (事件和 输出) 将仅发送到此客户端。 请参阅 GetAdder

DEBUG_BREAKPOINT_GO_ONLY
设置此标志时,仅当目标处于不受限制的执行状态时,才会触发断点。 如果引擎单步执行目标中的指令,则不会触发该操作。

DEBUG_BREAKPOINT_ONE_SHOT
设置此标志后,断点将在第一次触发时自动删除自身。

DEBUG_BREAKPOINT_DEFERRED
设置此标志后,断点 将延迟。 当使用符号表达式指定断点的偏移量时,此标志由引擎设置,并且引擎无法计算表达式。 每次在目标中加载或取消定向模块时,引擎都会尝试重新计算其位置是使用表达式指定的所有断点的表达式。 无法评估的那些将被标记为延迟。 任何客户端都不能修改此标志。

其他断点参数

断点参数还包括:

通过计数
如果断点具有与之关联的传递计数,则在目标通过断点指定次数之前,不会激活该断点。 可以使用 GetPassCount 找到最初设置的传递计数。 可以使用 GetCurrentPassCount 找到引擎在激活断点之前通过断点的剩余次数。 可以使用 SetPassCount 将传递计数重置为新值。

匹配线程
如果断点有与之关联的线程,则当任何其他线程遇到断点时,引擎将忽略它。 可以使用 GetMatchThreadId 找到线程,也可以使用 SetMatchThreadId 更改线程。

命令
断点可能有与之关联的命令。 激活断点时,将执行命令。 可以使用 GetCommand 找到此命令,也可以使用 SetCommand 进行更改。

大小
如果断点是处理器断点,则必须具有指定的大小。 这决定了内存块的大小,该块的访问将激活断点 -- 块的开头是断点的位置。 可以使用 GetDataParameters 找到大小,也可以使用 SetDataParameters 进行更改。

访问类型
如果断点是处理器断点,则必须具有访问类型。 这将确定将激活断点的访问类型。 例如,如果目标从断点读取、写入或执行断点指定的内存,则可能会激活断点。 可以使用 GetDataParameters 找到访问类型,也可以使用 SetDataParameters 更改访问类型。

处理器断点的有效参数

以下访问类型可用于处理器断点:

说明

DEBUG_BREAK_READ

当 CPU 读取断点的内存块中的内存时,将触发断点。

DEBUG_BREAK_WRITE

当 CPU 在断点的内存块中写入内存时,将触发断点。

DEBUG_BREAK_READ |DEBUG_BREAK_WRITE

当 CPU 读取或写入断点的内存块中的内存时,将触发断点。

DEBUG_BREAK_EXECUTE

当 CPU 提取断点内存块中的指令时,将触发断点。

DEBUG_BREAK_IO

访问断点内存块中的 I/O 端口时,将触发断点。 仅 (Windows XP 和 Microsoft Windows Server 2003,仅限内核模式,仅 x86)

并非所有访问类型和大小都支持所有处理器。 支持以下访问类型和大小:

x86
支持所有访问类型。 DEBUG_BREAK_READ的行为类似于 DEBUG_BREAK_READ |DEBUG_BREAK_WRITE。 大小必须为 1、2 或 4。 断点的地址必须是大小的倍数。

x64
支持所有访问类型。 DEBUG_BREAK_READ的行为类似于 DEBUG_BREAK_READ |DEBUG_BREAK_WRITE。 大小必须为 1、2、4 或 8。 断点的地址必须是大小的倍数。