Add configuration to control resolution of inlined calls

This commit is contained in:
Jeremy 2024-02-04 11:03:03 -06:00
parent 589d87063a
commit d7aac52f8b
No known key found for this signature in database
GPG Key ID: 19AA8270105E8EB4
5 changed files with 37 additions and 14 deletions

View File

@ -245,14 +245,6 @@ namespace cpptrace {
`cpptrace::demangle` provides a helper function for name demangling, since it has to implement that helper internally
anyways.
The library makes an attempt to fail silently and continue during trace generation if any errors are encountered.
`cpptrace::absorb_trace_exceptions` can be used to configure whether these exceptions are absorbed silently internally
or wether they're rethrown to the caller.
`cpptrace::experimental::set_cache_mode` can be used to control time-memory tradeoffs within the library. By default
speed is prioritized. If using this function, set the cache mode at the very start of your program before any traces are
performed.
`cpptrace::isatty` and the fileno definitions are useful for deciding whether to use color when printing stack taces.
`cpptrace::register_terminate_handler()` is a helper function to set a custom `std::terminate` handler that prints a
@ -261,7 +253,6 @@ stack trace from a cpptrace exception (more info below) and otherwise behaves li
```cpp
namespace cpptrace {
std::string demangle(const std::string& name);
void absorb_trace_exceptions(bool absorb);
bool isatty(int fd);
extern const int stdin_fileno;
@ -269,6 +260,25 @@ namespace cpptrace {
extern const int stdout_fileno;
void register_terminate_handler();
}
```
### Configuration
`cpptrace::absorb_trace_exceptions`: Configure whether the library silently absorbs internal exceptions and continues.
Default is true.
`cpptrace::enable_inlined_call_resolution`: Configure whether the library will attempt to resolve inlined call
information for release builds. Default is true.
`cpptrace::experimental::set_cache_mode`: Control time-memory tradeoffs within the library. By default speed is
prioritized. If using this function, set the cache mode at the very start of your program before any traces are
performed.
```cpp
namespace cpptrace {
void absorb_trace_exceptions(bool absorb);
void enable_inlined_call_resolution(bool enable);
enum class cache_mode {
// Only minimal lookup tables

View File

@ -248,6 +248,7 @@ namespace cpptrace {
// configuration:
CPPTRACE_EXPORT void absorb_trace_exceptions(bool absorb);
CPPTRACE_EXPORT void enable_inlined_call_resolution(bool enable);
enum class cache_mode {
// Only minimal lookup tables

View File

@ -411,25 +411,34 @@ namespace cpptrace {
namespace detail {
std::atomic_bool absorb_trace_exceptions(true); // NOSONAR
std::atomic_bool resolve_inlined_calls(true); // NOSONAR
std::atomic<enum cache_mode> cache_mode(cache_mode::prioritize_speed); // NOSONAR
}
void absorb_trace_exceptions(bool absorb) {
void absorb_trace_exceptions(bool absorb) {
detail::absorb_trace_exceptions = absorb;
}
void enable_inlined_call_resolution(bool enable) {
detail::resolve_inlined_calls = enable;
}
namespace experimental {
void set_cache_mode(cache_mode mode) {
void set_cache_mode(cache_mode mode) {
detail::cache_mode = mode;
}
}
namespace detail {
bool should_absorb_trace_exceptions() {
bool should_absorb_trace_exceptions() {
return absorb_trace_exceptions;
}
enum cache_mode get_cache_mode() {
bool should_resolve_inlined_calls() {
return resolve_inlined_calls;
}
enum cache_mode get_cache_mode() {
return cache_mode;
}

View File

@ -406,7 +406,9 @@ namespace libdwarf {
) {
ASSERT(die.get_tag() == DW_TAG_subprogram);
const auto name = subprogram_symbol(die, dwversion);
get_inlines_info(cu_die, die, pc, dwversion, inlines);
if(detail::should_resolve_inlined_calls()) {
get_inlines_info(cu_die, die, pc, dwversion, inlines);
}
return name;
}

View File

@ -58,6 +58,7 @@ namespace detail {
static const stacktrace_frame null_frame {0, nullable<uint32_t>::null(), nullable<uint32_t>::null(), "", "", false};
bool should_absorb_trace_exceptions();
bool should_resolve_inlined_calls();
enum cache_mode get_cache_mode();
}
}