C++ backtrace 不打印函数和 so 文件
C++ backtrace doesn't print functions and so files
我有多个项目。每个项目创建自己的 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);
}
(此函数将由定义在 main 函数上的 signal(SIGSEGV, PrintCallStackOnError) 调用)。
有人可以帮忙打印so文件和backtrace上的函数名吗?
谢谢。
在启用调试符号的情况下编译您的程序(和库)。 -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
现在正常了:)
我有多个项目。每个项目创建自己的 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);
}
(此函数将由定义在 main 函数上的 signal(SIGSEGV, PrintCallStackOnError) 调用)。
有人可以帮忙打印so文件和backtrace上的函数名吗?
谢谢。
在启用调试符号的情况下编译您的程序(和库)。 -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
现在正常了:)