摘要
写入线程状态的一个方面。
声明
#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。
状态
如需查看可用状态及其对应的值的列表,请参阅 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
因此,除了 E 位(用于确定特定断点是否已激活)之外,DBGBCR 中的所有值都将被忽略。换句话说,要激活硬件断点,只需在 DBGBVR 中设置正确的地址,并将 1 写入 DBGBCR 即可。
权限
句柄必须是 ZX_OBJ_TYPE_THREAD 类型,并且具有 ZX_RIGHT_WRITE。
返回值
如果成功,zx_thread_write_state() 会返回 ZX_OK。
如果失败,则返回负错误值。
错误
ZX_ERR_BAD_HANDLE handle 不是有效的 handle。
ZX_ERR_WRONG_TYPE handle 不是线程的句柄。
ZX_ERR_ACCESS_DENIED handle 缺少 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 kind。
例如,当尝试读取程序当前运行的硬件不支持的寄存器集时,或者当使用 ZX_THREAD_STATE_DEBUG_REGS 类型但未在内核命令行上指定 kernel.enable-debugging-syscalls=true 时,可能会发生这种情况。
ARM
ZX_ERR_INVALID_ARGS 如果提供给 DBGBVR 寄存器的地址无效(即无法从用户空间寻址)。此外,如果为超出平台提供的数量的任何硬件断点设置了值(如需了解如何检索该数量,请参阅上文)。