Changeset 46c20c8 in mainline for kernel/generic/src/debug
- Timestamp:
- 2010-11-26T20:08:10Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 45df59a
- Parents:
- fb150d78 (diff), ffdd2b9 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - Location:
- kernel/generic/src/debug
- Files:
-
- 1 added
- 2 edited
- 1 moved
-
debug.c (moved) (moved from kernel/test/synch/rwlock2.c ) (2 diffs)
-
panic.c (added)
-
stacktrace.c (modified) (6 diffs)
-
symtab.c (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/debug/debug.c
rfb150d78 r46c20c8 1 1 /* 2 * Copyright (c) 20 01-2004 Jakub Jermar2 * Copyright (c) 2010 Martin Decky 3 3 * All rights reserved. 4 4 * … … 27 27 */ 28 28 29 #include <test.h> 30 #include <arch.h> 31 #include <atomic.h> 29 /** @addtogroup genericdebug 30 * @{ 31 */ 32 33 /** 34 * @file 35 * @brief Kernel instrumentation functions. 36 */ 37 38 #ifdef CONFIG_TRACE 39 40 #include <debug.h> 41 #include <symtab.h> 42 #include <errno.h> 32 43 #include <print.h> 33 #include <proc/thread.h>34 44 35 #include <synch/rwlock.h> 36 37 #define READERS 50 38 #define WRITERS 50 39 40 static rwlock_t rwlock; 41 42 static void writer(void *arg) 45 void __cyg_profile_func_enter(void *fn, void *call_site) 43 46 { 44 TPRINTF("Trying to lock rwlock for writing....\n");47 const char *fn_sym = symtab_fmt_name_lookup((uintptr_t) fn); 45 48 46 rwlock_write_lock(&rwlock);47 rwlock_write_unlock(&rwlock);49 const char *call_site_sym; 50 uintptr_t call_site_off; 48 51 49 TPRINTF("Trying to lock rwlock for reading....\n"); 50 51 rwlock_read_lock(&rwlock); 52 rwlock_read_unlock(&rwlock); 52 if (symtab_name_lookup((uintptr_t) call_site, &call_site_sym, 53 &call_site_off) == EOK) 54 printf("%s()+%p->%s()\n", call_site_sym, 55 (void *) call_site_off, fn_sym); 56 else 57 printf("->%s()\n", fn_sym); 53 58 } 54 59 55 char *test_rwlock2(void)60 void __cyg_profile_func_exit(void *fn, void *call_site) 56 61 { 57 thread_t *thrd;62 const char *fn_sym = symtab_fmt_name_lookup((uintptr_t) fn); 58 63 59 rwlock_initialize(&rwlock); 64 const char *call_site_sym; 65 uintptr_t call_site_off; 60 66 61 rwlock_read_lock(&rwlock); 62 rwlock_read_lock(&rwlock); 63 rwlock_read_lock(&rwlock); 64 rwlock_read_lock(&rwlock); 65 66 thrd = thread_create(writer, NULL, TASK, 0, "writer", false); 67 if (thrd) 68 thread_ready(thrd); 67 if (symtab_name_lookup((uintptr_t) call_site, &call_site_sym, 68 &call_site_off) == EOK) 69 printf("%s()+%p<-%s()\n", call_site_sym, 70 (void *) call_site_off, fn_sym); 69 71 else 70 return "Could not create thread"; 71 72 thread_sleep(1); 73 74 rwlock_read_unlock(&rwlock); 75 rwlock_read_unlock(&rwlock); 76 rwlock_read_unlock(&rwlock); 77 rwlock_read_unlock(&rwlock); 78 79 thread_join(thrd); 80 thread_detach(thrd); 81 82 return NULL; 72 printf("<-%s()\n", fn_sym); 83 73 } 74 75 #endif /* CONFIG_TRACE */ 76 77 /** @} 78 */ -
kernel/generic/src/debug/stacktrace.c
rfb150d78 r46c20c8 27 27 */ 28 28 29 /** @addtogroup genericdebug 29 /** @addtogroup genericdebug 30 30 * @{ 31 31 */ … … 35 35 #include <stacktrace.h> 36 36 #include <interrupt.h> 37 #include < arch/types.h>37 #include <typedefs.h> 38 38 #include <symtab.h> 39 #include <print.h> 39 40 40 41 #define STACK_FRAMES_MAX 20 41 42 42 void 43 stack_trace_fp_pc(stack_trace_ops_t *ops, uintptr_t fp, uintptr_t pc) 43 void stack_trace_ctx(stack_trace_ops_t *ops, stack_trace_context_t *ctx) 44 44 { 45 45 int cnt = 0; 46 c har *symbol;46 const char *symbol; 47 47 uintptr_t offset; 48 49 while (cnt++ < STACK_FRAMES_MAX && ops->frame_pointer_validate(fp)) { 48 uintptr_t fp; 49 uintptr_t pc; 50 51 while (cnt++ < STACK_FRAMES_MAX && 52 ops->stack_trace_context_validate(ctx)) { 50 53 if (ops->symbol_resolve && 51 ops->symbol_resolve(pc, &symbol, &offset)) { 52 if (offset) 53 printf("%p: %s+%p()\n", fp, symbol, offset); 54 ops->symbol_resolve(ctx->pc, &symbol, &offset)) { 55 if (offset) 56 printf("%p: %s()+%p\n", (void *) ctx->fp, 57 symbol, (void *) offset); 54 58 else 55 printf("%p: %s()\n", fp, symbol);56 } else {57 printf("%p: %p()\n", fp,pc);58 }59 if (!ops->return_address_get( fp, &pc))59 printf("%p: %s()\n", (void *) ctx->fp, symbol); 60 } else 61 printf("%p: %p()\n", (void *) ctx->fp, (void *) ctx->pc); 62 63 if (!ops->return_address_get(ctx, &pc)) 60 64 break; 61 if (!ops->frame_pointer_prev(fp, &fp)) 65 66 if (!ops->frame_pointer_prev(ctx, &fp)) 62 67 break; 68 69 ctx->fp = fp; 70 ctx->pc = pc; 63 71 } 64 72 } … … 66 74 void stack_trace(void) 67 75 { 68 stack_trace_fp_pc(&kst_ops, frame_pointer_get(), program_counter_get()); 76 stack_trace_context_t ctx = { 77 .fp = frame_pointer_get(), 78 .pc = program_counter_get(), 79 .istate = NULL 80 }; 81 82 stack_trace_ctx(&kst_ops, &ctx); 69 83 70 84 /* … … 77 91 void stack_trace_istate(istate_t *istate) 78 92 { 93 stack_trace_context_t ctx = { 94 .fp = istate_get_fp(istate), 95 .pc = istate_get_pc(istate), 96 .istate = istate 97 }; 98 79 99 if (istate_from_uspace(istate)) 80 stack_trace_fp_pc(&ust_ops, istate_get_fp(istate), 81 istate_get_pc(istate)); 100 stack_trace_ctx(&ust_ops, &ctx); 82 101 else 83 stack_trace_fp_pc(&kst_ops, istate_get_fp(istate), 84 istate_get_pc(istate)); 102 stack_trace_ctx(&kst_ops, &ctx); 85 103 } 86 104 87 static bool kernel_symbol_resolve(uintptr_t addr, char **sp, uintptr_t *op) 105 static bool 106 kernel_symbol_resolve(uintptr_t addr, const char **sp, uintptr_t *op) 88 107 { 89 108 return (symtab_name_lookup(addr, sp, op) == 0); … … 91 110 92 111 stack_trace_ops_t kst_ops = { 93 . frame_pointer_validate = kernel_frame_pointer_validate,112 .stack_trace_context_validate = kernel_stack_trace_context_validate, 94 113 .frame_pointer_prev = kernel_frame_pointer_prev, 95 114 .return_address_get = kernel_return_address_get, … … 98 117 99 118 stack_trace_ops_t ust_ops = { 100 . frame_pointer_validate = uspace_frame_pointer_validate,119 .stack_trace_context_validate = uspace_stack_trace_context_validate, 101 120 .frame_pointer_prev = uspace_frame_pointer_prev, 102 121 .return_address_get = uspace_return_address_get, -
kernel/generic/src/debug/symtab.c
rfb150d78 r46c20c8 38 38 #include <symtab.h> 39 39 #include <byteorder.h> 40 #include <str ing.h>40 #include <str.h> 41 41 #include <print.h> 42 #include < arch/types.h>42 #include <typedefs.h> 43 43 #include <typedefs.h> 44 44 #include <errno.h> … … 46 46 /** Get name of a symbol that seems most likely to correspond to address. 47 47 * 48 * @param addr Address.49 * @param name Place to store pointer to the symbol name.50 * @param offset Place to store offset from the symbol address.48 * @param addr Address. 49 * @param name Place to store pointer to the symbol name. 50 * @param offset Place to store offset from the symbol address. 51 51 * 52 52 * @return Zero on success or negative error code, ENOENT if not found, … … 54 54 * 55 55 */ 56 int symtab_name_lookup(uintptr_t addr, c har **name, uintptr_t *offset)56 int symtab_name_lookup(uintptr_t addr, const char **name, uintptr_t *offset) 57 57 { 58 58 #ifdef CONFIG_SYMTAB … … 83 83 /** Lookup symbol by address and format for display. 84 84 * 85 * Returns name of closest corresponding symbol, "Not found" if none exists 86 * or "N/A" if no symbol information is available. 85 * Returns name of closest corresponding symbol, 86 * "unknown" if none exists and "N/A" if no symbol 87 * information is available. 87 88 * 88 89 * @param addr Address. … … 92 93 * 93 94 */ 94 c har *symtab_fmt_name_lookup(uintptr_t addr)95 { 96 c har *name;95 const char *symtab_fmt_name_lookup(uintptr_t addr) 96 { 97 const char *name; 97 98 int rc = symtab_name_lookup(addr, &name, NULL); 98 99 … … 101 102 return name; 102 103 case ENOENT: 103 return " Not found";104 return "unknown"; 104 105 default: 105 106 return "N/A"; … … 191 192 uintptr_t addr = uint64_t_le2host(symbol_table[pos].address_le); 192 193 char *realname = symbol_table[pos].symbol_name; 193 printf("%p: %s\n", addr, realname);194 printf("%p: %s\n", (void *) addr, realname); 194 195 pos++; 195 196 } … … 239 240 printf("\n"); 240 241 pos = 0; 241 while ( (hint = symtab_search_one(name, &pos))) {242 while (symtab_search_one(name, &pos)) { 242 243 printf("%s\n", symbol_table[pos].symbol_name); 243 244 pos++;
Note:
See TracChangeset
for help on using the changeset viewer.
