Light ctrace refactoring

This commit is contained in:
Jeremy 2024-02-06 23:10:02 -06:00
parent ead847ad70
commit 78dd053f21
No known key found for this signature in database
GPG Key ID: BE03111EB7ED6E2E
3 changed files with 41 additions and 51 deletions

View File

@ -54,37 +54,35 @@
#define CTRACE_FORCE_INLINE inline #define CTRACE_FORCE_INLINE inline
#endif #endif
// See `CPPTRACE_PATH_MAX` for more info. /* See `CPPTRACE_PATH_MAX` for more info. */
#define CTRACE_PATH_MAX 4096 #define CTRACE_PATH_MAX 4096
// TODO: Add exports
CTRACE_BEGIN_DEFINITIONS CTRACE_BEGIN_DEFINITIONS
typedef struct raw_trace ctrace_raw_trace;
typedef struct object_trace ctrace_object_trace;
typedef struct stacktrace ctrace_stacktrace;
// Represents a boolean value, ensures a consistent ABI. typedef struct ctrace_raw_trace ctrace_raw_trace;
typedef struct ctrace_object_trace ctrace_object_trace;
typedef struct ctrace_stacktrace ctrace_stacktrace;
/* Represents a boolean value, ensures a consistent ABI. */
typedef int8_t ctrace_bool; typedef int8_t ctrace_bool;
// A type that can represent a pointer, alias for `uintptr_t`. /* A type that can represent a pointer, alias for `uintptr_t`. */
typedef uintptr_t ctrace_frame_ptr; typedef uintptr_t ctrace_frame_ptr;
typedef struct object_frame ctrace_object_frame; typedef struct ctrace_object_frame ctrace_object_frame;
typedef struct stacktrace_frame ctrace_stacktrace_frame; typedef struct ctrace_stacktrace_frame ctrace_stacktrace_frame;
typedef struct safe_object_frame ctrace_safe_object_frame; typedef struct ctrace_safe_object_frame ctrace_safe_object_frame;
// Type-safe null-terminated string wrapper /* Type-safe null-terminated string wrapper */
typedef struct { typedef struct {
const char* data; const char* data;
} ctrace_owning_string; } ctrace_owning_string;
struct object_frame { struct ctrace_object_frame {
ctrace_frame_ptr raw_address; ctrace_frame_ptr raw_address;
ctrace_frame_ptr obj_address; ctrace_frame_ptr obj_address;
const char* obj_path; const char* obj_path;
// const char* symbol;
}; };
struct stacktrace_frame { struct ctrace_stacktrace_frame {
ctrace_frame_ptr address; ctrace_frame_ptr address;
uint32_t line; uint32_t line;
uint32_t column; uint32_t column;
@ -93,74 +91,71 @@ CTRACE_BEGIN_DEFINITIONS
ctrace_bool is_inline; ctrace_bool is_inline;
}; };
struct safe_object_frame { struct ctrace_safe_object_frame {
ctrace_frame_ptr raw_address; ctrace_frame_ptr raw_address;
ctrace_frame_ptr relative_obj_address; ctrace_frame_ptr relative_obj_address;
char object_path[CTRACE_PATH_MAX + 1]; char object_path[CTRACE_PATH_MAX + 1];
}; };
struct raw_trace { struct ctrace_raw_trace {
ctrace_frame_ptr* frames; ctrace_frame_ptr* frames;
size_t count; size_t count;
}; };
struct object_trace { struct ctrace_object_trace {
ctrace_object_frame* frames; ctrace_object_frame* frames;
size_t count; size_t count;
}; };
struct stacktrace { struct ctrace_stacktrace {
ctrace_stacktrace_frame* frames; ctrace_stacktrace_frame* frames;
size_t count; size_t count;
}; };
typedef enum { /* ctrace::string: */
// Only minimal lookup tables
ctrace_prioritize_memory = 0,
// Build lookup tables but don't keep them around between trace calls
ctrace_hybrid = 1,
// Build lookup tables as needed
ctrace_prioritize_speed = 2
} ctrace_cache_mode;
// ctrace::string:
CPPTRACE_EXPORT ctrace_owning_string ctrace_generate_owning_string(const char* raw_string); CPPTRACE_EXPORT ctrace_owning_string ctrace_generate_owning_string(const char* raw_string);
CPPTRACE_EXPORT void ctrace_free_owning_string(ctrace_owning_string* string); CPPTRACE_EXPORT void ctrace_free_owning_string(ctrace_owning_string* string);
// ctrace::generation: /* ctrace::generation: */
CPPTRACE_EXPORT ctrace_raw_trace ctrace_generate_raw_trace(size_t skip, size_t max_depth); CPPTRACE_EXPORT ctrace_raw_trace ctrace_generate_raw_trace(size_t skip, size_t max_depth);
CPPTRACE_EXPORT ctrace_object_trace ctrace_generate_object_trace(size_t skip, size_t max_depth); CPPTRACE_EXPORT ctrace_object_trace ctrace_generate_object_trace(size_t skip, size_t max_depth);
CPPTRACE_EXPORT ctrace_stacktrace ctrace_generate_trace(size_t skip, size_t max_depth); CPPTRACE_EXPORT ctrace_stacktrace ctrace_generate_trace(size_t skip, size_t max_depth);
// ctrace::freeing: /* ctrace::freeing: */
CPPTRACE_EXPORT void ctrace_free_raw_trace(ctrace_raw_trace* trace); CPPTRACE_EXPORT void ctrace_free_raw_trace(ctrace_raw_trace* trace);
CPPTRACE_EXPORT void ctrace_free_object_trace(ctrace_object_trace* trace); CPPTRACE_EXPORT void ctrace_free_object_trace(ctrace_object_trace* trace);
CPPTRACE_EXPORT void ctrace_free_stacktrace(ctrace_stacktrace* trace); CPPTRACE_EXPORT void ctrace_free_stacktrace(ctrace_stacktrace* trace);
// ctrace::resolve: /* ctrace::resolve: */
CPPTRACE_EXPORT ctrace_stacktrace ctrace_raw_trace_resolve(const ctrace_raw_trace* trace); CPPTRACE_EXPORT ctrace_stacktrace ctrace_resolve_raw_trace(const ctrace_raw_trace* trace);
CPPTRACE_EXPORT ctrace_object_trace ctrace_raw_trace_resolve_object_trace(const ctrace_raw_trace* trace); CPPTRACE_EXPORT ctrace_object_trace ctrace_resolve_raw_trace_to_object_trace(const ctrace_raw_trace* trace);
CPPTRACE_EXPORT ctrace_stacktrace ctrace_object_trace_resolve(const ctrace_object_trace* trace); CPPTRACE_EXPORT ctrace_stacktrace ctrace_resolve_object_trace(const ctrace_object_trace* trace);
// ctrace::safe: /* ctrace::safe: */
CPPTRACE_EXPORT size_t ctrace_safe_generate_raw_trace(ctrace_frame_ptr* buffer, size_t size, size_t skip, size_t max_depth); CPPTRACE_EXPORT size_t ctrace_safe_generate_raw_trace(ctrace_frame_ptr* buffer, size_t size, size_t skip, size_t max_depth);
CPPTRACE_EXPORT void ctrace_get_safe_object_frame(ctrace_frame_ptr address, ctrace_safe_object_frame* out); CPPTRACE_EXPORT void ctrace_get_safe_object_frame(ctrace_frame_ptr address, ctrace_safe_object_frame* out);
// ctrace::io: /* ctrace::io: */
CPPTRACE_EXPORT ctrace_owning_string ctrace_stacktrace_to_string(const ctrace_stacktrace* trace, ctrace_bool use_color); CPPTRACE_EXPORT ctrace_owning_string ctrace_stacktrace_to_string(const ctrace_stacktrace* trace, ctrace_bool use_color);
CPPTRACE_EXPORT void ctrace_stacktrace_print(const ctrace_stacktrace* trace, FILE* to, ctrace_bool use_color); CPPTRACE_EXPORT void ctrace_stacktrace_print(const ctrace_stacktrace* trace, FILE* to, ctrace_bool use_color);
// ctrace::utility: /* ctrace::utility: */
CPPTRACE_EXPORT ctrace_owning_string ctrace_demangle(const char* mangled); CPPTRACE_EXPORT ctrace_owning_string ctrace_demangle(const char* mangled);
CPPTRACE_EXPORT int ctrace_stdin_fileno(void); CPPTRACE_EXPORT int ctrace_stdin_fileno(void);
CPPTRACE_EXPORT int ctrace_stderr_fileno(void); CPPTRACE_EXPORT int ctrace_stderr_fileno(void);
CPPTRACE_EXPORT int ctrace_stdout_fileno(void); CPPTRACE_EXPORT int ctrace_stdout_fileno(void);
CPPTRACE_EXPORT ctrace_bool ctrace_isatty(int fd); CPPTRACE_EXPORT ctrace_bool ctrace_isatty(int fd);
// ctrace::config: /* ctrace::config: */
typedef enum {
/* Only minimal lookup tables */
ctrace_prioritize_memory = 0,
/* Build lookup tables but don't keep them around between trace calls */
ctrace_hybrid = 1,
/* Build lookup tables as needed */
ctrace_prioritize_speed = 2
} ctrace_cache_mode;
CPPTRACE_EXPORT void ctrace_set_cache_mode(ctrace_cache_mode mode); CPPTRACE_EXPORT void ctrace_set_cache_mode(ctrace_cache_mode mode);
CPPTRACE_EXPORT ctrace_cache_mode ctrace_get_cache_mode(void);
CPPTRACE_EXPORT void enable_inlined_call_resolution(ctrace_bool enable); CPPTRACE_EXPORT void enable_inlined_call_resolution(ctrace_bool enable);
CTRACE_END_DEFINITIONS CTRACE_END_DEFINITIONS

