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_STATE_DEBUG_REGS 旗標使用 zx_thread_write_state() 函式,您必須在核心指令列上指定 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 會將這項功能限制為未連結地址比對 HW 中斷點。也就是說,只有在對應 DBGBVR 暫存器中的指定位址發生例外狀況時,硬體中斷點才會發出例外狀況。

因此,系統會忽略 DBGBCR 中的所有值,但 E 位元除外,因為該位元可用於判斷是否啟用特定中斷點。換句話說,如要啟用硬體中斷點,只要在 DBGBVR 中設定正確的位址,並將 1 寫入 DBGBCR 即可。

權限

handle 必須是 ZX_OBJ_TYPE_THREAD 型別,且具有 ZX_RIGHT_WRITE

傳回值

zx_thread_write_state() 會在成功時傳回 ZX_OK。 如果失敗,系統會傳回負數錯誤值。

錯誤

ZX_ERR_BAD_HANDLE handle 不是有效的控制代碼。

ZX_ERR_WRONG_TYPE handle 不是執行緒的控制碼。

ZX_ERR_ACCESS_DENIED handle 缺少 ZX_RIGHT_WRITE

ZX_ERR_INVALID_ARGS kind 無效、buffer 是無效指標、buffer_sizekind 預期的結構大小不符,或要設定的值無效。

ZX_ERR_NO_MEMORY 記憶體不足,因此失敗。 使用者空間無法妥善處理這項 (不太可能發生的) 錯誤。 日後的版本將不會再發生這個錯誤。

ZX_ERR_BAD_STATE 執行緒未在可取得狀態的點停止。只有在執行緒因例外狀況而停止時,才能讀取執行緒狀態。

系統不支援「ZX_ERR_NOT_SUPPORTEDkind。 舉例來說,如果嘗試讀取程式目前執行的硬體不支援的暫存器集,或使用 ZX_THREAD_STATE_DEBUG_REGS 類型,但未在核心指令列上指定 kernel.enable-debugging-syscalls=true,就可能發生這種情況。

ARM

ZX_ERR_INVALID_ARGS 如果提供給 DBGBVR 暫存器的位址無效 (即無法從使用者空間定址),此外,如果為硬體中斷點設定的值超出平台提供的數量 (如要瞭解如何擷取該數量,請參閱上文)。

另請參閱