-/* Copyright (c) 2005-2016. The SimGrid Team.
- * All rights reserved. */
+/* Copyright (c) 2005-2018. The SimGrid Team. All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
#include <mutex>
#include <xbt/backtrace.hpp>
+#include <xbt/config.hpp>
+#include <xbt/ex.hpp>
#include <xbt/exception.hpp>
#include <xbt/log.h>
#include <xbt/log.hpp>
-extern "C" {
XBT_LOG_EXTERNAL_CATEGORY(xbt);
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_exception, xbt, "Exceptions");
-}
namespace simgrid {
namespace xbt {
try {
auto name = simgrid::xbt::demangle(typeid(exception).name());
- auto with_context =
- dynamic_cast<const simgrid::xbt::WithContextException*>(&exception);
+ auto* with_context = dynamic_cast<const simgrid::xbt::WithContextException*>(&exception);
if (with_context != nullptr)
XBT_LOG(prio, "%s %s by %s/%d: %s",
context, name.get(),
XBT_LOG(prio, "%s %s: %s", context, name.get(), exception.what());
// Do we have a backtrace?
- if (with_context != nullptr) {
+ if (with_context != nullptr && not xbt_cfg_get_boolean("exception/cutpath")) {
auto backtrace = simgrid::xbt::resolveBacktrace(
with_context->backtrace().data(), with_context->backtrace().size());
for (std::string const& s : backtrace)
}
// Do we have a nested exception?
- auto with_nested = dynamic_cast<const std::nested_exception*>(&exception);
+ auto* with_nested = dynamic_cast<const std::nested_exception*>(&exception);
if (with_nested == nullptr || with_nested->nested_ptr() == nullptr)
return;
try {
static void showBacktrace(std::vector<xbt_backtrace_location_t>& bt)
{
+ if (xbt_cfg_get_boolean("exception/cutpath")) {
+ XBT_LOG(xbt_log_priority_critical, "Display of current backtrace disabled by --cfg=exception/cutpath.");
+ return;
+ }
std::vector<std::string> res = resolveBacktrace(&bt[0], bt.size());
XBT_LOG(xbt_log_priority_critical, "Current backtrace:");
for (std::string const& s : res)
// an uncaught exception
static std::atomic_flag lock = ATOMIC_FLAG_INIT;
if (lock.test_and_set()) {
- XBT_ERROR("Multiple uncaught exceptions");
+ XBT_ERROR("Handling an exception raised an exception. Bailing out.");
std::abort();
}
}
}
-
-void xbt_set_terminate()
-{
- simgrid::xbt::installExceptionHandler();
-}