PTRACE_SINGLESTEP не перемещается%rip
Итак, я пишу отладчик. В отладчике я хочу постоянные точки останова. Сейчас я просто работаю над тем, чтобы настроить его только на одну точку останова. Когда я говорю отладчику продолжить, я делаю это...
ptrace( PTRACE_GETREGS, child, NULL, ®s);
printf("%lx\n", regs.rip);
ptrace( PTRACE_SINGLESTEP, child, NULL, NULL);
ptrace( PTRACE_GETREGS, child, NULL, ®s);
printf("%lx\n", regs.rip);
ptrace( PTRACE_POKETEXT, child, (void *)original_addr, (original_data & ~0xff) | 0xcc);
Тем не менее, я получаю вывод...
40053d
40053d
Это означает, что разрыв не обновился. Это согласуется с тем фактом, что когда я продолжаю больше раз, чем итерацию по точке останова, он все еще находится в точке останова. Какие-нибудь мысли?
РЕДАКТИРОВАТЬ: Так вот в чем проблема. Дочерний процесс на самом деле не запускает SINGLESTEP до тех пор, пока не увидит вызов wait(), после чего он запускается и возвращает управление родительскому элементу, когда выполняет одну инструкцию. Я не звонил ждать, поэтому он не обновлялся в тот момент. Так что он просто распечатал один и тот же дважды. Затем он достиг состояния контрольной точки и обновился до исходного%rip в начале инструкции. Приветствия.