From 12a6d8095b1276607b50dfb063f1a96e2ac07def Mon Sep 17 00:00:00 2001 From: Matt Hargett Date: Wed, 16 Sep 2026 15:27:22 -0700 Subject: [PATCH] CI (Linux): symbolize sanitizer reports The sanitizer runtimes look for an unversioned llvm-symbolizer; the runner image has none, so every frame of an ASan/UBSan/TSan report is a bare address and a red job is undiagnosable. Install llvm and point the runtimes at /usr/bin/llvm-symbolizer explicitly (UBSan also prints a stack with print_stacktrace=1). --- .github/workflows/build-linux.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-linux.yml b/.github/workflows/build-linux.yml index 3357bf59..5ada12e0 100644 --- a/.github/workflows/build-linux.yml +++ b/.github/workflows/build-linux.yml @@ -37,7 +37,9 @@ jobs: - name: Install packages run: | sudo apt-get update - sudo apt-get install -y libjavascriptcoregtk-4.1-dev libcurl4-openssl-dev ninja-build clang + # llvm provides the unversioned llvm-symbolizer the sanitizer runtimes look for; without + # it every frame in an ASan/TSan report is a bare address. + sudo apt-get install -y libjavascriptcoregtk-4.1-dev libcurl4-openssl-dev ninja-build clang llvm - name: Configure CMake run: | @@ -56,7 +58,9 @@ jobs: working-directory: Build/ubuntu/Tests/UnitTests run: ./UnitTests env: - TSAN_OPTIONS: ${{ inputs.enable-thread-sanitizer && format('suppressions={0}/.github/tsan_suppressions.txt', github.workspace) || '' }} + TSAN_OPTIONS: ${{ inputs.enable-thread-sanitizer && format('suppressions={0}/.github/tsan_suppressions.txt:external_symbolizer_path=/usr/bin/llvm-symbolizer', github.workspace) || '' }} + ASAN_OPTIONS: ${{ inputs.enable-sanitizers && 'external_symbolizer_path=/usr/bin/llvm-symbolizer' || '' }} + UBSAN_OPTIONS: ${{ inputs.enable-sanitizers && 'print_stacktrace=1:external_symbolizer_path=/usr/bin/llvm-symbolizer' || '' }} # JSC's concurrent GC on Linux uses SIGUSR1 + sem_wait to suspend mutator # threads at safepoints. TSan's signal interception delays SIGUSR1 delivery # indefinitely, deadlocking the Collector Thread's sem_wait. Disabling the