这个问题与this question类似,但是我正在寻找一种在Mac计算机上执行此操作的方法。诸如位切片器之类的调试器可以监视对地址的读/写访问,然后只要访问该地址,它就会为您提供诸如寄存器值之类的信息。我想要类似的东西,但是要通过编程来完成。我已经尝试过GNU Hurd的这个代码段,但是我无法使其正常工作:
void set_hardware_watchpoint(mach_port_t thread, int num, int type, mach_vm_address_t *addr, size_t len)
{
x86_debug_state_t regs;
int persistence = 3;
len = len - 1;
if (len == 7)
len = 2;
mach_msg_type_number_t count = x86_THREAD_STATE_COUNT;
int ret = thread_get_state(thread, x86_DEBUG_STATE, (unsigned*) ®s, &count);
assert(ret == 0);
regs.uds.ds64.__dr0 = (uintptr_t) addr;
regs.uds.ds64.__dr7 &= ~(0xfUL << (4*num+16)) & ~(0x3UL << (2*num));
if (addr)
regs.uds.ds64.__dr0 |= (((len << 2) | type) << (4*num+16)) | (persistence << (2*num));
ret = thread_set_state(thread, x86_DEBUG_STATE, (unsigned*) ®s, count);
assert(ret == 0);
ret = thread_get_state(thread, x86_DEBUG_STATE, (unsigned*) ®s, &count);
assert(ret == 0);
}
我真正想要的唯一东西是可以监视地址访问的东西,当发现访问地址时,它应该打印出所有寄存器。