aboutsummaryrefslogtreecommitdiff
path: root/bpkg/bpkg.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'bpkg/bpkg.cxx')
-rw-r--r--bpkg/bpkg.cxx19
1 files changed, 19 insertions, 0 deletions
diff --git a/bpkg/bpkg.cxx b/bpkg/bpkg.cxx
index 042e4f0..fdcb8bb 100644
--- a/bpkg/bpkg.cxx
+++ b/bpkg/bpkg.cxx
@@ -7,6 +7,9 @@
#endif
#include <iostream>
+#include <exception> // set_terminate(), terminate_handler
+
+#include <libbutl/backtrace.mxx> // backtrace()
#include <bpkg/types.hxx>
#include <bpkg/utility.hxx>
@@ -140,12 +143,28 @@ init (const common_options& co,
return o;
}
+// Print backtrace if terminating due to an unhandled exception. Note that
+// custom_terminate is non-static and not a lambda to reduce the noise.
+//
+static terminate_handler default_terminate;
+
+void
+custom_terminate ()
+{
+ *diag_stream << backtrace ();
+
+ if (default_terminate != nullptr)
+ default_terminate ();
+}
+
int bpkg::
main (int argc, char* argv[])
try
{
using namespace cli;
+ default_terminate = set_terminate (custom_terminate);
+
stderr_term = fdterm (stderr_fd ());
exec_dir = path (argv[0]).directory ();