gdb.py

gdb.py is a command line debugger similar to gdb, but with fewer features: no symbol support, no C language support, no thread support, etc.

Some commands

  • cont: continue execution
  • stepi: execute one instruction
  • step: execute one instruction, but don’t enter into calls

Type help to list all available commands.

Features

  • print command displays value as decimal and hexadecimal, but also the related memory mapping (if any):

    (gdb) print $eip
    Decimal: 3086383120
    Hexadecimal: 0xb7f67810
    Address is part of mapping: 0xb7f67000-0xb7f81000 => /lib/ld-2.6.1.so (r-xp)
    
  • Nice output of signal: see [[signal|python-ptrace signal handling]]

  • Syscall tracer with command “sys”: see python-ptrace system call tracer <syscall>. Short example:

    (gdb) sys
    long access(char* filename='/etc/ld.so.nohwcap' at 0xb7f7f35b, int mode=F_OK) = -2 (No such file or directory)
    
  • Supports multiple processes:

    (gdb) proclist
    <PtraceProcess #24187> (active)
    <PtraceProcess #24188>
    (gdb) proc
    Process ID: 24187 (parent: 24182)
    Process state: T (traced)
    Process command line: [['tests/fork_execve']
    (...)
    (gdb)|switch; proc
    Switch to <PtraceProcess #24188>
    Process ID: 24188 (parent: 24187)
    Process state: T (traced)
    Process command line: ['/bin/ls']]
    (...)
    
  • Allow multiple commands on the same line using “;” separator:

    (gdb) print $eax; set $ax=0xdead; print $eax
    Decimal: 0
    Hexadecimal: 0x00000000
    Set $ax to 57005
    Decimal: 57005
    Hexadecimal: 0x0000dead
    
  • Only written in pure Python code, so it’s easy to extend

  • Expression parser supports all arithmetic operator (a+b, a/b, a<<b, a&b, ...), parenthesis, use of registers, etc. and pointer dereference (ex: print *($ebx+0xc)).

Screenshot

$ ./gdb.py ls
execve(/bin/ls, [['/bin/ls'],|[/* 40 vars */]]) = 16182
(gdb) where
ASM 0xb7f47810: MOV EAX, ESP <==
ASM 0xb7f47812: CALL 0xb7f47a60
ASM 0xb7f47817: MOV EDI, EAX
ASM 0xb7f47819: CALL 0xb7f47800
(gdb) regs
     EBX = 0xb7f4781e
     ECX = 0x0001d2f4
     EDX = 0xb7f61ff4
     ESI = 0x00000000
     (...)
(gdb) proc
Process ID: 16182
Process command line: [['/bin/ls']
Process|environment: ['TERM=xterm', 'SHELL=/bin/bash', (...)]]
Process working directory: /home/vstinner/prog/fusil/ptrace/trunk
(gdb) stack
STACK: 0xbfc58000..0xbfc6e000
STACK -8: 0x00000000
STACK -4: 0xb7f4781e
STACK +0: 0x00000001
STACK +4: 0xbfc6c6bb
STACK +8: 0x00000000
(gdb) maps
MAPS: 08048000-0805b000 r-xp 00000000 08:03 2588939    /bin/ls
MAPS: 0805b000-0805c000 rw-p 00012000 08:03 2588939    /bin/ls
(...)
MAPS: b7f61000-b7f63000 rw-p 00019000 08:03 1540553    /lib/ld-2.6.1.so
MAPS: bfc58000-bfc6e000 rw-p bfc58000 00:00 0          [[stack]
MAPS:|ffffe000-fffff000 r-xp 00000000 00:00 0          [vdso]]
(gdb) quit
Quit.
Terminate <PtraceProcess pid=16182>
Quit gdb.