Changeset 8751cf3 in mainline


Ignore:
Timestamp:
2018-06-19T20:04:17Z (7 years ago)
Author:
Jiří Zárevúcky <jiri.zarevucky@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
826a0a97
Parents:
3bd1d7d4
git-author:
Jiří Zárevúcky <jiri.zarevucky@…> (2018-06-04 20:01:22)
git-committer:
Jiří Zárevúcky <jiri.zarevucky@…> (2018-06-19 20:04:17)
Message:

Print stacktrace on KIO before attempting printf().

Location:
uspace/lib/c
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/assert.c

    r3bd1d7d4 r8751cf3  
    4949            cond, file, line);
    5050
     51        stacktrace_kio_print();
     52
    5153        /* Sometimes we know in advance that regular printf() would likely fail. */
    5254        abort();
     
    6062        kio_printf("Assertion failed (%s) in file \"%s\", line %u.\n",
    6163            cond, file, line);
     64
     65        stacktrace_kio_print();
    6266
    6367        /*
  • uspace/lib/c/generic/stacktrace.c

    r3bd1d7d4 r8751cf3  
    3939#include <stdint.h>
    4040#include <errno.h>
     41#include <io/kio.h>
    4142
    4243static errno_t stacktrace_read_uintptr(void *arg, uintptr_t addr, uintptr_t *data);
    4344
    4445static stacktrace_ops_t basic_ops = {
    45         .read_uintptr = stacktrace_read_uintptr
     46        .read_uintptr = stacktrace_read_uintptr,
     47        .printf = printf,
     48};
     49
     50static stacktrace_ops_t kio_ops = {
     51        .read_uintptr = stacktrace_read_uintptr,
     52        .printf = kio_printf,
    4653};
    4754
     
    5764
    5865        while (stacktrace_fp_valid(&st, fp)) {
    59                 printf("%p: %p()\n", (void *) fp, (void *) pc);
     66                ops->printf("%p: %p()\n", (void *) fp, (void *) pc);
    6067                rc =  stacktrace_ra_get(&st, fp, &pc);
    6168                if (rc != EOK)
     
    7178{
    7279        stacktrace_print_generic(&basic_ops, NULL, fp, pc);
     80}
     81
     82void stacktrace_kio_print(void)
     83{
     84        stacktrace_prepare();
     85        stacktrace_print_generic(&kio_ops, NULL, stacktrace_fp_get(), stacktrace_pc_get());
     86
     87        /*
     88         * Prevent the tail call optimization of the previous call by
     89         * making it a non-tail call.
     90         */
     91
     92        kio_printf("-- end of stack trace --\n");
    7393}
    7494
  • uspace/lib/c/include/stacktrace.h

    r3bd1d7d4 r8751cf3  
    4343typedef struct {
    4444        errno_t (*read_uintptr)(void *, uintptr_t, uintptr_t *);
     45        int (*printf)(const char *, ...);
    4546} stacktrace_ops_t;
    4647
     
    5152
    5253extern void stacktrace_print(void);
     54extern void stacktrace_kio_print(void);
    5355extern void stacktrace_print_fp_pc(uintptr_t, uintptr_t);
    5456extern void stacktrace_print_generic(stacktrace_ops_t *, void *, uintptr_t,
Note: See TracChangeset for help on using the changeset viewer.