Home

Awesome

janitor

Collection of GDB commands for low-level debugging, aimed at bringing debug.exe flavor into GDB command line interface. It includes advanced prompt substitution functionality.

Screenshot

ScreenShot

Install

~/git$ git clone https://github.com/monkeyman79/janitor.git
source ~/git/janitor/.gdbinit

Start

To install aliases, enable all features and setup fancy prompt, just type start-janitor in gdb command line.

Commands

Quick list

info janitor registers (alias jar)
info janitor cpu-flags (alias jaf)
set janitor registers-save on|off
show janitor registers-save
set janitor registers-on-stop on|off
show janitor registers-on-stop
janitor disassemble [start] [,end | ,+length] (alias jau)
set janitor disassemble-next-instr on|off
show janitor disassemble-next-instr
janitor dump [/fmt] [start] [,end | ,+length] (alias jad)
janitor raw-stack [/fmt] [+length] (alias jas)
set janitor word-width 2|4
show janitor word-width
set janitor dump-line-align on|off
show janitor dump-line-align
set janitor prompt PROMPT
janitor eval PROMPT
set janitor ansi on|off
set janitor i8086 on|off

Registers

info janitor registers
alias jar

Display CPU registers in low-lever debugger style with colors. At this moment the command support only i386 and ARM architectures.

info janitor cpu-flags
alias jaf

Display detailed eflags register contents.

set janitor registers-save on|off
show janitor registers-save

If this option is enabled, registers which have changed in last execution step are highlighted.

set janitor registers-on-stop on|off
show janitor registers-on-stop

If this option is enabled, registers are displayed after each execution step.

Disassemble

janitor disassemble [start] [,end | ,+length]
alias jau

Disassemble in low-level debugger style with colors. If start parameter is not specified, this command will continue disassembling at the point where it was previously finished.

set janitor disassemble-next-instr on|off
show janitor disassemble-next-instr

If this option is enabled, janitor will display disassembly of next instruction when execution stops.

Dump

janitor dump [/fmt] [start] [,end | ,+length]
alias jad

Dump memory in low-lever debugger style with colors.

The optional fmt parameter consists of size and endianness letters. Size letters are:

Endianness letters are

Order of size and endianness letters is not significant, b and l are interpreted as endianness letters only if accompanied with size letter.

If the fmt is not specified, format used in previous invocation will be used. If start is not specified, dump will continue at the point where it was previously finished.

janitor raw-stack [/fmt] [+length]
alias jas

Dump stack memory, similar to janitor dump $sp. Word width configured with set janitor word-width is used unless width is explicitly specified. It will try to highlight current stack frame in dumped bytes.

set janitor word-width 2|4
show janitor word-width

Default word width used for janitor raw-stack command by default, and for janitor dump command when w is present in fmt parameter.

set janitor dump-line-align on|off
show janitor dump-line-align

When this parameter is enabled, lines of memory dump will always begin at addresses being multiple of 16.

Prompt

set janitor prompt PROMPT

Set advanced prompt substitution string. Substitutions are described in separate paragraph below.

janitor eval PROMPT

Evaluate and display advanced prompt without changing the actual prompt.

ANSI terminal

set janitor ansi on|off

If this option is disabled, janitor doesn't use any ANSI terminal sequence in registers display, dump or disassembly, just raw text. For those poor souls who don't have ansi terminal.

Miscellaneous

set janitor i8086 on|off

Enables i8086 hack to disassemble by default starting at $cs:$eip instead or $pc and dump stack from $ss:$esp instead of $sp. This is useful when debugging real mode code e.g. running in QEMU. This should be somehow fixed in GDB, but that's completely different story.

Advanced prompt substitution

All substitutions are enclosed between ${ and }. Substitutions can be nested. Use backslash to escape characters from special interpretation: \$, \{, \}, \:, \#, \|.

Substitutions

Frames, registers and variables

${r:reg}

Value of register in selected frame.

${v:var}

Value of variable in selected frame.

${fn}

Selected frame number

${f[:attr]}

Selected frame attribute. Frame attribute can be one of: is_valid, num, name, architecture, pc, type, unwind_stop_reason. Default attribute is is_valid

${nr:reg}

Value of register in newest frame.

${nv:var}

Value of variable in newest frame.

${n[:attr]}

Newest frame attribute.

Threads

${tn}

Selected thread number

${t:[attr]}

Selected thread attribute. Thread attribute can be one of: is_valid, num, name, global_num, pid, lwpid, tid, is_stopped, is_running, is_exited. Default is is_valid

GDB parameters

${p:param}

Value of GDB parameter

ANSI SGI sequences

${[SEQ}

If ANSI sequences are enabled, evaluates to ANSI escape sequence \e[SEQm. Otherwise evaluates to empty string

Expressions and conditionals

${g:exp}

Expression value evaluated by GDB. Substitutions are converted to strings before evaluation.

${e:exp}

Expression value evaluated by Python. Substitutions are passed as variables to evaluation.

${?subst:if_true[:if_false]}

Substitute if_true if subst evaluates to true, otherwise substitute if_false. The subst expression undergoes substitution and is then evaluated by Python.

Inside {?subst:true:false}, each of true and false can be followed by a format or cast specifier (ie. terminating |format applies to false part only). To apply format to both parts, use {:{?subst:true:false}|format}.

${?:subst[:if_false]}

Substitute subst if it is anything different than None and empty string, otherwise substitute if_false.

${:exps}

Concatenation, evaluates and concatenates expressions. Can be also used to apply formatting.

Formatting

Append |format inside substitution brackets to format resulting value.

Type casting

Append #type[%string_conversion] inside substitution brackets to cast resulting value. Cast operation works differently for values of type gdb.Value and for all other types.

For gdb values it is possible to cast to any known type, using #(full type name) or use abbreviations for some well known types:

For non-gdb values reasonable casts are:

Optional string_conversion specifier applies only to values of type gdb.Value. Allowed values are:

Inherited from extended-prompt

Apart from ${ } substitutions, backslash substitutions from extended-prompt apply:

Examples

${?${fn}!=0:[${fn}]} - Expands to frame number enclosed in square brackets if selected frame is not top frame.

${?${r:cs}==${nr:cs}:cs:${r:cs|%08X}} - Expands to string cs if value of cs register in selected frame is the same as the register's value in top frame. Otherwise it expands to value of cs register formated as hexadecimal number.

Acknowlegements

Layout of displayed registers and general colors arrangement has been almost verbatim copied from GRDB Debugger by LADSoft.