Files
TheRock/rocm-systems/.github/workflows/rocprofiler-systems-ubuntu-noble-sanitizers.yml
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

346 lines
15 KiB
YAML

name: rocprofiler-systems CI / Sanitizers
on:
workflow_call:
env:
ROCPROFSYS_CI: ON
ROCPROFSYS_TMPDIR: "%env{PWD}%/testing-tmp"
SANITIZER_EXIT_CODE: 1
jobs:
ubuntu-noble-sanitizers:
name: Sanitizer / ${{ matrix.sanitizer-type }}
runs-on: ubuntu-latest
container:
image: dgaliffiamd/rocprofiler-systems:ci-rocm-7.2-ubuntu-24.04
strategy:
fail-fast: false
matrix:
compiler: ["g++"]
build-dyninst: ["ON"]
sanitizer-type: ["address", "undefined", "thread"]
env:
DEBIAN_FRONTEND: noninteractive
OMPI_ALLOW_RUN_AS_ROOT: 1
OMPI_ALLOW_RUN_AS_ROOT_CONFIRM: 1
# Disable OpenMPI's binary patcher - it conflicts with ASAN's
# mprotect interceptor, causing SIGSEGV in all MPI/UCX tests.
OMPI_MCA_patcher: ""
CCACHE_DIR: ${{ github.workspace }}/.ccache
steps:
- name: Install git
run: |
apt-get update
apt-get install -y --no-install-recommends git ca-certificates
git --version
- uses: actions/checkout@v6
with:
sparse-checkout: |
projects/rocprofiler-systems/
.gitmodules
set-safe-directory: true
submodules: true
- name: Install Packages
timeout-minutes: 25
uses: nick-fields/retry@ad984534de44a9489a53aefd81eb77f87c70dc60 # v4.0.0
with:
retry_wait_seconds: 30
timeout_minutes: 25
max_attempts: 2
command: |
apt-get update &&
apt-get install -y autoconf autotools-dev bash-completion binutils-dev bison \
build-essential bzip2 chrpath cmake curl environment-modules flex gettext \
git-core gnupg2 gzip iproute2 libboost-all-dev libdw-dev libdwarf-dev \
libelf-dev libgmock-dev libgtest-dev libiberty-dev libpapi-dev libpfm4-dev \
libsqlite3-dev libtbb-dev libtool locales lsb-release m4 ninja-build \
nlohmann-json3-dev python3-pip software-properties-common unzip wget \
vim zip zlib1g-dev libucx-dev ucx-utils libomp-dev libopenmpi-dev &&
apt-get autoclean
- name: Restore ccache
uses: actions/cache@v6
with:
path: ${{ github.workspace }}/.ccache
key: ccache-ubuntu-noble-sanitizers-${{ github.job }}-${{ matrix.compiler }}-${{ matrix.sanitizer-type }}-${{ github.sha }}
restore-keys: |
ccache-ubuntu-noble-sanitizers-${{ github.job }}-${{ matrix.compiler }}-${{ matrix.sanitizer-type }}-
- name: Configure ccache
run: |
mkdir -p "${CCACHE_DIR}"
ccache --max-size=1G
ccache --set-config=sloppiness=time_macros,include_file_mtime,include_file_ctime,pch_defines
ccache -z
ccache -p | head -20
- name: Configure git safe directory
run: git config --global --add safe.directory '*'
- name: Initialize Submodules
shell: bash
run: |
git submodule update --init \
projects/rocprofiler-systems/external/dyninst \
projects/rocprofiler-systems/external/timemory
- name: Find Sanitizer Libraries and Configure Sanitizer Environment
shell: bash
working-directory: projects/rocprofiler-systems/
run: |
SUPP_DIR=${PWD}/scripts
SANITIZER_TYPE="${{ matrix.sanitizer-type }}"
# Sanitizer reports go here as <prefix>.<pid> files. Surfaced by the
# "Print Sanitizer Logs" step below.
SANITIZER_LOG_DIR=${PWD}/sanitizer-logs
mkdir -p "${SANITIZER_LOG_DIR}"
echo "SANITIZER_LOG_DIR=${SANITIZER_LOG_DIR}" >> $GITHUB_ENV
# Default test set covers Dyninst rewrite/runtime-instrument families
# plus avail and unit tests.
TEST_REGEX='^(rewrite-caller|code-coverage|trace-time-window|rocprofiler-systems-avail-all|rocprof-sys-unit-tests)'
if [ "${SANITIZER_TYPE}" = "address" ]; then
ASAN_LIB=$(${{ matrix.compiler }} -print-file-name=libasan.so)
ASAN_LIB=$(realpath "${ASAN_LIB}")
echo "ASan library: ${ASAN_LIB}"
ls -la "${ASAN_LIB}"
echo "ASAN_LIBRARY=${ASAN_LIB}" >> $GITHUB_ENV
echo "SANITIZER_CMAKE_FLAGS=-DASAN_LIBRARY=${ASAN_LIB}" >> $GITHUB_ENV
echo "ASAN_OPTIONS=suppressions=${SUPP_DIR}/rocprof-sys-asan.supp:detect_leaks=1:new_delete_type_mismatch=0:detect_odr_violation=0:exitcode=${SANITIZER_EXIT_CODE}:log_path=${SANITIZER_LOG_DIR}/asan" >> $GITHUB_ENV
echo "LSAN_OPTIONS=suppressions=${SUPP_DIR}/rocprof-sys-lsan.supp:print_suppressions=1:exitcode=${SANITIZER_EXIT_CODE}:log_path=${SANITIZER_LOG_DIR}/lsan" >> $GITHUB_ENV
echo "UBSAN_OPTIONS=print_stacktrace=1:halt_on_error=0:exitcode=${SANITIZER_EXIT_CODE}:log_path=${SANITIZER_LOG_DIR}/ubsan" >> $GITHUB_ENV
elif [ "${SANITIZER_TYPE}" = "thread" ]; then
TSAN_LIB=$(${{ matrix.compiler }} -print-file-name=libtsan.so)
TSAN_LIB=$(realpath "${TSAN_LIB}")
echo "TSan library: ${TSAN_LIB}"
ls -la "${TSAN_LIB}"
echo "TSAN_LIBRARY=${TSAN_LIB}" >> $GITHUB_ENV
echo "SANITIZER_CMAKE_FLAGS=-DTSAN_LIBRARY=${TSAN_LIB}" >> $GITHUB_ENV
echo "TSAN_OPTIONS=suppressions=${SUPP_DIR}/rocprof-sys-thread.supp:second_deadlock_stack=1:print_suppressions=1:exitcode=${SANITIZER_EXIT_CODE}:log_path=${SANITIZER_LOG_DIR}/tsan" >> $GITHUB_ENV
# Known TSan issue: logger fork tests (pthread_atfork + fork from
# multi-threaded process) cause the test binary to hang during
# process exit. TSan's exit-time cleanup deadlocks with the
# atfork handlers that reference static locals being destroyed.
echo "GTEST_FILTER=-logger_test*" >> $GITHUB_ENV
# TSan's 5-15x slowdown blows past the per-test 300s timeout for
# the Dyninst rewrite/runtime-instrument families. Restrict the
# TSan job to the lightweight avail + unit-test families.
TEST_REGEX='^(rocprofiler-systems-avail-all|rocprof-sys-unit-tests)'
elif [ "${SANITIZER_TYPE}" = "undefined" ]; then
echo "SANITIZER_CMAKE_FLAGS=" >> $GITHUB_ENV
echo "UBSAN_OPTIONS=suppressions=${SUPP_DIR}/rocprof-sys-ubsan.supp:print_stacktrace=1:halt_on_error=0:exitcode=${SANITIZER_EXIT_CODE}:log_path=${SANITIZER_LOG_DIR}/ubsan" >> $GITHUB_ENV
fi
echo "TEST_REGEX=${TEST_REGEX}" >> $GITHUB_ENV
- name: Generate CI scripts
timeout-minutes: 5
shell: bash
working-directory: projects/rocprofiler-systems/
env:
GIT_DISCOVERY_ACROSS_FILESYSTEM: 1
CMAKE_C_COMPILER_LAUNCHER: ccache
CMAKE_CXX_COMPILER_LAUNCHER: ccache
run: |
git config --global --add safe.directory ${GITHUB_WORKSPACE}
git config --global --add safe.directory ${PWD}
echo "CMake: $(cmake --version | head -n 1)"
echo "Compiler: $(${{ matrix.compiler }} --version | head -n 1)"
echo "Sanitizer type: ${{ matrix.sanitizer-type }}"
echo "Sanitizer CMake flags: ${SANITIZER_CMAKE_FLAGS}"
python3 ./scripts/run-ci.py --stage generate \
--name "${{ github.repository_owner }}-${{ github.ref_name }}-ubuntu-noble-${{ matrix.compiler }}-${{ matrix.sanitizer-type }}-sanitizer" \
--build-jobs $(nproc) \
--site GitHub \
-B build \
-- \
-DCMAKE_C_COMPILER=$(echo '${{ matrix.compiler }}' | sed 's/+/c/g') \
-DCMAKE_CXX_COMPILER=${{ matrix.compiler }} \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DCMAKE_INSTALL_PREFIX=/opt/rocprofiler-systems \
-DROCPROFSYS_BUILD_EXAMPLES=ON \
-DROCPROFSYS_BUILD_TESTING=ON \
-DROCPROFSYS_USE_PYTHON=ON \
-DROCPROFSYS_PYTHON_PREFIX=/opt/conda/envs \
-DROCPROFSYS_PYTHON_ENVS="py3.8;py3.9;py3.10;py3.11;py3.12;py3.13" \
-DROCPROFSYS_USE_MPI=OFF \
-DROCPROFSYS_USE_MPI_HEADERS=OFF \
-DROCPROFSYS_USE_COMPILE_TIMING=OFF \
-DROCPROFSYS_USE_SANITIZER=ON \
-DROCPROFSYS_SANITIZER_TYPE=${{ matrix.sanitizer-type }} \
${SANITIZER_CMAKE_FLAGS} \
-DROCPROFSYS_BUILD_DYNINST=${{ matrix.build-dyninst }} \
-DROCPROFSYS_BUILD_BOOST=OFF \
-DROCPROFSYS_BUILD_TBB=OFF \
-DROCPROFSYS_BUILD_ELFUTILS=OFF \
-DROCPROFSYS_BUILD_LIBIBERTY=OFF \
-DROCPROFSYS_MAX_THREADS=64 \
-DROCPROFSYS_DISABLE_EXAMPLES="transpose;parallel-overhead;user-api;openmp;mpi;python;lulesh;rccl;causal;videodecode;jpegdecode;roctx;thread-limit;transferBench;hpc;shmem;scratch-memory;sdma_test" \
-DROCPROFSYS_BUILD_NUMBER=${{ github.run_attempt }} \
-DCMAKE_PREFIX_PATH=/opt/rocm \
-- \
-R "${TEST_REGEX}"
- name: Configure
timeout-minutes: 15
shell: bash
working-directory: projects/rocprofiler-systems/
env:
GIT_DISCOVERY_ACROSS_FILESYSTEM: 1
CMAKE_C_COMPILER_LAUNCHER: ccache
CMAKE_CXX_COMPILER_LAUNCHER: ccache
run: |
python3 ./scripts/run-ci.py --stage configure \
--name "${{ github.repository_owner }}-${{ github.ref_name }}-ubuntu-noble-${{ matrix.compiler }}-${{ matrix.sanitizer-type }}-sanitizer" \
-B build
- name: Build
timeout-minutes: 120
shell: bash
working-directory: projects/rocprofiler-systems/
env:
CMAKE_C_COMPILER_LAUNCHER: ccache
CMAKE_CXX_COMPILER_LAUNCHER: ccache
run: |
python3 ./scripts/run-ci.py --stage build \
--name "${{ github.repository_owner }}-${{ github.ref_name }}-ubuntu-noble-${{ matrix.compiler }}-${{ matrix.sanitizer-type }}-sanitizer" \
-B build
- name: CDash link
if: always()
shell: bash
run: |
NAME="${{ github.repository_owner }}-${{ github.ref_name }}-ubuntu-noble-${{ matrix.compiler }}-${{ matrix.sanitizer-type }}-sanitizer"
NAME=$(echo "${NAME}" | sed 's/\(.*\)-\([0-9]*\)\/merge/PR_\2_\1/')
URL="https://my.cdash.org/index.php?project=rocprofiler-systems&filtercount=1&showfilters=1&field1=buildname&compare1=65&value1=${NAME}"
printf '### CDash Results\n[View build on CDash](%s)\n' "${URL}" >> "${GITHUB_STEP_SUMMARY}"
echo "::notice title=CDash Results::${URL}"
- name: Test
timeout-minutes: 180
shell: bash
working-directory: projects/rocprofiler-systems/
run: |
python3 ./scripts/run-ci.py --stage test \
--name "${{ github.repository_owner }}-${{ github.ref_name }}-ubuntu-noble-${{ matrix.compiler }}-${{ matrix.sanitizer-type }}-sanitizer" \
--repeat-until-pass 1 \
--repeat-after-timeout 1 \
-B build
- name: ccache stats
if: always()
run: |
echo "=== ccache stats ==="
ccache -s -v || true
echo "=== ccache dir size ==="
du -sh "${CCACHE_DIR}" || true
- name: Print Sanitizer Logs
if: always()
shell: bash
working-directory: projects/rocprofiler-systems/
run: |
if [ -z "${SANITIZER_LOG_DIR}" ] || [ ! -d "${SANITIZER_LOG_DIR}" ]; then
echo "No sanitizer log directory at '${SANITIZER_LOG_DIR}'"
exit 0
fi
shopt -s nullglob
files=("${SANITIZER_LOG_DIR}"/*)
if [ "${#files[@]}" -eq 0 ]; then
echo "No sanitizer log files in ${SANITIZER_LOG_DIR}"
exit 0
fi
# Lines that mean a sanitizer actually fired (vs. a benign
# "Suppressions used:" summary that print_suppressions=1 always emits).
finding_regex='==[0-9]+==ERROR|SUMMARY: (Address|Leak|Undefined|Thread)Sanitizer|WARNING: ThreadSanitizer|runtime error:'
files_with_findings=()
for f in $(printf '%s\n' "${files[@]}" | sort); do
name=$(basename "${f}")
if grep -qE "${finding_regex}" "${f}"; then
files_with_findings+=("${name}")
echo "::group::${name} (FINDINGS)"
cat "${f}"
echo "::endgroup::"
else
# Suppression summaries only — collapse without flagging.
echo "::group::${name} (clean — suppressions only)"
cat "${f}"
echo "::endgroup::"
fi
done
if [ "${#files_with_findings[@]}" -gt 0 ]; then
echo "::error::Sanitizer findings detected in ${#files_with_findings[@]} log file(s): ${files_with_findings[*]}"
exit 1
fi
echo "No sanitizer findings detected (only suppression summaries)."
- name: Check for Leftover Buffered Files
timeout-minutes: 5
working-directory: projects/rocprofiler-systems/
run: |
set -v
if find /tmp -maxdepth 1 -name 'buffered*' -print -quit | grep -q .; then
echo "Error: Found leftover buffered storage files in /tmp:"
ls -lh /tmp/buffered*
exit 1
else
echo "✓ No buffered storage files found in /tmp"
fi
- name: Upload JUnit test results
if: always()
uses: actions/upload-artifact@v7
with:
name: junit-sanitizer-${{ matrix.sanitizer-type }}-${{ github.job }}-${{ strategy.job-index }}
path: projects/rocprofiler-systems/build/test-results.xml
if-no-files-found: ignore
- name: Write sanitizer summary status
if: always()
shell: bash
run: |
mkdir -p sanitizer-summary
printf '{"sanitizer":"%s","status":"%s"}\n' '${{ matrix.sanitizer-type }}' '${{ job.status }}' > sanitizer-summary/${{ matrix.sanitizer-type }}.json
- name: Upload sanitizer summary status
if: always()
uses: actions/upload-artifact@v7
with:
name: sanitizer-summary-${{ matrix.sanitizer-type }}-${{ github.job }}-${{ strategy.job-index }}
path: sanitizer-summary/${{ matrix.sanitizer-type }}.json
if-no-files-found: error
- name: Test Clean Up
timeout-minutes: 10
working-directory: projects/rocprofiler-systems/
run: |
set -v
du /tmp -d 1 -h
du build/rocprof-sys-pytest-output -d 1 -h
df -h
rm -fr /tmp/* build/rocprof-sys-pytest-output/*
- name: CTest Artifacts
if: failure()
continue-on-error: True
uses: actions/upload-artifact@v7
with:
name: ctest-${{ matrix.sanitizer-type }}-${{ github.job }}-${{ strategy.job-index }}-log
path: |
projects/rocprofiler-systems/build/*.log
- name: Data Artifacts
if: failure()
continue-on-error: True
uses: actions/upload-artifact@v7
with:
name: data-${{ matrix.sanitizer-type }}-${{ github.job }}-${{ strategy.job-index }}-files
path: |
projects/rocprofiler-systems/build/rocprofsys-tests-config/*.cfg
projects/rocprofiler-systems/build/rocprofsys-tests-output/**/*.txt
projects/rocprofiler-systems/build/rocprofsys-tests-output/**/*-instr*.json