Hej mam taki problem
Uzywam boost::stacktrace na minGw 4.8.2 i Qt 5.3.1
Napisałem mały przykład ktory poprawnie generuje stacktrace funkcje sie wyswietlają. Tu jest mój post w którym opisałem jak to uruchomiłem.
#include <QCoreApplication>
#include <signal.h>
#include <cstdlib>
#include <iostream>
#define BOOST_STACKTRACE_USE_BACKTRACE
#include "boost/stacktrace.hpp"
void func2()
{
boost::stacktrace::stacktrace st;
std::cout << "Crashed:\n" << st << std::endl;
}
void func1()
{
func2();
}
void my_signal_handler(int signum)
{
::signal(signum, SIG_DFL);
func1();
}
void crash()
{
throw std::runtime_error("test");
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
::signal(SIGSEGV, &my_signal_handler);
::signal(SIGABRT, &my_signal_handler);
crash();
return a.exec();
}
Tu mamy wynik działania:
//terminate called after throwing an instance of 'std::runtime_error'
// what(): test
//Crashed:
// 0# boost::basic_stacktrace<std::allocatorboost::stacktrace::frame >::init(unsigned int, unsigned int) at ../../boost/boost/stacktrace/stacktrace.hpp:75
// 1# func2() at ../stc_mingw482/main.cpp:16
// 2# func1() at ../stc_mingw482/main.cpp:23
// 3# my_signal_handler(int) at ../stc_mingw482/main.cpp:29
// 4# _imp___set_invalid_parameter_handler in C:\Windows\System32\msvcrt.dll
// 5# _imp___set_invalid_parameter_handler in C:\Windows\System32\msvcrt.dll
// 6# _imp___set_invalid_parameter_handler in C:\Qt\Qt5.3.1_MGW\5.3\mingw482_32\bin\libstdc++-6.dll
// 7# main at ../stc_mingw482/main.cpp:44
// 8# __tmainCRTStartup in C:\stc_mingw482_qt571\build-stc_mingw482-Desktop_Qt_5_3_MinGW_32bit-Debug\debug\stc_mingw482.exe
// 9# _imp___set_invalid_parameter_handler in C:\Windows\System32\KERNEL32.DLL
//10# _imp___set_invalid_parameter_handler in C:\Windows\SYSTEM32\ntdll.dll
//11# _imp___set_invalid_parameter_handler in C:\Windows\SYSTEM32\ntdll.dll
I tu zaczyna się moje pytanie.
Czy jest możliwe w jakiś sposób złapanie momentu w którym wystąpił problem w aplikacji?
Czyli w funkcji crash() w tym przypadku. Bo ten przykład drukuje stacktrace ale z poziomu wywołania w func2.
A ja chciałbym mieć efekt podobny do tego co by dało gdb które by pokazało gdzie jest problem a nie generowało stacka/dumpa z miejsca wywołania biblioteki.