У меня есть небольшая программа на 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
Как получить информацию о названии строки / функции?