Как установить точку наблюдения и прочитать значения регистра Mac - PullRequest
0 голосов
/ 01 сентября 2018

Этот вопрос похож на этот вопрос , но я ищу способ сделать это на компьютере 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); 
}

Единственное, что я действительно ищу, это что-то, что может наблюдать за доступом к адресу, и когда оно находит доступ, оно должно распечатать все регистры.

...