ptrace单步后跟set断点失败

时间:2014-10-10 10:37:45

标签: python ptrace

我使用python' s ptrace模块编写调试器代码。调试程序在断点处停止后,我执行:

  • 恢复断点位置的原始指令
  • 只需一步,
  • 再次设置断点,
  • 继续执行该程序。

在我的系统上,如果步骤2(singleStep)紧跟在步骤3(createBreakpoint)后面,那么错误信息就会出错:

ptrace.error.PtraceError: ptrace(cmd=4, ...) error #3: No such process

但如果我插入一个延迟(在下面的代码中使用sys.readline),那么所有步骤和调试的程序都会成功执行。

很可能,错误并非特定于ptrace模块,也许我只是不知道正确的方法。欢迎任何帮助。

Python代码:

import sys
import ptrace.debugger.child
import ptrace.debugger.debugger

pid = ptrace.debugger.child.createChild(['./sleeper'], 0)
dbg = ptrace.debugger.debugger.PtraceDebugger()
process = dbg.addProcess(pid, is_attached=1)

# use gdb "disassemble main" to find the address of
# the "movel"-instruction between the two "call"s
bp = process.createBreakpoint(0x08048432)

process.cont()
event = process.waitEvent()
print("New process event: %s" % event)
bp.desinstall(set_ip=1)
# Try to reinstall the breakpoint
process.singleStep()
if 1: # otherwise crash?
  print 'Press any key to continue...'
  sys.stdin.readline()
bp = process.createBreakpoint(bp.address)
print("Continue process execution")
process.cont()

C代码:

#include <stdio.h>

int main() {
    printf( "~~~~~~~~~~~~> Before breakpoint\n" );
    // The breakpoint
    printf( "~~~~~~~~~~~~> After breakpoint\n" );
    return 0;
}

1 个答案:

答案 0 :(得分:0)

ptrace的手册页说:

  

PTRACE_SYSCALL,PTRACE_SINGLESTEP

     

重新启动已停止的tracee   PTRACE_CONT,但安排在下一次停止tracee   进入或退出系统调用,或执行单个调用之后   指令,分别。 (跟踪也会像往常一样停止   收到信号后。)从跟踪器的角度来看,tracee似乎已经通过收到SIGTRAP 而停止了。因此对于   例如,PTRACE_SYSCALL的想法是检查参数   系统调用第一站,然后再做另一个PTRACE_SYSCALL和   在第二站检查系统调用的返回值。该   data参数被视为PTRACE_CONT。 (addr被忽略。)

我试图通过什么都不做来处理信号,这有帮助。

process.singleStep()
event = process.waitEvent() # Repair-line
bp = process.createBreakpoint(bp.address)