我使用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;
}
答案 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)