diff options
author | marcel <marcel@FreeBSD.org> | 2005-08-06 19:07:07 +0000 |
---|---|---|
committer | marcel <marcel@FreeBSD.org> | 2005-08-06 19:07:07 +0000 |
commit | dd65af4600147e732a667a7f126348494251258f (patch) | |
tree | c739ad201a0c2bb4b1388c93e37c18ab3960c384 /gnu/usr.bin/gdb | |
parent | 653cdbcef0811ef8d6084e294c9cb1347f2cf4be (diff) | |
download | FreeBSD-src-dd65af4600147e732a667a7f126348494251258f.zip FreeBSD-src-dd65af4600147e732a667a7f126348494251258f.tar.gz |
o As mentioned in the previous commit: make the KVM error buffer
static.
o Register a function with atexit(3) to close the KVM object if
we have one open.
o Show the unread portion of the kernel's message buffer before
presenting the prompt. It's bound to provide some useful info.
o Don't call kgdb_target() twice. It results in having all threads
listed twice.
MFC after: 1 week
Diffstat (limited to 'gnu/usr.bin/gdb')
-rw-r--r-- | gnu/usr.bin/gdb/kgdb/main.c | 64 |
1 files changed, 58 insertions, 6 deletions
diff --git a/gnu/usr.bin/gdb/kgdb/main.c b/gnu/usr.bin/gdb/kgdb/main.c index 22a9584..856cb93 100644 --- a/gnu/usr.bin/gdb/kgdb/main.c +++ b/gnu/usr.bin/gdb/kgdb/main.c @@ -66,6 +66,7 @@ extern void symbol_file_add_main (char *args, int from_tty); #include "kgdb.h" kvm_t *kvm; +static char kvm_err[_POSIX2_LINE_MAX]; static int dumpnr; static int verbose; @@ -78,6 +79,13 @@ static char *vmcore; static void (*kgdb_new_objfile_chain)(struct objfile * objfile); static void +kgdb_atexit(void) +{ + if (kvm != NULL) + kvm_close(kvm); +} + +static void usage(void) { @@ -167,11 +175,33 @@ out: kgdb_new_objfile_chain(objfile); } +static CORE_ADDR +kgdb_parse(const char *exp) +{ + struct cleanup *old_chain; + struct expression *expr; + struct value *val; + char *s; + CORE_ADDR n; + + s = strdup(exp); + old_chain = make_cleanup(free_current_contents, &expr); + expr = parse_expression(s); + val = (expr != NULL) ? evaluate_expression(expr) : NULL; + n = (val != NULL) ? value_as_address(val) : 0; + do_cleanups(old_chain); + free(s); + return (n); +} + static void kgdb_init_target(void) { + CORE_ADDR bufp; bfd *kern_bfd; + int size, rseq, wseq; int kern_desc; + char c; kern_desc = open(kernel, O_RDONLY); if (kern_desc == -1) @@ -199,6 +229,29 @@ kgdb_init_target(void) push_remote_target (remote, 0); else kgdb_target(); + + /* + * Display the unread portion of the message buffer. This gives the + * user a some initial data to work from. + */ + bufp = kgdb_parse("msgbufp->msg_ptr"); + size = (int)kgdb_parse("msgbufp->msg_size"); + rseq = (int)kgdb_parse("msgbufp->msg_rseq"); + wseq = (int)kgdb_parse("msgbufp->msg_wseq"); + if (bufp == 0 || size == 0 || rseq == wseq) + return; + + printf("\nUnread portion of the kernel message buffer:\n"); + while (rseq < wseq) { + read_memory(bufp + rseq, &c, 1); + putchar(c); + rseq++; + if (rseq == size) + rseq = 0; + } + if (c != '\n') + putchar('\n'); + putchar('\n'); } static void @@ -209,9 +262,8 @@ kgdb_interp_command_loop(void *data) if (!once) { once = 1; kgdb_init_target(); - kgdb_target(); - print_stack_frame (get_selected_frame (), - frame_relative_level (get_selected_frame ()), 1); + print_stack_frame(get_selected_frame(), + frame_relative_level(get_selected_frame()), 1); } command_loop(); } @@ -405,10 +457,10 @@ main(int argc, char *argv[]) } if (remote == NULL) { - s = malloc(_POSIX2_LINE_MAX); - kvm = kvm_openfiles(kernel, vmcore, NULL, O_RDONLY, s); + kvm = kvm_openfiles(kernel, vmcore, NULL, O_RDONLY, kvm_err); if (kvm == NULL) - errx(1, s); + errx(1, kvm_err); + atexit(kgdb_atexit); kgdb_thr_init(); } |