C ++回溯不打印函数,因此文件

时间:2018-10-31 20:05:27

标签: c++ crash backtrace

我有多个项目。每个项目都创建自己的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文件和函数名称吗?

谢谢。

2 个答案:

答案 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

现在可以使用了:)