sh4-linux上的Backtrace返回一个函数

时间:2010-11-25 16:29:44

标签: c++ linux backtrace

我正在尝试从程序中打印调用堆栈。不幸的是,调用glibc backtrace()总是只返回一个记录 - 当前函数的地址。我正在研究sh4-linux,这可能会导致问题。我在x86架构上打印时没有任何问题。

示例代码:

#include <string>
#include <iostream>
#include <execinfo.h>

const int maxCalls = 666;

void baz()
{
        void *buffer[ maxCalls ];
        int stackSize = backtrace( buffer, maxCalls );

        char **symbols = backtrace_symbols( buffer, stackSize );

        std::string str;

        for( unsigned i = 0; i < stackSize; ++i )
        {
                str+= symbols[i];
        }
        free( symbols );
        std::cout << str<< std::endl;
}

void bar()
{
        baz();
}

void foo()
{
        bar();
}

int main(int argc, char **argv)
{
        foo();
        return 0;
}

由以下人员编写:

sh4-linux-g++ test.cpp -g -c -o test.o
sh4-linux-g++ test.o -g -rdynamic -o test

编辑:实际上这段代码运行正常。可能某些编译器标志会在实际项目中导致此行为。

编译器标志为:-g -O0 -pipe -fpermissive -frtti -fno-exceptions -ffunction-sections

链接器标记:-lpthread -g -rdynamic -Wl,-gc-sections -Wl,--start-group {Files here} -Wl,--end-group --verbose -Xlinker -lm

EDIT2 :我发现原因是哪个标志:-fno-exceptions。谁能告诉我为什么?如果它可以修复而不跳过这个标志?

EDIT3 :嗯,没关系。看来我实际上可以省略这个标志。

3 个答案:

答案 0 :(得分:1)

尝试删除“stackSize = 1;”

答案 1 :(得分:1)

需要一个glibc补丁。看here

如补丁中所述,使用backtrace的用户应用程序需要使用“-fexceptions”进行编译。如果你想要地址的完整符号解析,你也需要“-rdynamic”。

答案 2 :(得分:0)

编译器可能正在内联这些函数。可以尝试使用-O0选项重新编译。