zx_thread_write_state

摘要

写入线程状态的一个方面。

声明

#include <zircon/syscalls.h>

zx_status_t zx_thread_write_state(zx_handle_t handle,
                                  uint32_t kind,
                                  const void* buffer,
                                  size_t buffer_size);

说明

zx_thread_write_state() 会写入线程状态的一个方面。只有在线程因异常而停止或线程被暂停时,才能写入线程状态。

线程状态高度依赖于处理器。如需了解每个平台上结构的内容,请参阅 zircon/syscalls/debug.h 中的结构。

如需将 zx_thread_write_state() 函数与 ZX_THREAD_STATE_DEBUG_REGS 标志搭配使用,您必须在内核命令行中指定 kernel.enable-debugging-syscalls=true。否则,该函数会返回 ZX_ERR_NOT_SUPPORTED。

STATES

如需查看可用状态及其对应值的列表,请参阅 zx_thread_read_state()。

ZX_THREAD_STATE_DEBUG_REGS

ARM

ARM 具有数量可变的调试断点和监视点。对于此架构,zx_thread_state_debug_regs_t 足够大,可以容纳尽可能多的断点。但在大多数情况下,给定的 CPU 实现会保留较少的数量,这意味着不会使用超出限制的上限值。

内核将写入硬件中的所有可用寄存器,而与给定的断点/监视点计数值无关。这意味着必须为调用设置所有正确的状态。

您可以通过调用 zx_thread_read_state() 获取寄存器的当前状态。

ARM 调试硬件调试寄存器

ARM 调试寄存器可通过其 DBGBCR 寄存器进行高度配置。 不过,Zircon 将该功能限制为未关联的地址匹配硬件断点。这意味着,只有在相应 DBGBVR 寄存器中的给定地址发生异常时,硬件断点才会发出异常。

因此,DBGBCR 中的所有值都将被忽略,但 E 位除外,该位用于确定是否激活该特定断点。换句话说,若要激活硬件断点,只需在 DBGBVR 中设置正确的地址,并将 1 写入 DBGBCR 即可。

权限

handle 必须为 ZX_OBJ_TYPE_THREAD 类型,且具有 ZX_RIGHT_WRITE。

返回值

zx_thread_write_state() 成功时返回 ZX_OK。 如果失败,则返回负错误值。

错误

ZX_ERR_BAD_HANDLE 标识名不是有效的标识名。

ZX_ERR_WRONG_TYPE 句柄不是线程的句柄。

ZX_ERR_ACCESS_DENIED 标识名缺少 ZX_RIGHT_WRITE。

ZX_ERR_INVALID_ARGS kind 无效,buffer 是无效指针,buffer_size 与 kind 预期的结构大小不匹配,或者要设置的给定值无效。

ZX_ERR_NO_MEMORY 因内存不足而失败。 用户空间没有很好的方法来处理这种(不太可能发生的)错误。 在未来的 build 中,此错误将不再发生。

ZX_ERR_BAD_STATE 线程未在状态可用的位置停止。只有在线程因异常而停止时,才能读取线程状态。

不支持 ZX_ERR_NOT_SUPPORTED 种类。 例如,当尝试读取当前运行程序的硬件不支持的寄存器集时,或者在内核命令行上使用 ZX_THREAD_STATE_DEBUG_REGS 类型而未指定 kernel.enable-debugging-syscalls=true 时,可能会发生这种情况。

ARM

ZX_ERR_INVALID_ARGS 如果提供给 DBGBVR 寄存器的地址无效(即无法从用户空间寻址)。此外,如果为硬件断点设置的任何值超出了平台提供的数量(如需了解如何检索该数量,请参阅上文),或者 ZX_THREAD_STATE_ARM64_SVE 具有非单调 ffr 掩码(其位必须形成从位 0 开始的连续 1 序列),也会发生这种情况。

另请参阅