摘要
撰寫執行緒狀態的其中一個層面。
宣告
#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
因此,系統會忽略 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_size 與 kind 預期的結構大小不符,或要設定的值無效。
ZX_ERR_NO_MEMORY 記憶體不足,因此失敗。
使用者空間無法妥善處理這項 (不太可能發生的) 錯誤。
日後的版本將不會再發生這個錯誤。
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 暫存器的位址無效 (即無法從使用者空間定址),此外,如果為硬體中斷點設定的值超出平台提供的數量 (如要瞭解如何擷取該數量,請參閱上文)。