Changes in kernel/generic/src/debug/stacktrace.c [40eab9f:bab75df6] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/debug/stacktrace.c
r40eab9f rbab75df6 39 39 #include <stdio.h> 40 40 41 #include <debug/line.h>42 43 41 #define STACK_FRAMES_MAX 20 44 42 … … 46 44 { 47 45 int cnt = 0; 48 46 const char *symbol; 47 uintptr_t offset; 49 48 uintptr_t fp; 50 49 uintptr_t pc; … … 52 51 while ((cnt++ < STACK_FRAMES_MAX) && 53 52 (ops->stack_trace_context_validate(ctx))) { 54 55 const char *symbol = NULL;56 uintptr_t symbol_addr = 0;57 const char *file_name = NULL;58 const char *dir_name = NULL;59 int line = 0;60 int column = 0;61 62 /*63 * If this isn't the first frame, move pc back by one byte to read the64 * position of the call instruction, not the return address.65 */66 pc = cnt == 1 ? ctx->pc : ctx->pc - 1;67 68 53 if (ops->symbol_resolve && 69 ops->symbol_resolve(pc, 0, &symbol, &symbol_addr, &file_name, &dir_name, &line, &column)) { 70 71 if (symbol == NULL) 72 symbol = "<unknown>"; 73 74 if (file_name == NULL && line == 0) { 75 printf("%p: %24s()+%zu\n", (void *) ctx->fp, symbol, ctx->pc - symbol_addr); 76 } else { 77 if (file_name == NULL) 78 file_name = "<unknown>"; 79 if (dir_name == NULL) 80 dir_name = "<unknown>"; 81 82 printf("%p: %20s()+%zu\t %s/%s:%d:%d\n", 83 (void *) ctx->fp, symbol, ctx->pc - symbol_addr, 84 dir_name, file_name, line, column); 85 } 54 ops->symbol_resolve(ctx->pc, &symbol, &offset)) { 55 if (offset) 56 printf("%p: %s()+%p\n", (void *) ctx->fp, 57 symbol, (void *) offset); 58 else 59 printf("%p: %s()\n", (void *) ctx->fp, symbol); 86 60 } else 87 61 printf("%p: %p()\n", (void *) ctx->fp, (void *) ctx->pc); … … 130 104 131 105 static bool 132 resolve_kernel_address(uintptr_t addr, int op_index, 133 const char **symbol, uintptr_t *symbol_addr, 134 const char **filename, const char **dirname, 135 int *line, int *column) 106 kernel_symbol_resolve(uintptr_t addr, const char **sp, uintptr_t *op) 136 107 { 137 *symbol_addr = 0; 138 *symbol = symtab_name_lookup(addr, symbol_addr, &kernel_sections); 139 140 return debug_line_get_address_info(&kernel_sections, addr, op_index, filename, dirname, line, column) || *symbol_addr != 0; 141 } 142 143 static bool 144 resolve_uspace_address(uintptr_t addr, int op_index, 145 const char **symbol, uintptr_t *symbol_addr, 146 const char **filename, const char **dirname, 147 int *line, int *column) 148 { 149 if (TASK->debug_sections == NULL) 150 return false; 151 152 debug_sections_t *scs = TASK->debug_sections; 153 154 *symbol_addr = 0; 155 *symbol = symtab_name_lookup(addr, symbol_addr, scs); 156 157 return debug_line_get_address_info(scs, addr, op_index, filename, dirname, line, column) || *symbol_addr != 0; 108 return (symtab_name_lookup(addr, sp, op) == 0); 158 109 } 159 110 … … 162 113 .frame_pointer_prev = kernel_frame_pointer_prev, 163 114 .return_address_get = kernel_return_address_get, 164 .symbol_resolve = resolve_kernel_address,115 .symbol_resolve = kernel_symbol_resolve 165 116 }; 166 117 … … 169 120 .frame_pointer_prev = uspace_frame_pointer_prev, 170 121 .return_address_get = uspace_return_address_get, 171 .symbol_resolve = resolve_uspace_address,122 .symbol_resolve = NULL 172 123 }; 173 124
Note:
See TracChangeset
for help on using the changeset viewer.