backtrace_symbols / backtrace_symbols_fd не работает даже с -rdynamic - PullRequest
0 голосов
/ 03 июля 2019

У меня есть небольшая программа на C, которую я компилирую под Ubuntu с GCC версии 7.4.0 (Ubuntu / Linaro 7.4.0-1ubuntu1 ~ 18.04.1) Я хочу видеть конкретную строку (или имя функции), которая вызвала ошибку сегментации.

Вот мой скрипт компиляции:

rm -rf ./server.bin
gcc -w -c ./*.c witfy/common/list.c witfy/common/data.c witfy/common/aes.c witfy/common/sts_queue.c -fpack-struct=2 -fpermissive -I/usr/include/mysql
gcc -o server.bin ./*.o -L/usr/lib/x86_64-linux-gnu -lmysqlclient -lpthread -lz -lm -lrt -ldl -rdynamic
rm -rf ./*.o

А потом, в коде я использую пример из https://linux.die.net/man/3/backtrace_symbols:

static void handle_signal(int signal) {
    if (signal == SIGSEGV) {
        void *array[100];
        char **strings;
        size_t size = backtrace(array, 100);        
        //backtrace_symbols_fd(array, size, STDERR_FILENO);
        strings = backtrace_symbols(array, size);
        if (strings == NULL) {
            perror("backtrace_symbols");
            exit(EXIT_FAILURE);
        }
        for (int j = 0; j < size; j++) printf("%s\n", strings[j]);
        fflush(stdout);
        exit(1);        
    }    
}


int main(int argc, char** argv) {

    new_action.sa_handler = handle_signal;
    sigemptyset (&new_action.sa_mask);
    new_action.sa_flags = 0;
    sigaction (SIGSEGV, &new_action, NULL); 


    ...


}

И единственное, что я получаю в качестве вывода: [0x11a68b4ac]

Кстати, я обнаружил, что мне может понадобиться addr2line, но он также не предоставляет никакой информации:

addr2line -i -C -f -p -e ./server.bin 0x11a68b4ac
?? ??:0

Как получить информацию о названии строки / функции?

...