Ignore:
File:
1 edited

Legend:

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

    rbab75df6 r40eab9f  
    3939#include <stdio.h>
    4040
     41#include <debug/line.h>
     42
    4143#define STACK_FRAMES_MAX  20
    4244
     
    4446{
    4547        int cnt = 0;
    46         const char *symbol;
    47         uintptr_t offset;
     48
    4849        uintptr_t fp;
    4950        uintptr_t pc;
     
    5152        while ((cnt++ < STACK_FRAMES_MAX) &&
    5253            (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
    5368                if (ops->symbol_resolve &&
    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);
     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                        }
    6086                } else
    6187                        printf("%p: %p()\n", (void *) ctx->fp, (void *) ctx->pc);
     
    104130
    105131static bool
    106 kernel_symbol_resolve(uintptr_t addr, const char **sp, uintptr_t *op)
     132resolve_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)
    107136{
    108         return (symtab_name_lookup(addr, sp, op) == 0);
     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
     143static bool
     144resolve_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;
    109158}
    110159
     
    113162        .frame_pointer_prev = kernel_frame_pointer_prev,
    114163        .return_address_get = kernel_return_address_get,
    115         .symbol_resolve = kernel_symbol_resolve
     164        .symbol_resolve = resolve_kernel_address,
    116165};
    117166
     
    120169        .frame_pointer_prev = uspace_frame_pointer_prev,
    121170        .return_address_get = uspace_return_address_get,
    122         .symbol_resolve = NULL
     171        .symbol_resolve = resolve_uspace_address,
    123172};
    124173
Note: See TracChangeset for help on using the changeset viewer.