- Stacktrace generation with failed asserts
This commit is contained in:
@@ -16,7 +16,16 @@
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
// =====================================================================================================================
|
||||
|
||||
void __assert_callback(const char*, const char*, int, const char*)
|
||||
{
|
||||
#include <cpptrace/cpptrace.hpp>
|
||||
|
||||
void __assert_callback(const char* expression, const char* file, int line, const char* function, const char* description)
|
||||
{
|
||||
// Skip
|
||||
// __assert_callback
|
||||
// __assert_impl
|
||||
printf("Assert failed: \"%s\" \n"
|
||||
"At %s:%d in %s \n"
|
||||
"Description: %s \n",
|
||||
expression, file, line, function, description);
|
||||
cpptrace::generate_trace(2).print();
|
||||
}
|
||||
@@ -20,13 +20,13 @@
|
||||
|
||||
using assert_handler = void (*)(const char *, const char *, int , const char *);
|
||||
|
||||
extern void __assert_callback(const char* expression, const char* file, int line, const char* function);
|
||||
extern void __assert_callback(const char* expression, const char* file, int line, const char* function, const char* description);
|
||||
|
||||
void __assert_impl(const char* expression, const char* file, int line, const char* function)
|
||||
void __assert_impl(const char* expression, const char* file, int line, const char* function, const char* description)
|
||||
{
|
||||
__assert_callback(expression, file, line, function);
|
||||
__assert_callback(expression, file, line, function, description);
|
||||
|
||||
#ifndef NDEBUG
|
||||
abort();
|
||||
::abort();
|
||||
#endif
|
||||
}
|
||||
@@ -29,10 +29,10 @@
|
||||
#else
|
||||
|
||||
// Allocation functions
|
||||
inline void* operator new (fennec::size_t size) { return malloc(size); }
|
||||
inline void* operator new[](fennec::size_t size) { return malloc(size); }
|
||||
inline void* operator new (fennec::size_t size, const fennec::nothrow_t&) { return malloc(size); }
|
||||
inline void* operator new[](fennec::size_t size, const fennec::nothrow_t&) { return malloc(size); }
|
||||
inline void* operator new (fennec::size_t size) { return ::malloc(size); }
|
||||
inline void* operator new[](fennec::size_t size) { return ::malloc(size); }
|
||||
inline void* operator new (fennec::size_t size, const fennec::nothrow_t&) { return ::malloc(size); }
|
||||
inline void* operator new[](fennec::size_t size, const fennec::nothrow_t&) { return ::malloc(size); }
|
||||
|
||||
// Aligned allocation & deallocation functions
|
||||
#ifdef _WIN32
|
||||
@@ -46,31 +46,31 @@ inline void* operator new[](fennec::size_t size, fennec::align_t align)
|
||||
inline void* operator new (fennec::size_t size, fennec::align_t align, const fennec::nothrow_t&) { return _aligned_malloc(static_cast<size_t>(align), size); }
|
||||
inline void* operator new[](fennec::size_t size, fennec::align_t align, const fennec::nothrow_t&) { return _aligned_malloc(static_cast<size_t>(align), size); }
|
||||
#else
|
||||
inline void operator delete (void* ptr) noexcept { free(ptr); }
|
||||
inline void operator delete[](void* ptr) noexcept { free(ptr); }
|
||||
inline void operator delete (void* ptr, fennec::align_t, const fennec::nothrow_t&) noexcept { free(ptr); }
|
||||
inline void operator delete[](void* ptr, fennec::align_t, const fennec::nothrow_t&) noexcept { free(ptr); }
|
||||
inline void operator delete (void* ptr) noexcept { ::free(ptr); }
|
||||
inline void operator delete[](void* ptr) noexcept { ::free(ptr); }
|
||||
inline void operator delete (void* ptr, fennec::align_t, const fennec::nothrow_t&) noexcept { ::free(ptr); }
|
||||
inline void operator delete[](void* ptr, fennec::align_t, const fennec::nothrow_t&) noexcept { ::free(ptr); }
|
||||
|
||||
inline void* operator new (fennec::size_t size, fennec::align_t align) { return aligned_alloc(static_cast<size_t>(align), size); }
|
||||
inline void* operator new[](fennec::size_t size, fennec::align_t align) { return aligned_alloc(static_cast<size_t>(align), size); }
|
||||
inline void* operator new (fennec::size_t size, fennec::align_t align, const fennec::nothrow_t&) { return aligned_alloc(static_cast<size_t>(align), size); }
|
||||
inline void* operator new[](fennec::size_t size, fennec::align_t align, const fennec::nothrow_t&) { return aligned_alloc(static_cast<size_t>(align), size); }
|
||||
inline void* operator new (fennec::size_t size, fennec::align_t align) { return ::aligned_alloc(static_cast<fennec::size_t>(align), size); }
|
||||
inline void* operator new[](fennec::size_t size, fennec::align_t align) { return ::aligned_alloc(static_cast<fennec::size_t>(align), size); }
|
||||
inline void* operator new (fennec::size_t size, fennec::align_t align, const fennec::nothrow_t&) { return ::aligned_alloc(static_cast<fennec::size_t>(align), size); }
|
||||
inline void* operator new[](fennec::size_t size, fennec::align_t align, const fennec::nothrow_t&) { return ::aligned_alloc(static_cast<fennec::size_t>(align), size); }
|
||||
#endif
|
||||
|
||||
// Aligned deallocation functions
|
||||
inline void operator delete (void* ptr, fennec::align_t) noexcept { free(ptr); }
|
||||
inline void operator delete[](void* ptr, fennec::align_t) noexcept { free(ptr); }
|
||||
inline void operator delete (void* ptr, fennec::align_t) noexcept { ::free(ptr); }
|
||||
inline void operator delete[](void* ptr, fennec::align_t) noexcept { ::free(ptr); }
|
||||
|
||||
// Sized deallocation functions
|
||||
inline void operator delete (void* ptr, fennec::size_t) noexcept { free(ptr); }
|
||||
inline void operator delete[](void* ptr, fennec::size_t) noexcept { free(ptr); }
|
||||
inline void operator delete (void* ptr, fennec::size_t, fennec::align_t) noexcept { free(ptr); }
|
||||
inline void operator delete[](void* ptr, fennec::size_t, fennec::align_t) noexcept { free(ptr); }
|
||||
inline void operator delete (void* ptr, fennec::size_t) noexcept { ::free(ptr); }
|
||||
inline void operator delete[](void* ptr, fennec::size_t) noexcept { ::free(ptr); }
|
||||
inline void operator delete (void* ptr, fennec::size_t, fennec::align_t) noexcept { ::free(ptr); }
|
||||
inline void operator delete[](void* ptr, fennec::size_t, fennec::align_t) noexcept { ::free(ptr); }
|
||||
|
||||
// Non-throwing deallocation functions
|
||||
inline void operator delete (void* ptr, const fennec::nothrow_t&) noexcept { free(ptr); }
|
||||
inline void operator delete[](void* ptr, const fennec::nothrow_t&) noexcept { free(ptr); }
|
||||
inline void operator delete (void* ptr, fennec::size_t, const fennec::nothrow_t&) noexcept { free(ptr); }
|
||||
inline void operator delete[](void* ptr, fennec::size_t, const fennec::nothrow_t&) noexcept { free(ptr); }
|
||||
inline void operator delete (void* ptr, const fennec::nothrow_t&) noexcept { ::free(ptr); }
|
||||
inline void operator delete[](void* ptr, const fennec::nothrow_t&) noexcept { ::free(ptr); }
|
||||
inline void operator delete (void* ptr, fennec::size_t, const fennec::nothrow_t&) noexcept { ::free(ptr); }
|
||||
inline void operator delete[](void* ptr, fennec::size_t, const fennec::nothrow_t&) noexcept { ::free(ptr); }
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user