如何设置观察点和读取寄存器值Mac

时间:2018-09-01 18:29:47

标签: debugging mach watchpoint cpu-registers

这个问题与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*) &regs, &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*) &regs, count);
assert(ret == 0); 
ret = thread_get_state(thread, x86_DEBUG_STATE, (unsigned*) &regs, &count);
assert(ret == 0); 
}

我真正想要的唯一东西是可以监视地址访问的东西,当发现访问地址时,它应该打印出所有寄存器。

0 个答案:

没有答案