From a2e30189eea714878f2e0c308eb9888bd21a2823 Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Thu, 1 Feb 2024 13:05:49 +0000 Subject: [PATCH] Backport #59444 to 24.1: Fix stacktraces for binaries without debug symbols --- docker/test/fasttest/run.sh | 11 +++++++++++ src/Common/StackTrace.cpp | 19 +++++++++++-------- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/docker/test/fasttest/run.sh b/docker/test/fasttest/run.sh index 5af050344151..d78c52f1fe69 100755 --- a/docker/test/fasttest/run.sh +++ b/docker/test/fasttest/run.sh @@ -211,6 +211,17 @@ function build echo "build_clickhouse_fasttest_binary: [ OK ] $BUILD_SECONDS_ELAPSED sec." \ | ts '%Y-%m-%d %H:%M:%S' \ | tee "$FASTTEST_OUTPUT/test_result.txt" + + ( + # This query should fail, and print stacktrace with proper symbol names (even on a stripped binary) + clickhouse_output=$(programs/clickhouse-stripped --stacktrace -q 'select' 2>&1 || :) + if [[ $clickhouse_output =~ DB::LocalServer::main ]]; then + echo "stripped_clickhouse_shows_symbols_names: [ OK ] 0 sec." + else + echo -e "stripped_clickhouse_shows_symbols_names: [ FAIL ] 0 sec. - clickhouse output:\n\n$clickhouse_output\n" + fi + ) | ts '%Y-%m-%d %H:%M:%S' | tee -a "$FASTTEST_OUTPUT/test_result.txt" + if [ "$COPY_CLICKHOUSE_BINARY_TO_OUTPUT" -eq "1" ]; then mkdir -p "$FASTTEST_OUTPUT/binaries/" cp programs/clickhouse "$FASTTEST_OUTPUT/binaries/clickhouse" diff --git a/src/Common/StackTrace.cpp b/src/Common/StackTrace.cpp index 4e5c9bd7893d..8431630b16cf 100644 --- a/src/Common/StackTrace.cpp +++ b/src/Common/StackTrace.cpp @@ -317,16 +317,19 @@ constexpr std::pair replacements[] // Demangle @c symbol_name if it's not from __functional header (as such functions don't provide any useful // information but pollute stack traces). // Replace parts from @c replacements with shorter aliases -String demangleAndCollapseNames(std::string_view file, const char * const symbol_name) +String demangleAndCollapseNames(std::optional file, const char * const symbol_name) { if (!symbol_name) return "?"; - std::string_view file_copy = file; - if (auto trim_pos = file.find_last_of('/'); trim_pos != file.npos) - file_copy.remove_suffix(file.size() - trim_pos); - if (file_copy.ends_with("functional")) - return "?"; + if (file.has_value()) + { + std::string_view file_copy = file.value(); + if (auto trim_pos = file_copy.find_last_of('/'); trim_pos != file_copy.npos) + file_copy.remove_suffix(file_copy.size() - trim_pos); + if (file_copy.ends_with("functional")) + return "?"; + } String haystack = demangle(symbol_name); @@ -393,8 +396,8 @@ toStringEveryLineImpl([[maybe_unused]] bool fatal, const StackTraceRefTriple & s if (frame.file.has_value() && frame.line.has_value()) out << *frame.file << ':' << *frame.line << ": "; - if (frame.symbol.has_value() && frame.file.has_value()) - out << demangleAndCollapseNames(*frame.file, frame.symbol->data()); + if (frame.symbol.has_value()) + out << demangleAndCollapseNames(frame.file, frame.symbol->data()); else out << "?";