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