Es sieht aus wie in einer der letzten C++-Boost-Version erschien Bibliothek, um genau das, was Sie wollen, wahrscheinlich der Code wäre Multiplattform sein. Es ist boost::stacktrace , die Sie wie folgt verwenden können wie bei der Boost-Probe :
#include <filesystem>
#include <sstream>
#include <fstream>
#include <signal.h> // ::signal, ::raise
#include <boost/stacktrace.hpp>
const char* backtraceFileName = "./backtraceFile.dump";
void signalHandler(int)
{
::signal(SIGSEGV, SIG_DFL);
::signal(SIGABRT, SIG_DFL);
boost::stacktrace::safe_dump_to(backtraceFileName);
::raise(SIGABRT);
}
void sendReport()
{
if (std::filesystem::exists(backtraceFileName))
{
std::ifstream file(backtraceFileName);
auto st = boost::stacktrace::stacktrace::from_dump(file);
std::ostringstream backtraceStream;
backtraceStream << st << std::endl;
// sending the code from st
file.close();
std::filesystem::remove(backtraceFileName);
}
}
int main()
{
::signal(SIGSEGV, signalHandler);
::signal(SIGABRT, signalHandler);
sendReport();
// ... rest of code
}
Unter Linux kompilieren Sie den obigen Code:
g++ --std=c++17 file.cpp -lstdc++fs -lboost_stacktrace_backtrace -ldl -lbacktrace
Beispiel Backtrace kopiert von Boost-Dokumentation :
0# bar(int) at /path/to/source/file.cpp:70
1# bar(int) at /path/to/source/file.cpp:70
2# bar(int) at /path/to/source/file.cpp:70
3# bar(int) at /path/to/source/file.cpp:70
4# main at /path/to/main.cpp:93
5# __libc_start_main in /lib/x86_64-linux-gnu/libc.so.6
6# _start
4 Stimmen
Backtrace und backtrace_symbols_fd sind nicht async-signal-safe. Sie sollten diese Funktionen nicht in Signalhandlern verwenden
13 Stimmen
Backtrace_symbols ruft malloc auf und darf daher nicht in einem Signalhandler verwendet werden. Die beiden anderen Funktionen (backtrace und backtrace_symbols_fd) haben dieses Problem nicht und werden üblicherweise in Signalhandlern verwendet.
3 Stimmen
@cmccabe das ist falsch backtrace_symbols_fd ruft normalerweise nicht malloc auf, aber es kann sein, dass etwas in seinem catch_error-Block schief geht
7 Stimmen
Es "kann" in dem Sinne, dass es keine POSIX-Spezifikation für backtrace_symbols_fd (oder irgendeinen Backtrace) gibt; allerdings ist GNU/Linux's backtrace_symbols_fd so spezifiziert, dass es niemals malloc aufruft, wie in linux.die.net/man/3/backtrace_symbols_fd . Daher kann man davon ausgehen, dass es unter Linux niemals malloc aufrufen wird.
0 Stimmen
Wie kommt es zum Absturz?
0 Stimmen
Ich bin mir nicht sicher, ob unbehandelte Ausnahmen als "Programmabsturz" gelten, aber die Methode zum Ausdrucken eines Stacktrace, wenn Ausnahmen ausgelöst werden, beschreibt in dieser Antwort könnte auch für Sie interessant sein.
1 Stimmen
Gibt es im Jahr 2021 eine bessere Lösung für dieses Problem? Ich möchte nur einen Stack-Trace wie in Java oder Python ausgeben.