我在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
如何获取有关线路/功能名称的信息?