У меня похожая проблема, и хотя мне нравится переносимость, мне нужна только поддержка gcc. В gcc доступны файлы execinfo.h и backtrace . Чтобы разобрать имена функций, у мистера Бингмана есть хороший кусок кода. Чтобы вывести обратную трассировку для исключения, я создаю исключение, которое печатает обратную трассировку в конструкторе. Если бы я ожидал, что это сработает с исключением, сгенерированным в библиотеке, может потребоваться перестройка / компоновка, чтобы использовалось исключение обратного отслеживания.
/******************************************
#Makefile with flags for printing backtrace with function names
# compile with symbols for backtrace
CXXFLAGS=-g
# add symbols to dynamic symbol table for backtrace
LDFLAGS=-rdynamic
turducken: turducken.cc
******************************************/
#include <cstdio>
#include <stdexcept>
#include <execinfo.h>
#include "stacktrace.h" /* https://panthema.net/2008/0901-stacktrace-demangled/ */
// simple exception that prints backtrace when constructed
class btoverflow_error: public std::overflow_error
{
public:
btoverflow_error( const std::string& arg ) :
std::overflow_error( arg )
{
print_stacktrace();
};
};
void chicken(void)
{
throw btoverflow_error( "too big" );
}
void duck(void)
{
chicken();
}
void turkey(void)
{
duck();
}
int main( int argc, char *argv[])
{
try
{
turkey();
}
catch( btoverflow_error e)
{
printf( "caught exception: %s\n", e.what() );
}
}
Компиляция и запуск этого с помощью gcc 4.8.4 дает обратную трассировку с хорошо раскрученными именами функций C ++:
stack trace:
./turducken : btoverflow_error::btoverflow_error(std::string const&)+0x43
./turducken : chicken()+0x48
./turducken : duck()+0x9
./turducken : turkey()+0x9
./turducken : main()+0x15
/lib/x86_64-linux-gnu/libc.so.6 : __libc_start_main()+0xf5
./turducken() [0x401629]