From 54ed2cfcc583e57b366078b5952793f9e6db0c8f Mon Sep 17 00:00:00 2001 From: Gregory LEOCADIE Date: Sat, 7 Sep 2024 01:46:01 +0200 Subject: [PATCH] Fix example --- examples/ffi/crashinfo.cpp | 30 ++++++++++++++++++++---------- examples/ffi/crashtracking.c | 1 - 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/examples/ffi/crashinfo.cpp b/examples/ffi/crashinfo.cpp index 0e1a316ed..d5f34aefd 100644 --- a/examples/ffi/crashinfo.cpp +++ b/examples/ffi/crashinfo.cpp @@ -15,7 +15,8 @@ extern "C" { #include static ddog_CharSlice to_slice_c_char(const char *s) { return {.ptr = s, .len = strlen(s)}; } -static ddog_CharSlice to_slice_string(std::string &s) { +static ddog_CharSlice to_slice_c_char(const char *s, std::size_t size) { return {.ptr = s, .len = size}; } +static ddog_CharSlice to_slice_string(std::string const &s) { return {.ptr = s.data(), .len = s.length()}; } @@ -39,19 +40,28 @@ void check_result(ddog_crasht_Result result, const char *msg) { void add_stacktrace(std::unique_ptr &crashinfo) { // Collect things into vectors so they stay alive till the function exits - std::vector filenames; - std::vector function_names; - for (uintptr_t i = 0; i < 20; ++i) { - filenames.push_back("/path/to/code/file_" + std::to_string(i)); - function_names.push_back("func_" + std::to_string(i)); + constexpr std::size_t nb_elements = 20; + std::vector> functions_and_filenames{nb_elements}; + for (uintptr_t i = 0; i < nb_elements; ++i) { + functions_and_filenames.push_back({"func_" + std::to_string(i), "/path/to/code/file_" + std::to_string(i)}); } - std::vector names; - for (uintptr_t i = 0; i < 20; ++i) { + std::vector names{nb_elements}; + for (auto i = 0; i < nb_elements; i++) { + auto const& [function_name, filename] = functions_and_filenames[i]; + + auto function_name_slice = to_slice_string(function_name); + auto res = ddog_crasht_demangle(function_name_slice, DDOG_CRASHT_DEMANGLE_OPTIONS_COMPLETE); + if (res.tag == DDOG_CRASHT_STRING_WRAPPER_RESULT_OK) + { + auto string_result = res.ok.message; + function_name_slice = to_slice_c_char((const char*)string_result.ptr, string_result.len); + } + names.push_back({.colno = ddog_Option_U32_some(i), - .filename = to_slice_string(filenames[i]), + .filename = to_slice_string(filename), .lineno = ddog_Option_U32_some(2 * i + 3), - .name = to_slice_string(function_names[i])}); + .name = function_name_slice}); } std::vector trace; diff --git a/examples/ffi/crashtracking.c b/examples/ffi/crashtracking.c index fcb5ad1b8..6b7dd90b4 100644 --- a/examples/ffi/crashtracking.c +++ b/examples/ffi/crashtracking.c @@ -75,7 +75,6 @@ int main(int argc, char **argv) { handle_uintptr_t_result(ddog_crasht_insert_span_id(0, 42)); handle_uintptr_t_result(ddog_crasht_insert_trace_id(1, 1)); - ddog_crasht_demangle(DDOG_CHARSLICE_C("nopp"), DDOG_CRASHT_DEMANGLE_OPTIONS_COMPLETE); #ifdef EXPLICIT_RAISE_SEGV // Test raising SEGV explicitly, to ensure chaining works // properly in this case