总结
写入线程状态的一个方面。
声明
#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-serial-syscalls=true
。否则,该函数会返回 ZX_ERR_NOT_SUPPORTED
。
省/自治区/直辖市
如需查看可用状态及其对应值的列表,请参阅 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
因此,系统会忽略 DBGBCR 中的所有值,但 E 位除外,该位用于确定该特定断点是否已激活。换句话说,要激活硬件断点,您只需在 DBGBVR 中设置正确的地址并向 DBGBCR 写入 1 即可。
权限
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
种类。例如,当尝试读取当前运行程序的硬件不支持的寄存器集时,或者在没有在内核命令行中指定 kernel.enable-serial-syscalls=true
的情况下使用 ZX_THREAD_STATE_DEBUG_REGS
种类时,就可能会发生这种情况。
ARM
ZX_ERR_INVALID_ARGS
:如果提供给 DBGBVR 寄存器的地址无效(即无法从用户空间寻址)。此外,如果为平台提供的号码之外的硬件断点设置任何值(如需了解如何检索该号码,请参阅上文)。