我有多个项目。每个项目都创建自己的so文件。 由于某种原因,backtrace无法打印功能,因此崩溃时会文件。
我用-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);
}
(此函数将由在主函数上定义的signal(SIGSEGV,PrintCallStackOnError)调用。)
有人可以帮忙在backtrace上打印so文件和函数名称吗?
谢谢。
答案 0 :(得分:1)
在启用调试符号的情况下编译程序(和库)。 -g
或-ggdb
。您将获得更多有用的回溯信息-是的,即使对于发行版,也是如此。您的二进制文件将更大,但是您的运行时性能不会受到影响。
也请研究addr2line
工具。
答案 1 :(得分:0)
好的,我发现了问题所在。 因为我使用的是make文件,所以我还应该在链接器中添加-g -rdynamic。像这样:
all: main.o
g++ -Wall -g -rdynamic -o prog main.o
main.o: main.cpp
g++ -Wall -g -c -rdynamic main.cpp
现在可以使用了:)