Backtrace на sh4-linux возвращает одну функцию - PullRequest
1 голос
/ 25 ноября 2010

Я пытаюсь распечатать стек вызовов из программы.К сожалению, вызов 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

EDIT На самом деле этот код работает нормально.Возможно, какой-то флаг компилятора вызывает такое поведение в реальном проекте.

Флаги компилятора: -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 ]

1 голос
/ 28 ноября 2010

Попробуйте удалить "stackSize = 1;"

1 голос
/ 20 мая 2011

Нужен патч для glibc.Смотрите здесь .

Как отмечалось в патче, пользовательские приложения, использующие backtrace, должны быть скомпилированы с "-fexceptions".Если вам нужно полное разрешение символов в адресах, вам также нужен "-rdynamic".

0 голосов
/ 25 ноября 2010

Компилятор может включать эти функции.Можно попробовать перекомпилировать с опцией -O0.

...