Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/debug/stacktrace.c

    r40eab9f rbab75df6  
    3939#include <stdio.h>
    4040
    41 #include <debug/line.h>
    42 
    4341#define STACK_FRAMES_MAX  20
    4442
     
    4644{
    4745        int cnt = 0;
    48 
     46        const char *symbol;
     47        uintptr_t offset;
    4948        uintptr_t fp;
    5049        uintptr_t pc;
     
    5251        while ((cnt++ < STACK_FRAMES_MAX) &&
    5352            (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 the
    64                  * position of the call instruction, not the return address.
    65                  */
    66                 pc = cnt == 1 ? ctx->pc : ctx->pc - 1;
    67 
    6853                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);
    8660                } else
    8761                        printf("%p: %p()\n", (void *) ctx->fp, (void *) ctx->pc);
     
    130104
    131105static 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)
     106kernel_symbol_resolve(uintptr_t addr, const char **sp, uintptr_t *op)
    136107{
    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);
    158109}
    159110
     
    162113        .frame_pointer_prev = kernel_frame_pointer_prev,
    163114        .return_address_get = kernel_return_address_get,
    164         .symbol_resolve = resolve_kernel_address,
     115        .symbol_resolve = kernel_symbol_resolve
    165116};
    166117
     
    169120        .frame_pointer_prev = uspace_frame_pointer_prev,
    170121        .return_address_get = uspace_return_address_get,
    171         .symbol_resolve = resolve_uspace_address,
     122        .symbol_resolve = NULL
    172123};
    173124
Note: See TracChangeset for help on using the changeset viewer.