【问题标题】:Replacement of dump_stack() in freertos在 freertos 中替换 dump_stack()
【发布时间】:2019-04-19 05:04:03
【问题描述】:

我在 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

【问题讨论】:

    标签: gdb freertos backtrace


    【解决方案1】:

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

    【讨论】:

    • 嗨,理查德,感谢您的回复。实际上,我有点像使用 Linux-Cscope-Ctags 组合来编写/浏览固件代码并针对 GCC/ARM 链进行交叉编译。现在在设备中加载二进制文件(我没有 JTAG 设备)并想检查一些函数中的调用链。
    【解决方案2】:

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

    执行此映射的“标准”方法是使用addr2line。比如:

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

    更新:

    我想要即时转换...

    那么,你应该要求那个

    编写代码很简单。您需要编写将地址范围映射到符号名称的代码(就像 addr2line 所做的那样)。

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

    【讨论】:

    • 感谢“addr2line”的建议。这是为了离线将 HEX 符号转换为 FUNCTION 名称。我想要即时转换....
    猜你喜欢
    • 1970-01-01
    • 2017-06-13
    • 1970-01-01
    • 2019-09-22
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 2011-07-05
    • 2017-08-11
    相关资源
    最近更新 更多