View File

@ -244,7 +244,7 @@ extern "C" {
} }
// ctrace::resolve: // ctrace::resolve:
ctrace_stacktrace ctrace_raw_trace_resolve(const ctrace_raw_trace* trace) { ctrace_stacktrace ctrace_resolve_raw_trace(const ctrace_raw_trace* trace) {
if(!trace || !trace->frames) { if(!trace || !trace->frames) {
return { nullptr, 0 }; return { nullptr, 0 };
} }
@ -259,7 +259,7 @@ extern "C" {
} }
} }
ctrace_object_trace ctrace_raw_trace_resolve_object_trace(const ctrace_raw_trace* trace) { ctrace_object_trace ctrace_resolve_raw_trace_to_object_trace(const ctrace_raw_trace* trace) {
if(!trace || !trace->frames) { if(!trace || !trace->frames) {
return { nullptr, 0 }; return { nullptr, 0 };
} }
@ -274,7 +274,7 @@ extern "C" {
} }
} }
ctrace_stacktrace ctrace_object_trace_resolve(const ctrace_object_trace* trace) { ctrace_stacktrace ctrace_resolve_object_trace(const ctrace_object_trace* trace) {
if(!trace || !trace->frames) { if(!trace || !trace->frames) {
return { nullptr, 0 }; return { nullptr, 0 };
} }
@ -420,11 +420,6 @@ extern "C" {
cpptrace::experimental::set_cache_mode(cache_mode); cpptrace::experimental::set_cache_mode(cache_mode);
} }
ctrace_cache_mode ctrace_get_cache_mode(void) {
auto cache_mode = cpptrace::detail::get_cache_mode();
return static_cast<ctrace_cache_mode>(cache_mode);
}
void enable_inlined_call_resolution(ctrace_bool enable) { void enable_inlined_call_resolution(ctrace_bool enable) {
cpptrace::enable_inlined_call_resolution(enable); cpptrace::enable_inlined_call_resolution(enable);
} }

View File

@ -5,8 +5,8 @@
void trace() { void trace() {
ctrace_raw_trace raw_trace = ctrace_generate_raw_trace(1, INT_MAX); ctrace_raw_trace raw_trace = ctrace_generate_raw_trace(1, INT_MAX);
ctrace_object_trace obj_trace = ctrace_raw_trace_resolve_object_trace(&raw_trace); ctrace_object_trace obj_trace = ctrace_resolve_raw_trace_to_object_trace(&raw_trace);
ctrace_stacktrace trace = ctrace_object_trace_resolve(&obj_trace); ctrace_stacktrace trace = ctrace_resolve_object_trace(&obj_trace);
ctrace_stacktrace_print(&trace, stdout, 1); ctrace_stacktrace_print(&trace, stdout, 1);
ctrace_free_stacktrace(&trace); ctrace_free_stacktrace(&trace);
ctrace_free_object_trace(&obj_trace); ctrace_free_object_trace(&obj_trace);