在freertos中替换dump_stack()

时间:2019-04-19 05:04:03

标签: gdb freertos backtrace

我有在ARM处理器上运行的FreeRTOS,但我没有可用的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 :(得分:0)

我使用的所有IDE(而且我经常使用)都在一个窗口中显示堆栈跟踪-但仅用于当前正在执行的任务。如果要查看所有任务的踪迹,我需要一个由Segger,IAR和Code Confidence提供的完全线程感知的FreeRTOS插件。

答案 1 :(得分:0)

  

它不提供对有意义符号的映射

执行此映射的“标准”方法是使用addr2line。像这样:

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

更新

  

我想即时转换...

好吧,那您本应该要求那个

这是编写代码的简单问题。您需要编写将地址范围映射到符号名称的代码(就像addr2line一样)。

在ELF平台上,这实际上非常简单:从Elf32_Sym部分读取.symtab,以建立符号映射的地址,并在该映射中查找地址。您还需要从.strtab部分中读取相应的符号名称Elf32_Sym.st_name.strtab的偏移量)。