For the moment, only a ptrace back-end is implemented, but I've begun to work on a gdbserver backend.
>>> from pytstop import *
>>> p=Ptrace("/bin/ls")
INFO: process 14006 attached
>>> p
<VBox ptrace [/bin/ls] PC=b7feb7c0 sig=0>
>>> p.singlestep()
INFO: Received stop signal 5
DEBUG: TRAP: singlestep
>>> p
<VBox ptrace [/bin/ls] PC=b7feb7c2 sig=0>
>>> p.ebx
0L
>>> p.ebx=4
>>> p.ebx
4L
>>> p.ebx=0
>>> p[p.eip::20]
'\xe8\xb9,\x00\x00\x89\xc7\xe8\xe2\xff\xff\xff\x81\xc3&X\x01\x00\x8b\x83'
>>> p.mnemonic()
'call 0x2cb9'
>>> p.singlestep()
>>> p.singlestep()
INFO: Received stop signal 5
DEBUG: TRAP: singlestep
>>> p.mnemonic()
'mov DWORD PTR [ebp-0x30],eax'
>>> o=p.opcode()
>>> o
<Opcode: mov DWORD PTR [ebp-0x30],eax>
>>> o.source
<Expression: DWORD PTR [ebp-0x30]>
>>> o.source.eval(p.get_all_regs())
3221219496L
>>> p.ebp-0x30
3221219496L
>>> p.set_bp(0x8049a50)
0
>>> p.set_hbp(0x8049a52)
0
>>> p.set_bp(0x8049a53)
1
>>> p.cont()
INFO: Received stop signal 5
INFO: TRAP: software breakpoint #0 at 0x08049a50
>>> p.cont()
DEBUG: pass bp at 08049a50
INFO: Received stop signal 5
DEBUG: TRAP: singlestep
DEBUG: passed pb. Now at 08049a52
INFO: Received stop signal 5
INFO: TRAP: hardware breakpoint #0 at 0x08049a52
>>> p.cont()
DEBUG: pass bp at 08049a52
INFO: Received stop signal 5
DEBUG: TRAP: singlestep
DEBUG: passed pb. Now at 08049a53
INFO: Received stop signal 5
INFO: TRAP: software breakpoint #1 at 0x08049a53
>>> mainlog.setLevel(50) # stop log messages
>>> p.cont()
pytstop.py pytstop.pyc
Traceback (most recent call last):
File "", line 1, in ?
File "pytstop.py", line 542, in cont
return self.wait()
File "pytstop.py", line 592, in wait
raise ProcessExited(os.WEXITSTATUS(s))
pytstop.ProcessExited: 0