Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;回溯不';t打印函数和so文件_C++_Crash_Backtrace - Fatal编程技术网

C++ C++;回溯不';t打印函数和so文件

C++ C++;回溯不';t打印函数和so文件,c++,crash,backtrace,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

我有多个项目。每个项目都创建自己的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);
}
(此函数将由主函数上定义的:SIGSEGV、PrintCallStackOnError信号调用)

请有人帮忙打印so文件和回溯上的函数名好吗

谢谢。

在启用调试符号的情况下编译程序(和库)<代码>-g或
-ggdb
。您将获得更多有用的回溯——是的,即使对于发布版本也要这样做。您的二进制文件将更大,但运行时性能不会受到影响


同时查看
addr2line
工具。

好的,我找到了问题所在。 因为我使用的是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

现在它工作了:)

在信号处理程序中调用
backtrace
fprintf
backtrace\u fd
是不安全的。当然,如果你正在处理一个像
SIGSEGV
这样的终端信号,你可能不会在意你的程序在处理程序中“再次”崩溃,但也不能保证你会得到你的跟踪。