Merge branch 'main' into dev
This commit is contained in:
commit
d5b2646283
2
.github/workflows/build.yml
vendored
2
.github/workflows/build.yml
vendored
@ -91,7 +91,7 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Enable Developer Command Prompt
|
- name: Enable Developer Command Prompt
|
||||||
uses: ilammy/msvc-dev-cmd@v1.10.0
|
uses: ilammy/msvc-dev-cmd@v1.13.0
|
||||||
- name: dependencies
|
- name: dependencies
|
||||||
run: |
|
run: |
|
||||||
pip3 install colorama
|
pip3 install colorama
|
||||||
|
|||||||
6
.github/workflows/cmake-integration.yml
vendored
6
.github/workflows/cmake-integration.yml
vendored
@ -195,7 +195,7 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Enable Developer Command Prompt
|
- name: Enable Developer Command Prompt
|
||||||
uses: ilammy/msvc-dev-cmd@v1.10.0
|
uses: ilammy/msvc-dev-cmd@v1.13.0
|
||||||
- name: test
|
- name: test
|
||||||
run: |
|
run: |
|
||||||
$tag=$(git rev-parse --abbrev-ref HEAD)
|
$tag=$(git rev-parse --abbrev-ref HEAD)
|
||||||
@ -216,7 +216,7 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Enable Developer Command Prompt
|
- name: Enable Developer Command Prompt
|
||||||
uses: ilammy/msvc-dev-cmd@v1.10.0
|
uses: ilammy/msvc-dev-cmd@v1.13.0
|
||||||
- name: test
|
- name: test
|
||||||
run: |
|
run: |
|
||||||
$tag=$(git rev-parse --abbrev-ref HEAD)
|
$tag=$(git rev-parse --abbrev-ref HEAD)
|
||||||
@ -242,7 +242,7 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Enable Developer Command Prompt
|
- name: Enable Developer Command Prompt
|
||||||
uses: ilammy/msvc-dev-cmd@v1.10.0
|
uses: ilammy/msvc-dev-cmd@v1.13.0
|
||||||
- name: test
|
- name: test
|
||||||
run: |
|
run: |
|
||||||
cd ..
|
cd ..
|
||||||
|
|||||||
2
.github/workflows/performance-tests.yml
vendored
2
.github/workflows/performance-tests.yml
vendored
@ -48,7 +48,7 @@ jobs:
|
|||||||
# steps:
|
# steps:
|
||||||
# - uses: actions/checkout@v4
|
# - uses: actions/checkout@v4
|
||||||
# - name: Enable Developer Command Prompt
|
# - name: Enable Developer Command Prompt
|
||||||
# uses: ilammy/msvc-dev-cmd@v1.10.0
|
# uses: ilammy/msvc-dev-cmd@v1.13.0
|
||||||
# - name: build
|
# - name: build
|
||||||
# run: |
|
# run: |
|
||||||
# mkdir -p build
|
# mkdir -p build
|
||||||
|
|||||||
2
.github/workflows/test.yml
vendored
2
.github/workflows/test.yml
vendored
@ -107,7 +107,7 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Enable Developer Command Prompt
|
- name: Enable Developer Command Prompt
|
||||||
uses: ilammy/msvc-dev-cmd@v1.10.0
|
uses: ilammy/msvc-dev-cmd@v1.13.0
|
||||||
- name: dependencies
|
- name: dependencies
|
||||||
run: |
|
run: |
|
||||||
pip3 install colorama
|
pip3 install colorama
|
||||||
|
|||||||
@ -17,7 +17,7 @@ What's new:
|
|||||||
|
|
||||||
Most notable improvements:
|
Most notable improvements:
|
||||||
- Updated cpptrace exception objects to generate traces at the callsite for improved consistency with trace output. As
|
- Updated cpptrace exception objects to generate traces at the callsite for improved consistency with trace output. As
|
||||||
part fo this cpptrace exception objects have had their constructors updated.
|
part of this cpptrace exception objects have had their constructors updated.
|
||||||
- Improved dwarf back-end robustness
|
- Improved dwarf back-end robustness
|
||||||
- Fallback to the compilation-unit cache or walking compilation-units if aranges lookup fails
|
- Fallback to the compilation-unit cache or walking compilation-units if aranges lookup fails
|
||||||
- Eliminated reliance on a CMake-generated export header
|
- Eliminated reliance on a CMake-generated export header
|
||||||
|
|||||||
@ -279,7 +279,7 @@ target_compile_features(
|
|||||||
PRIVATE cxx_std_11
|
PRIVATE cxx_std_11
|
||||||
)
|
)
|
||||||
|
|
||||||
if(APPLE)
|
if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
|
||||||
SET(CMAKE_C_ARCHIVE_FINISH "<CMAKE_RANLIB> -no_warning_for_no_symbols -c <TARGET>")
|
SET(CMAKE_C_ARCHIVE_FINISH "<CMAKE_RANLIB> -no_warning_for_no_symbols -c <TARGET>")
|
||||||
SET(CMAKE_CXX_ARCHIVE_FINISH "<CMAKE_RANLIB> -no_warning_for_no_symbols -c <TARGET>")
|
SET(CMAKE_CXX_ARCHIVE_FINISH "<CMAKE_RANLIB> -no_warning_for_no_symbols -c <TARGET>")
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
24
README.md
24
README.md
@ -118,7 +118,7 @@ endif()
|
|||||||
Be sure to configure with `-DCMAKE_BUILD_TYPE=Debug` or `-DDCMAKE_BUILD_TYPE=RelWithDebInfo` for symbols and line
|
Be sure to configure with `-DCMAKE_BUILD_TYPE=Debug` or `-DDCMAKE_BUILD_TYPE=RelWithDebInfo` for symbols and line
|
||||||
information.
|
information.
|
||||||
|
|
||||||
On macOS it is recommended to generate a .dSYM file, see [Platform Logistics](#platform-logistics) below.
|
On macOS it is recommended to generate a `.dSYM` file, see [Platform Logistics](#platform-logistics) below.
|
||||||
|
|
||||||
For other ways to use the library, such as through package managers, a system-wide installation, or on a platform
|
For other ways to use the library, such as through package managers, a system-wide installation, or on a platform
|
||||||
without internet access see [Usage](#usage) below.
|
without internet access see [Usage](#usage) below.
|
||||||
@ -250,7 +250,7 @@ namespace cpptrace {
|
|||||||
`cpptrace::demangle` provides a helper function for name demangling, since it has to implement that helper internally
|
`cpptrace::demangle` provides a helper function for name demangling, since it has to implement that helper internally
|
||||||
anyways.
|
anyways.
|
||||||
|
|
||||||
`cpptrace::isatty` and the fileno definitions are useful for deciding whether to use color when printing stack taces.
|
`cpptrace::isatty` and the fileno definitions are useful for deciding whether to use color when printing stack traces.
|
||||||
|
|
||||||
`cpptrace::register_terminate_handler()` is a helper function to set a custom `std::terminate` handler that prints a
|
`cpptrace::register_terminate_handler()` is a helper function to set a custom `std::terminate` handler that prints a
|
||||||
stack trace from a cpptrace exception (more info below) and otherwise behaves like the normal terminate handler.
|
stack trace from a cpptrace exception (more info below) and otherwise behaves like the normal terminate handler.
|
||||||
@ -455,7 +455,7 @@ non-signal-safe functions such as `malloc()`. To avoid this, call these routines
|
|||||||
to "warm up" the library.
|
to "warm up" the library.
|
||||||
|
|
||||||
Because signal-safe tracing is an involved process, I have written up a comprehensive overview of
|
Because signal-safe tracing is an involved process, I have written up a comprehensive overview of
|
||||||
what is involved at [signal-safe-tracing.md](signal-safe-tracing.md).
|
what is involved at [signal-safe-tracing.md](docs/signal-safe-tracing.md).
|
||||||
|
|
||||||
## Utility Types
|
## Utility Types
|
||||||
|
|
||||||
@ -730,9 +730,11 @@ target_link_libraries(main PRIVATE cpptrace::cpptrace)
|
|||||||
|
|
||||||
# Platform Logistics
|
# Platform Logistics
|
||||||
|
|
||||||
Windows and macos require a little extra work to get everything in the right place
|
Windows and macOS require a little extra work to get everything in the right place.
|
||||||
|
|
||||||
Copying the library .dll on windows:
|
## Windows
|
||||||
|
|
||||||
|
Copying the library `.dll` on Windows:
|
||||||
|
|
||||||
```cmake
|
```cmake
|
||||||
# Copy the cpptrace.dll on windows to the same directory as the executable for your_target.
|
# Copy the cpptrace.dll on windows to the same directory as the executable for your_target.
|
||||||
@ -747,18 +749,22 @@ if(WIN32)
|
|||||||
endif()
|
endif()
|
||||||
```
|
```
|
||||||
|
|
||||||
On macOS it's recommended to generate a dSYM file containing debug information for your program:
|
## macOS
|
||||||
|
|
||||||
In xcode cmake this can be done with
|
On macOS, it is recommended to generate a `dSYM` file containing debug information for your program.
|
||||||
|
This is not required as cpptrace makes a good effort at finding and reading the debug information
|
||||||
|
without this, but having a `dSYM` file is the most robust method.
|
||||||
|
|
||||||
|
When using Xcode with CMake, this can be done with:
|
||||||
|
|
||||||
```cmake
|
```cmake
|
||||||
set_target_properties(your_target PROPERTIES XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT "dwarf-with-dsym")
|
set_target_properties(your_target PROPERTIES XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT "dwarf-with-dsym")
|
||||||
```
|
```
|
||||||
|
|
||||||
And outside xcode this can be done with `dsymutil yourbinary`:
|
Outside of Xcode, this can be done with `dsymutil yourbinary`:
|
||||||
|
|
||||||
```cmake
|
```cmake
|
||||||
# Create a .dSYM file on macos. Currently required, but hopefully not for long
|
# Create a .dSYM file on macOS
|
||||||
if(APPLE)
|
if(APPLE)
|
||||||
add_custom_command(
|
add_custom_command(
|
||||||
TARGET your_target
|
TARGET your_target
|
||||||
|
|||||||
@ -6,7 +6,7 @@ We take security seriously and I'm grateful for reports of security vulnerabilit
|
|||||||
|
|
||||||
If the vulnerability can be reported without revealing exploitable specifics, please open an issue.
|
If the vulnerability can be reported without revealing exploitable specifics, please open an issue.
|
||||||
|
|
||||||
If the vulnerability can't be reported publically without leaving an obvious exploit in the public eye please email me
|
If the vulnerability can't be reported publicly without leaving an obvious exploit in the public eye please email me
|
||||||
at jeremy@rifkin.dev or reach out to me on [discord](https://discord.gg/7kv5AuCndG).
|
at jeremy@rifkin.dev or reach out to me on [discord](https://discord.gg/7kv5AuCndG).
|
||||||
|
|
||||||
I will do my best to get back to you within a day.
|
I will do my best to get back to you within a day.
|
||||||
|
|||||||
@ -60,7 +60,7 @@ def run_matrix(matrix, exclude, fn):
|
|||||||
# results[config_tuple] = matrix_config["compiler"] != "g++-10"
|
# results[config_tuple] = matrix_config["compiler"] != "g++-10"
|
||||||
#else:
|
#else:
|
||||||
# results[config_tuple] = not (matrix_config["compiler"] == "clang++-14" and matrix_config["symbols"] == "CPPTRACE_GET_SYMBOLS_WITH_ADDR2LINE")
|
# results[config_tuple] = not (matrix_config["compiler"] == "clang++-14" and matrix_config["symbols"] == "CPPTRACE_GET_SYMBOLS_WITH_ADDR2LINE")
|
||||||
# I had an idea for printing 2d slices of the n-dimentional matrix, but it didn't pan out as much as I'd hoped
|
# I had an idea for printing 2d slices of the n-dimensional matrix, but it didn't pan out as much as I'd hoped
|
||||||
dimensions = len(values)
|
dimensions = len(values)
|
||||||
# # Output diagnostic tables
|
# # Output diagnostic tables
|
||||||
# print("Results:", results)
|
# print("Results:", results)
|
||||||
|
|||||||
@ -138,7 +138,7 @@ void do_signal_safe_trace(cpptrace::frame_ptr* buffer, std::size_t size) {
|
|||||||
pipe_t input_pipe;
|
pipe_t input_pipe;
|
||||||
pipe(input_pipe.data);
|
pipe(input_pipe.data);
|
||||||
const pid_t pid = fork();
|
const pid_t pid = fork();
|
||||||
if(pid == -1) { return; /* Some error ocurred */ }
|
if(pid == -1) { return; /* Some error occurred */ }
|
||||||
if(pid == 0) { // child
|
if(pid == 0) { // child
|
||||||
dup2(input_pipe.read_end, STDIN_FILENO);
|
dup2(input_pipe.read_end, STDIN_FILENO);
|
||||||
close(input_pipe.read_end);
|
close(input_pipe.read_end);
|
||||||
@ -160,7 +160,7 @@ void do_signal_safe_trace(cpptrace::frame_ptr* buffer, std::size_t size) {
|
|||||||
|
|
||||||
void handler(int signo, siginfo_t* info, void* context) {
|
void handler(int signo, siginfo_t* info, void* context) {
|
||||||
// Print basic message
|
// Print basic message
|
||||||
const char* message = "SIGSEGV ocurred:\n";
|
const char* message = "SIGSEGV occurred:\n";
|
||||||
write(STDERR_FILENO, message, strlen(message));
|
write(STDERR_FILENO, message, strlen(message));
|
||||||
// Generate trace
|
// Generate trace
|
||||||
constexpr std::size_t N = 100;
|
constexpr std::size_t N = 100;
|
||||||
|
|||||||
@ -293,7 +293,7 @@ namespace cpptrace {
|
|||||||
// Interface for a traced exception object
|
// Interface for a traced exception object
|
||||||
class CPPTRACE_EXPORT exception : public std::exception {
|
class CPPTRACE_EXPORT exception : public std::exception {
|
||||||
public:
|
public:
|
||||||
virtual const char* what() const noexcept = 0;
|
const char* what() const noexcept override = 0;
|
||||||
virtual const char* message() const noexcept = 0;
|
virtual const char* message() const noexcept = 0;
|
||||||
virtual const stacktrace& trace() const noexcept = 0;
|
virtual const stacktrace& trace() const noexcept = 0;
|
||||||
};
|
};
|
||||||
@ -413,7 +413,7 @@ namespace cpptrace {
|
|||||||
mutable std::string message_value;
|
mutable std::string message_value;
|
||||||
public:
|
public:
|
||||||
explicit nested_exception(
|
explicit nested_exception(
|
||||||
std::exception_ptr exception_ptr,
|
const std::exception_ptr& exception_ptr,
|
||||||
raw_trace&& trace = detail::get_raw_trace_and_absorb()
|
raw_trace&& trace = detail::get_raw_trace_and_absorb()
|
||||||
) noexcept
|
) noexcept
|
||||||
: lazy_exception(std::move(trace)), ptr(exception_ptr) {}
|
: lazy_exception(std::move(trace)), ptr(exception_ptr) {}
|
||||||
|
|||||||
@ -372,7 +372,7 @@ namespace detail {
|
|||||||
// produce information similar to dsymutil -dump-debug-map
|
// produce information similar to dsymutil -dump-debug-map
|
||||||
static void print_debug_map(const debug_map& debug_map) {
|
static void print_debug_map(const debug_map& debug_map) {
|
||||||
for(const auto& entry : debug_map) {
|
for(const auto& entry : debug_map) {
|
||||||
std::cout<<entry.first<<": "<<std::endl;
|
std::cout<<entry.first<<": "<< '\n';
|
||||||
for(const auto& symbol : entry.second) {
|
for(const auto& symbol : entry.second) {
|
||||||
std::cerr
|
std::cerr
|
||||||
<< " "
|
<< " "
|
||||||
@ -383,7 +383,7 @@ namespace detail {
|
|||||||
<< " "
|
<< " "
|
||||||
<< symbol.size
|
<< symbol.size
|
||||||
<< std::dec
|
<< std::dec
|
||||||
<< std::endl;
|
<< '\n';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -174,10 +174,10 @@ namespace cpptrace {
|
|||||||
) {
|
) {
|
||||||
detail::enable_virtual_terminal_processing_if_needed();
|
detail::enable_virtual_terminal_processing_if_needed();
|
||||||
}
|
}
|
||||||
stream<<(header ? header : "Stack trace (most recent call first):")<<std::endl;
|
stream<<(header ? header : "Stack trace (most recent call first):") << '\n';
|
||||||
std::size_t counter = 0;
|
std::size_t counter = 0;
|
||||||
if(frames.empty()) {
|
if(frames.empty()) {
|
||||||
stream<<"<empty trace>"<<std::endl;
|
stream<<"<empty trace>" << '\n';
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const auto reset = color ? ESC "0m" : "";
|
const auto reset = color ? ESC "0m" : "";
|
||||||
@ -237,7 +237,7 @@ namespace cpptrace {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(newline_at_end || &frame != &frames.back()) {
|
if(newline_at_end || &frame != &frames.back()) {
|
||||||
stream << std::endl;
|
stream << '\n';
|
||||||
}
|
}
|
||||||
counter++;
|
counter++;
|
||||||
}
|
}
|
||||||
@ -455,7 +455,7 @@ namespace cpptrace {
|
|||||||
// TODO: Append to message somehow
|
// TODO: Append to message somehow
|
||||||
std::fprintf(
|
std::fprintf(
|
||||||
stderr,
|
stderr,
|
||||||
"Cpptrace: Exception ocurred while resolving trace in cpptrace::exception object:\n%s\n",
|
"Cpptrace: Exception occurred while resolving trace in cpptrace::exception object:\n%s\n",
|
||||||
e.what()
|
e.what()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -520,7 +520,7 @@ namespace cpptrace {
|
|||||||
// TODO: Append to message somehow?
|
// TODO: Append to message somehow?
|
||||||
std::fprintf(
|
std::fprintf(
|
||||||
stderr,
|
stderr,
|
||||||
"Exception ocurred while resolving trace in cpptrace::exception object:\n%s\n",
|
"Exception occurred while resolving trace in cpptrace::exception object:\n%s\n",
|
||||||
e.what()
|
e.what()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -188,7 +188,7 @@ namespace libdwarf {
|
|||||||
}
|
}
|
||||||
|
|
||||||
CPPTRACE_FORCE_NO_INLINE_FOR_PROFILING
|
CPPTRACE_FORCE_NO_INLINE_FOR_PROFILING
|
||||||
~dwarf_resolver() {
|
~dwarf_resolver() override {
|
||||||
// TODO: Maybe redundant since dwarf_finish(dbg); will clean up the line stuff anyway but may as well just
|
// TODO: Maybe redundant since dwarf_finish(dbg); will clean up the line stuff anyway but may as well just
|
||||||
// for thoroughness
|
// for thoroughness
|
||||||
for(auto& entry : line_tables) {
|
for(auto& entry : line_tables) {
|
||||||
@ -959,7 +959,7 @@ namespace libdwarf {
|
|||||||
optional<std::unordered_map<std::string, uint64_t>> symbols;
|
optional<std::unordered_map<std::string, uint64_t>> symbols;
|
||||||
std::unique_ptr<symbol_resolver> resolver;
|
std::unique_ptr<symbol_resolver> resolver;
|
||||||
|
|
||||||
target_object(std::string object_path) : object_path(object_path) {}
|
target_object(std::string object_path) : object_path(std::move(object_path)) {}
|
||||||
|
|
||||||
std::unique_ptr<symbol_resolver>& get_resolver() {
|
std::unique_ptr<symbol_resolver>& get_resolver() {
|
||||||
if(!resolver) {
|
if(!resolver) {
|
||||||
@ -1034,7 +1034,7 @@ namespace libdwarf {
|
|||||||
// get symbol entries from debug map, as well as the various object files used to make this binary
|
// get symbol entries from debug map, as well as the various object files used to make this binary
|
||||||
for(auto& entry : source_debug_map) {
|
for(auto& entry : source_debug_map) {
|
||||||
// object it came from
|
// object it came from
|
||||||
target_objects.push_back({std::move(entry.first)});
|
target_objects.push_back({entry.first});
|
||||||
// push the symbols
|
// push the symbols
|
||||||
auto& map_entry_symbols = entry.second;
|
auto& map_entry_symbols = entry.second;
|
||||||
symbols.reserve(symbols.size() + map_entry_symbols.size());
|
symbols.reserve(symbols.size() + map_entry_symbols.size());
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
// libstdc++ and libc++
|
// libstdc++ and libc++
|
||||||
#if CPPTRACE_HAS_CXX_EXCEPTION_TYPE && defined(__GLIBCXX__) || defined(__GLIBCPP__) || defined(_LIBCPP_VERSION)
|
#if defined(CPPTRACE_HAS_CXX_EXCEPTION_TYPE) && defined(__GLIBCXX__) || defined(__GLIBCPP__) || defined(_LIBCPP_VERSION)
|
||||||
#include <cxxabi.h>
|
#include <cxxabi.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -13,7 +13,7 @@
|
|||||||
namespace cpptrace {
|
namespace cpptrace {
|
||||||
namespace detail {
|
namespace detail {
|
||||||
inline std::string exception_type_name() {
|
inline std::string exception_type_name() {
|
||||||
#if CPPTRACE_HAS_CXX_EXCEPTION_TYPE && defined(__GLIBCXX__) || defined(__GLIBCPP__) || defined(_LIBCPP_VERSION)
|
#if defined(CPPTRACE_HAS_CXX_EXCEPTION_TYPE) && defined(__GLIBCXX__) || defined(__GLIBCPP__) || defined(_LIBCPP_VERSION)
|
||||||
const std::type_info* t = abi::__cxa_current_exception_type();
|
const std::type_info* t = abi::__cxa_current_exception_type();
|
||||||
return t ? detail::demangle(t->name()) : "<unknown>";
|
return t ? detail::demangle(t->name()) : "<unknown>";
|
||||||
#else
|
#else
|
||||||
|
|||||||
@ -280,7 +280,7 @@ namespace detail {
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
void swap(optional& other) {
|
void swap(optional& other) noexcept {
|
||||||
if(holds_value && other.holds_value) {
|
if(holds_value && other.holds_value) {
|
||||||
std::swap(uvalue, other.uvalue);
|
std::swap(uvalue, other.uvalue);
|
||||||
} else if(holds_value && !other.holds_value) {
|
} else if(holds_value && !other.holds_value) {
|
||||||
@ -409,7 +409,7 @@ namespace detail {
|
|||||||
optional<D> deleter;
|
optional<D> deleter;
|
||||||
public:
|
public:
|
||||||
raii_wrapper(T obj, D deleter) : obj(obj), deleter(deleter) {}
|
raii_wrapper(T obj, D deleter) : obj(obj), deleter(deleter) {}
|
||||||
raii_wrapper(raii_wrapper&& other) noexcept : obj(std::move(other.obj)), deleter(other.deleter) {
|
raii_wrapper(raii_wrapper&& other) noexcept : obj(std::move(other.obj)), deleter(std::move(other.deleter)) {
|
||||||
other.deleter = nullopt;
|
other.deleter = nullopt;
|
||||||
}
|
}
|
||||||
raii_wrapper(const raii_wrapper&) = delete;
|
raii_wrapper(const raii_wrapper&) = delete;
|
||||||
|
|||||||
@ -35,7 +35,7 @@ struct pipe_t {
|
|||||||
static_assert(sizeof(pipe_t) == 2 * sizeof(int), "Unexpected struct packing");
|
static_assert(sizeof(pipe_t) == 2 * sizeof(int), "Unexpected struct packing");
|
||||||
|
|
||||||
void handler(int signo, siginfo_t* info, void* context) {
|
void handler(int signo, siginfo_t* info, void* context) {
|
||||||
const char* message = "SIGSEGV ocurred:\n";
|
const char* message = "SIGSEGV occurred:\n";
|
||||||
write(STDERR_FILENO, message, strlen(message));
|
write(STDERR_FILENO, message, strlen(message));
|
||||||
cpptrace::frame_ptr buffer[100];
|
cpptrace::frame_ptr buffer[100];
|
||||||
std::size_t count = cpptrace::safe_generate_raw_trace(buffer, 100);
|
std::size_t count = cpptrace::safe_generate_raw_trace(buffer, 100);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user