Нет простых портативных способов сделать это в C++
, о которых я знаю.Есть несколько достаточно сложных способов получить полную трассировку стека с помощью вызовов, специфичных для операционной системы.
Самый простой способ, которым я использую для получения источника исключения, - это использование MACROS.
Макросы не рекомендуются там, гдеих можно избежать, но это одно из немногих мест, где они оказываются полезными.
Я склонен использовать что-то немного более сложное, чем это, но это его основы:
#ifndef NDBUG
#define throw_runtime_error(msg) \
throw std::runtime_error(std::string(msg) \
+ " line: " + std::to_string(__LINE__) \
+ " file: " + std::string(__FILE__))
#else
#define throw_runtime_error(msg) throw std::runtime_error(msg)
#endif
void doSomething2(){
throw_runtime_error("My runtime error.");
}
void doSomething1(){
doSomething2();
}
int main()
{
try
{
doSomething1();
}
catch(std::exception const& e)
{
std::cerr << e.what() << '\n';
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
Выне получить полный след, но вы можете увидеть, где было выброшено исключение.MACRO включает информацию об отладке, только если NDBUG
не установлен, потому что release builds должен установить этот макрос для отключения отладочной информации.