C ++ backtrace не печатает функции и файлы - PullRequest
0 голосов
/ 31 октября 2018

У меня есть несколько проектов. каждый проект создает свой собственный файл. По какой-то причине обратная трассировка не печатает функцию и поэтому файл при сбое.

Я скомпилировал с -rdynamic. например: -std = c ++ 14 -pthread -pedantic -rdynamic -fPIC -g -c -fmessage-length = 0 -llibtcmalloc

Это обратный след, который я получаю при сбое программы:

Error: signal 11:
./libs/BaseCppProjectRun[0x402a50]
/lib/x86_64-linux-gnu/libc.so.6(+0x354b0)[0x7fb9aa1db4b0]
./libs/BaseCppProjectRun[0x403013]
./libs/BaseCppProjectRun[0x402b95]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7fb9aa1c6830]
./libs/BaseCppProjectRun[0x402669]

функция возврата:

void PrintCallStackOnError(int sig)
{
    void *array[10];
    size_t size;
    size = backtrace(array, 10);
    fprintf(stderr, "Error: signal %d:\n", sig);
    backtrace_symbols_fd(array, size, STDERR_FILENO);
    exit(1);
}

(эта функция будет вызываться с помощью: сигнала (SIGSEGV, PrintCallStackOnError), определенного в основной функции).

Может кто-нибудь помочь напечатать файл so и имя функции на backtrace, пожалуйста?

спасибо.

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

ОК, я нашел в чем проблема. Поскольку я использую make file, я должен также добавить -g -rdynamic к компоновщику. как это:

all: main.o
    g++ -Wall -g -rdynamic -o prog main.o

main.o: main.cpp 
    g++ -Wall -g -c -rdynamic main.cpp

Сейчас работает:)

0 голосов
/ 31 октября 2018

Скомпилируйте вашу программу (и библиотеки) с включенными символами отладки. -g или -ggdb. И вы получите более полезные трассировки - и да, делайте это даже для релизных сборок. Ваши двоичные файлы будут больше, но это не повлияет на производительность среды выполнения.

Также посмотрите на инструмент addr2line.

...