C++ C++;回溯不';t打印函数和so文件
我有多个项目。每个项目都创建自己的so文件。 由于某些原因,backtrace无法打印函数,因此文件会崩溃 我使用-rdynamic编译。例如: -std=c++14-pthread-pedantic-rdynamic-fPIC-g-c-fmessage length=0-llibtcmalloc 这是我在程序崩溃时得到的回溯: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
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
这样的终端信号,你可能不会在意你的程序在处理程序中“再次”崩溃,但也不能保证你会得到你的跟踪。