gdb.sh: start gdb with useful facilities

This commit is contained in:
Giacomo Tesio 2017-01-19 19:31:07 +01:00
parent 8649dcc9b6
commit a14a0f9224
5 changed files with 169 additions and 290 deletions

4
_gdb/.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
*
!.gitignore
!init
!functions

112
_gdb/functions Normal file
View File

@ -0,0 +1,112 @@
# This file is part of Jehanne.
#
# Copyright (C) 2016-2017 Giacomo Tesio <giacomo@tesio.it>
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

11
_gdb/init Normal file
View File

@ -0,0 +1,11 @@
# This file is part of Jehanne.
#
# Copyright (C) 2016-2017 Giacomo Tesio <giacomo@tesio.it>
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<TAB>\n"
printf "TIP: Setup your own gdbinit at $JEHANNE_DEVELOPER_DIR\n\n"

42
gdb.sh Executable file
View File

@ -0,0 +1,42 @@
#!/bin/bash
# This file is part of Jehanne.
#
# Copyright (C) 2016-2017 Giacomo Tesio <giacomo@tesio.it>
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

290
gdbinit
View File

@ -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