X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fruntime%2Fmonitor.c;h=45a9b00cb61e28b1060be8a50fbb2b85ca88975f;hb=ed1910efb36f71b5ebe33b5ffffd7195e15644de;hp=0f827240f42016d240c68f900f8a59ba55c92045;hpb=79d0a575af35d894966ea052415fb0c67dd888a6;p=sbcl.git diff --git a/src/runtime/monitor.c b/src/runtime/monitor.c index 0f82724..45a9b00 100644 --- a/src/runtime/monitor.c +++ b/src/runtime/monitor.c @@ -9,16 +9,19 @@ * files for more information. */ +#include "sbcl.h" + #include #include #include #include #include +#ifndef LISP_FEATURE_WIN32 #include +#endif #include #include -#include "sbcl.h" #include "runtime.h" #include "parse.h" #include "vars.h" @@ -177,25 +180,36 @@ print_cmd(char **ptr) static void kill_cmd(char **ptr) { +#ifndef LISP_FEATURE_WIN32 kill(getpid(), parse_number(ptr)); +#endif } static void regs_cmd(char **ptr) { - printf("CSP\t=\t0x%08lx\n", (unsigned long)current_control_stack_pointer); - printf("CFP\t=\t0x%08lx\n", (unsigned long)current_control_frame_pointer); + struct thread *thread=arch_os_get_current_thread(); + + printf("CSP\t=\t0x%08lx ", (unsigned long)access_control_stack_pointer(thread)); +#if !defined(LISP_FEATURE_X86) && !defined(LISP_FEATURE_X86_64) + printf("CFP\t=\t0x%08lx ", (unsigned long)access_control_frame_pointer(thread)); +#endif #ifdef reg_BSP - printf("BSP\t=\t0x%08lx\n", (unsigned long)current_binding_stack_pointer); + printf("BSP\t=\t0x%08lx\n", (unsigned long)get_binding_stack_pointer(thread)); #else /* printf("BSP\t=\t0x%08lx\n", (unsigned long)SymbolValue(BINDING_STACK_POINTER)); */ + printf("\n"); #endif #ifdef LISP_FEATURE_GENCGC /* printf("DYNAMIC\t=\t0x%08lx\n", DYNAMIC_SPACE_START); */ #else + printf("STATIC\t=\t0x%08lx ", + (unsigned long)SymbolValue(STATIC_SPACE_FREE_POINTER, thread)); + printf("RDONLY\t=\t0x%08lx ", + (unsigned long)SymbolValue(READ_ONLY_SPACE_FREE_POINTER, thread)); printf("DYNAMIC\t=\t0x%08lx\n", (unsigned long)current_dynamic_space); #endif @@ -203,19 +217,12 @@ regs_cmd(char **ptr) printf("ALLOC\t=\t0x%08lx\n", (unsigned long)dynamic_space_free_pointer); #else printf("ALLOC\t=\t0x%08lx\n", - (unsigned long)SymbolValue(ALLOCATION_POINTER)); + (unsigned long)SymbolValue(ALLOCATION_POINTER, thread)); #endif #ifndef LISP_FEATURE_GENCGC printf("TRIGGER\t=\t0x%08lx\n", (unsigned long)current_auto_gc_trigger); #endif - -#if 0 - printf("STATIC\t=\t0x%08lx\n", - (unsigned long)SymbolValue(STATIC_SPACE_FREE_POINTER)); - printf("RDONLY\t=\t0x%08lx\n", - (unsigned long)SymbolValue(READ_ONLY_SPACE_FREE_POINTER)); -#endif } static void @@ -268,8 +275,7 @@ search_cmd(char **ptr) end += 2; if (widetag_of(obj) == SIMPLE_FUN_HEADER_WIDETAG) { print((long)addr | FUN_POINTER_LOWTAG); - } else if (lowtag_of(obj) == OTHER_IMMEDIATE_0_LOWTAG || - lowtag_of(obj) == OTHER_IMMEDIATE_1_LOWTAG) { + } else if (other_immediate_lowtag_p(obj)) { print((lispobj)addr | OTHER_POINTER_LOWTAG); } else { print((lispobj)addr); @@ -297,9 +303,13 @@ quit_cmd(char **ptr) printf("Really quit? [y] "); fflush(stdout); - fgets(buf, sizeof(buf), ldb_in); - if (buf[0] == 'y' || buf[0] == 'Y' || buf[0] == '\n') + if (fgets(buf, sizeof(buf), ldb_in)) { + if (buf[0] == 'y' || buf[0] == 'Y' || buf[0] == '\n') + exit(1); + } else { + printf("\nUnable to read response, assuming y.\n"); exit(1); + } } static void @@ -351,31 +361,31 @@ print_context(os_context_t *context) static void print_context_cmd(char **ptr) { - int free; + int free_ici; struct thread *thread=arch_os_get_current_thread(); - free = SymbolValue(FREE_INTERRUPT_CONTEXT_INDEX,thread)>>2; + free_ici = fixnum_value(SymbolValue(FREE_INTERRUPT_CONTEXT_INDEX,thread)); if (more_p(ptr)) { int index; index = parse_number(ptr); - if ((index >= 0) && (index < free)) { - printf("There are %d interrupt contexts.\n", free); + if ((index >= 0) && (index < free_ici)) { + printf("There are %d interrupt contexts.\n", free_ici); printf("printing context %d\n", index); print_context(thread->interrupt_contexts[index]); } else { printf("There aren't that many/few contexts.\n"); - printf("There are %d interrupt contexts.\n", free); + printf("There are %d interrupt contexts.\n", free_ici); } } else { - if (free == 0) + if (free_ici == 0) printf("There are no interrupt contexts!\n"); else { - printf("There are %d interrupt contexts.\n", free); - printf("printing context %d\n", free - 1); - print_context(thread->interrupt_contexts[free - 1]); + printf("There are %d interrupt contexts.\n", free_ici); + printf("printing context %d\n", free_ici - 1); + print_context(thread->interrupt_contexts[free_ici - 1]); } } } @@ -383,7 +393,7 @@ print_context_cmd(char **ptr) static void backtrace_cmd(char **ptr) { - void backtrace(int frames); + void lisp_backtrace(int frames); int n; if (more_p(ptr)) @@ -392,7 +402,7 @@ backtrace_cmd(char **ptr) n = 100; printf("Backtrace:\n"); - backtrace(n); + lisp_backtrace(n); } static void @@ -443,7 +453,15 @@ sub_monitor(void) int ambig; if (!ldb_in) { +#ifndef LISP_FEATURE_WIN32 ldb_in = fopen("/dev/tty","r+"); + if (ldb_in == NULL) { + perror("Error opening /dev/tty"); + ldb_in = stdin; + } +#else + ldb_in = stdin; +#endif ldb_in_fd = fileno(ldb_in); } @@ -452,14 +470,7 @@ sub_monitor(void) fflush(stdout); line = fgets(buf, sizeof(buf), ldb_in); if (line == NULL) { - if (isatty(ldb_in_fd)) { - putchar('\n'); - continue; - } - else { - fprintf(stderr, "\nEOF on something other than a tty.\n"); - exit(0); - } + exit(1); } ptr = line; if ((token = parse_token(&ptr)) == NULL) @@ -497,7 +508,7 @@ ldb_monitor() bcopy(curbuf, oldbuf, sizeof(oldbuf)); - printf("LDB monitor\n"); + printf("Welcome to LDB, a low-level debugger for the Lisp runtime environment.\n"); setjmp(curbuf);