From a14a0f922480d25584600d2ff8bac2027a445146 Mon Sep 17 00:00:00 2001 From: Giacomo Tesio Date: Thu, 19 Jan 2017 19:31:07 +0100 Subject: [PATCH] gdb.sh: start gdb with useful facilities --- _gdb/.gitignore | 4 + _gdb/functions | 112 +++++++++++++++++++ _gdb/init | 11 ++ gdb.sh | 42 +++++++ gdbinit | 290 ------------------------------------------------ 5 files changed, 169 insertions(+), 290 deletions(-) create mode 100644 _gdb/.gitignore create mode 100644 _gdb/functions create mode 100644 _gdb/init create mode 100755 gdb.sh delete mode 100644 gdbinit diff --git a/_gdb/.gitignore b/_gdb/.gitignore new file mode 100644 index 0000000..9becd18 --- /dev/null +++ b/_gdb/.gitignore @@ -0,0 +1,4 @@ +* +!.gitignore +!init +!functions diff --git a/_gdb/functions b/_gdb/functions new file mode 100644 index 0000000..911ff08 --- /dev/null +++ b/_gdb/functions @@ -0,0 +1,112 @@ +# This file is part of Jehanne. +# +# Copyright (C) 2016-2017 Giacomo Tesio + +set $__pendingUserBreak = 0 + +define jhn-print-with-context + if up != 0 + printf "%s %d ", up->text, up->pid + end + if m != 0 + printf "(mach %d) ", m->machno + end + if $argc == 1 + p $arg0 + end + if $argc == 2 + printf $arg0, $arg1 + end + if $argc == 3 + printf $arg0, $arg1, $arg2 + end + if $argc == 4 + printf $arg0, $arg1, $arg2, $arg3 + end + printf "\n" +end + +define jhn-log-syscalls + b syscall + commands + jhn-print-with-context " pc = 0x%x " ureg->ip + c + end +end + +define jhn-break-errors + b errorl + commands + jhn-print-with-context + bt 4 + c + end +end + +define jhn-break-cmd + if $argc < 2 || $argc > 3 + printf "usage: jhn-break-cmd symbol/path \"programName\" [address]\n" + else + if $__pendingUserBreak > 0 + printf "jhn-break-cmd: cannot set a new breakpoint in user space until the previous one is recorded at\n " + info line *$__breakAddr + else + add-symbol-file $arg0 0x4000c0 + set __onExecFaultBreakForCMD = $arg1 + set $__breakAddr = (uintptr_t)0x4000c0 + set $__breakPageStart = (uintptr_t)0x400000 + set $__breakPageEnd = (uintptr_t)0x401000 + if $argc == 3 + set $__breakAddr = (uintptr_t)$arg2 + set $__breakPageStart = (uintptr_t)($__breakAddr & ~(0x1000-1)) + set $__breakPageEnd = (uintptr_t)($__breakAddr + 0x1000) + end + b *peekAtExecFaults+114 if addr >= $__breakPageStart && addr < $__breakPageEnd + set $__pendingUserBreak = $bpnum + commands + d $__pendingUserBreak + set $__pendingUserBreak = 0 + b *$__breakAddr + c + end + end + end +end + +define jhn-break-pid + if $argc < 2 || $argc > 3 + printf "usage: jhn-break-pid symbol/path pid [address]\n" + else + if $__pendingUserBreak > 0 + printf "jhn-break-pid: cannot set a new breakpoint in user space until the previous one is recorded at\n " + info line *$__breakAddr + else + add-symbol-file $arg0 0x4000c0 + set __onExecFaultBreakForPID = $arg1 + set $__breakAddr = (uintptr_t)0x4000c0 + set $__breakPageStart = (uintptr_t)0x400000 + set $__breakPageEnd = (uintptr_t)0x401000 + if $argc == 3 + set $__breakAddr = (uintptr_t)$arg2 + set $__breakPageStart = (uintptr_t)($__breakAddr & ~(0x1000-1)) + set $__breakPageEnd = (uintptr_t)($__breakAddr + 0x1000) + end + b *peekAtExecFaults+64 if addr >= $__breakPageStart && addr < $__breakPageEnd + set $__pendingUserBreak = $bpnum + commands + d $__pendingUserBreak + set $__pendingUserBreak = 0 + b *$__breakAddr + c + end + end + end +end + +define jhn-connect + target remote :1234 + printf "connected to QEMU\n" + if $pc == waitdebugger+22 + set var c = 1 + end +end diff --git a/_gdb/init b/_gdb/init new file mode 100644 index 0000000..4adc882 --- /dev/null +++ b/_gdb/init @@ -0,0 +1,11 @@ +# This file is part of Jehanne. +# +# Copyright (C) 2016-2017 Giacomo Tesio + +source ./hacking/_gdb/env +source ./hacking/_gdb/functions + +printf "\nThank you for debugging Jehanne!\n\n" +printf "TIP: You can find some useful functions typing jh\n" +printf "TIP: Setup your own gdbinit at $JEHANNE_DEVELOPER_DIR\n\n" + diff --git a/gdb.sh b/gdb.sh new file mode 100755 index 0000000..0fe2913 --- /dev/null +++ b/gdb.sh @@ -0,0 +1,42 @@ +#!/bin/bash + +# This file is part of Jehanne. +# +# Copyright (C) 2016-2017 Giacomo Tesio + +if [ "$JEHANNE" = "" ]; then + echo $0 requires the shell started by ./hacking/devshell.sh + exit 1 +fi + +KERNEL_TO_LOAD=$1 + +if [ "$KERNEL_TO_LOAD" = "" ]; then + KERNEL_TO_LOAD=$JEHANNE/arch/amd64/kern/jehanne +fi + +echo > $JEHANNE/hacking/_gdb/env +echo "set \$JEHANNE = \"$JEHANNE\"" >> $JEHANNE/hacking/_gdb/env + +if [ "$JEHANNE_GDB_LOGS" != "" ]; then + git rev-parse HEAD > $JEHANNE_GDB_LOGS + git status --porcelain -b >> $JEHANNE_GDB_LOGS + + echo "set pagination off" >> $JEHANNE/hacking/_gdb/env + echo "set logging file $JEHANNE_GDB_LOGS" >> $JEHANNE/hacking/_gdb/env + echo "set logging overwrite off" >> $JEHANNE/hacking/_gdb/env + echo "set logging on" >> $JEHANNE/hacking/_gdb/env +fi + +if [ "$JEHANNE_DEVELOPER_DIR" != "" ]; then + echo "set \$JEHANNE_DEVELOPER_DIR = \"$JEHANNE_DEVELOPER_DIR\"" >> $JEHANNE/hacking/_gdb/env + if [ -a $JEHANNE_DEVELOPER_DIR/gdbinit ]; then + echo source $JEHANNE_DEVELOPER_DIR/gdbinit >> $JEHANNE/hacking/_gdb/env + fi +else + echo "set \$JEHANNE_DEVELOPER_DIR = \"$HOME/.jehanne\"" >> $JEHANNE/hacking/_gdb/env +fi + +gdb -x $JEHANNE/hacking/_gdb/init $KERNEL_TO_LOAD + +rm $JEHANNE/hacking/_gdb/env diff --git a/gdbinit b/gdbinit deleted file mode 100644 index 9360c1f..0000000 --- a/gdbinit +++ /dev/null @@ -1,290 +0,0 @@ -set pagination off -set logging file ../qemu-gdb.log -set logging overwrite on -set logging on - -define log_mach_proc - if up != 0 - printf "%s %d ", up->text, up->pid - end - if m != 0 - printf "(mach %d) ", m->machno - end -end - -define log_syscall - log_mach_proc - printf "\n" - c -end - -define log_syscalls - - # sysbind - b ../port/sysfile.c:1167 - commands - log_syscall - end - - # syschdir - b ../port/sysfile.c:1027 - commands - log_syscall - end - - # sysclose - b ../port/sysfile.c:375 - commands - log_syscall - end - - # syscreate - b ../port/sysfile.c:1263 - commands - log_syscall - end - - # sysdup - b ../port/sysfile.c:263 - commands - log_syscall - end - - # sysfd2path - b ../port/sysfile.c:191 - commands - log_syscall - end - - # sysfstat - b ../port/sysfile.c:999 - commands - log_syscall - end - - # sysfwstat - b ../port/sysfile.c:1371 - commands - log_syscall - end - - # sysmount - b ../port/sysfile.c:1192 - commands - log_syscall - end - - # sysopen - b ../port/sysfile.c:311 - commands - log_syscall - end - - # syspipe - b ../port/sysfile.c:214 - commands - log_syscall - end - - # syspread - b ../port/sysfile.c:787 - commands - log_syscall - end - - # syspwrite - b ../port/sysfile.c:857 - commands - log_syscall - end - - # sysremove - b ../port/sysfile.c:1293 - commands - log_syscall - end - - # sysseek - b ../port/sysfile.c:929 - commands - log_syscall - end - - # sysunmount - b ../port/sysfile.c:1210 - commands - log_syscall - end - - # sysfversion - b ../port/sysauth.c:50 - commands - log_syscall - end - - # sysfauth - b ../port/sysauth.c:83 - commands - log_syscall - end - - # sysrfork - b ../port/sysproc.c:36 - commands - log_syscall - end - - # sysalarm - b ../port/sysproc.c:656 - commands - log_syscall - end - - # sysawake - b ../port/sysproc.c:682 - commands - printf "sys->ticks %lld ms %lld \n", sys->ticks, ms - log_syscall - end - - # sysawait - b ../port/sysproc.c:729 - commands - log_syscall - end - - # syserrstr - b ../port/sysproc.c:791 - commands - log_syscall - end - - # sysnotify - b ../port/sysproc.c:809 - commands - log_syscall - end - - # sysexec - b ../port/sysproc.c:284 - commands - log_syscall - end - - # sysexits - b ../port/sysproc.c:702 - commands - if status != 0 - printf "status: %s", status - else - printf "status: (nil)" - end - log_syscall - end - - # sysnoted - b ../port/sysproc.c:840 - commands - log_syscall - end - - # sysrendezvous - b ../port/sysproc.c:861 - commands - printf "tag %llu rendval %llu\n", tag, rendval - printf "sys->ticks %lld lastWakeup %lld pendingWakeup %lld \n", sys->ticks, up->lastWakeup, up->pendingWakeup - log_syscall - end - - # sysnotify - b ../port/sysproc.c:820 - commands - log_syscall - end - - # sysnsec - b ../port/sysproc.c:1233 - commands - log_syscall - end - - # syssemacquire - b ../port/sysproc.c:1167 - commands - log_syscall - end - - # syssemrelease - b ../port/sysproc.c:1222 - commands - log_syscall - end - - # syssleep - b ../port/sysproc.c:640 - commands - printf "ms %lld\n", ms - log_syscall - end - - # systsemacquire - b ../port/sysproc.c:1193 - commands - log_syscall - end - -end - -define debug_awake - # awakekproc - b ../port/awake.c:139 - commands - printf "%s %d ", p->text, p->pid - printf "p->state %d p->lastWakeup %lld toAwake->time %d \n", p->state, p->lastWakeup, toAwake->time - c - end - - # sysawake - b ../port/sysproc.c:682 - commands - printf "sys->ticks %lld ms %lld \n", sys->ticks, ms - log_syscall - end - - # sysrendezvous - b ../port/sysproc.c:861 - commands - printf "ENTER: \n tag %llu rendval %llu\n", tag, rendval - printf "sys->ticks %lld lastWakeup %lld pendingWakeup %lld \n", sys->ticks, up->lastWakeup, up->pendingWakeup - log_syscall - end - - # sysrendezvous - b ../port/sysproc.c:879 - commands - printf "EXIT on match: \n tag %llu rendval %llu\n", tag, rendval - printf "sys->ticks %lld lastWakeup %lld pendingWakeup %lld \n", sys->ticks, up->lastWakeup, up->pendingWakeup - log_syscall - end - - # sysrendezvous - b ../port/sysproc.c:886 - commands - printf "EXIT on awaken: \n tag %llu rendval %llu\n", tag, rendval - printf "sys->ticks %lld lastWakeup %lld pendingWakeup %lld \n", sys->ticks, up->lastWakeup, up->pendingWakeup - log_syscall - end - - # sysrendezvous - b ../port/sysproc.c:902 - commands - printf "EXIT after wait: \n tag %llu rendval %llu\n", tag, rendval - printf "sys->ticks %lld lastWakeup %lld pendingWakeup %lld \n", sys->ticks, up->lastWakeup, up->pendingWakeup - log_syscall - end - -end - -#log_syscalls - -