在 Linux/Windows 中運行的除錯器如何讀取 ARM32 和 Aarch64 上的 PC 暫存器?如何訪問指令暫存器值?
Linux上如何使用ptrace檢索子行程的PC暫存器?如何使用 GetThreadContext 從 Windows 子行程的背景關系結構中檢索 PC 暫存器?
謝謝。
uj5u.com熱心網友回復:
ptrace(2)具有PTRACE_GETREGS讀取所述tracee的所有通用暫存器,成選項struct user_regs_struct中定義<sys/user.h>。對于 AArch64,這個結構有一個大小為 31 的陣列,用于暫存器 x0 到 x30,以及用于 sp、pc 和 pstate 的單獨欄位。所以你可以這樣做(未經測驗):
#include <sys/ptrace.h>
#include <sys/user.h>
struct user_regs_struct regs;
if (ptrace(PTRACE_GETREGS, pid, NULL, ®s) < 0)
die();
printf("pc is %#llx\n", regs.pc);
對于 ARM32,它看起來像是呼叫了結構體struct user_regs,它只是一個大小為 18 的陣列。我猜它是 r0 到 r15(其中 r15 是 pc),然后也許pstate還有別的東西?您必須檢查內核或 GDB 源以進行確認。所以你可能可以這樣做(非常未經測驗):
#include <sys/ptrace.h>
#include <sys/user.h>
struct user_regs regs;
if (ptrace(PTRACE_GETREGS, pid, NULL, ®s) < 0)
die();
printf("pc is %#lx\n", regs.uregs[15]);
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/383645.html
