Замена dump_stack () в freertos - PullRequest
       53

Замена dump_stack () в freertos

0 голосов
/ 19 апреля 2019

У меня FreeRTOS, запущенный на процессоре ARM, и у меня нет функции dump_stack () ... Я пытаюсь проверить цепочку вызовов и ужасно отсутствует dump_stack () ... Я немного погуглил и нашел что-то близкое к тому, что я искал, используя утилиту GCC (/ GDB) _Unwind_Backtrace (), но он только печатает адрес stack_frame. Он не обеспечивает отображение значимого символа (например, имен функций). Любая помощь очень ценится.

#include <stdio.h>
#include <unwind.h>
#include <stdint.h>


static _Unwind_Reason_Code unwind_backtrace_callback(struct     _Unwind_Context* context, void* arg)
{

    uintptr_t pc = _Unwind_GetIP(context);
    if (pc) {
        printf("unwind got pc ...0x%x\n", pc);
    }

    return _URC_NO_REASON;
}

ssize_t unwind_backtrace()
{
    _Unwind_Reason_Code rc = _Unwind_Backtrace(unwind_backtrace_callback, 0);
    return rc == _URC_END_OF_STACK ? 0 : -1;
}

void func_1()
{
    int ret = unwind_backtrace();
    printf("unwind_backtrace return ...%d\n", ret);
}

void func_2()
{
   func_1();
}


int main()
{
    func_2();
    return 0;
}

Result:
unwind got pc ...0x40076b
unwind got pc ...0x400796
unwind got pc ...0x4007bd
unwind got pc ...0x400819
unwind got pc ...0x67314b15
unwind got pc ...0x400649
unwind_backtrace return ...0

Ответы [ 2 ]

0 голосов
/ 20 апреля 2019

Это не обеспечивает отображение значимого символа

«Стандартный» способ выполнить это отображение - использовать addr2line . Что-то вроде:

addr2line -fe a.out 0x40076b 0x400796 0x4007bd ...

Обновление:

Хочу на лету конвертировать ...

Ну, вы должны были спросить , что тогда.

Это простой вопрос написания кода. Вам нужно написать код, который будет сопоставлять диапазоны адресов с именами символов (как это делает addr2line).

На платформе ELF это на самом деле довольно просто: прочитайте Elf32_Sym s из раздела .symtab, чтобы построить карту адресов к символам, и найдите свои адреса на этой карте. Вам также необходимо прочитать соответствующий символ names из секции .strtab (Elf32_Sym.st_name - смещение в .strtab).

0 голосов
/ 19 апреля 2019

Все IDE, которые я использую (и я использую много), показывают мне трассировку стека в окне - но только для выполняемой в данный момент задачи.Если я хочу увидеть трассировку для всех задач, мне нужен полностью поддерживающий потоки плагин FreeRTOS того типа, который предоставляется Segger, IAR и Code Confidence.

...