#!/bin/bash # 180秒クラッシュ診断スクリプト # 目的: 複数回テストを実行し、クラッシュ直前のログパターンを抽出 set -e WORKDIR="/mnt/workdisk/public_share/hakmem" LOGDIR="/tmp/hakmem_diagnostic" mkdir -p "$LOGDIR" echo "=== Hakmem 180s Crash Diagnosis ===" echo "Log directory: $LOGDIR" echo "" # テスト設定 NUM_RUNS=3 TIMEOUT_SEC=190 # 環境設定(既知の診断ログのみ有効化) export LD_PRELOAD="$WORKDIR/libhakmem.so" export LD_LIBRARY_PATH="$WORKDIR" # デバッグ出力抑制 unset HAKMEM_TINY_SLL_NEXTCLS unset HAKMEM_TINY_SLL_NEXTTAG unset HAKMEM_TINY_SLL_HEADCLS unset HAKMEM_DEBUG_COUNTER unset HAK_DEBUG_LOG_FREQ echo "Running $NUM_RUNS iterations of 180-second test..." echo "" for i in $(seq 1 $NUM_RUNS); do echo "--- Run $i/$NUM_RUNS ---" LOGFILE="$LOGDIR/run_${i}.log" START_TIME=$(date +%s) # タイムアウト付きでテスト実行 if timeout $TIMEOUT_SEC env \ LD_PRELOAD="$LD_PRELOAD" \ LD_LIBRARY_PATH="$LD_LIBRARY_PATH" \ "$WORKDIR/mimalloc-bench/out/bench/sh8bench" > "$LOGFILE" 2>&1; then EXIT_CODE=$? RESULT="PASS" else EXIT_CODE=$? RESULT="FAIL" fi END_TIME=$(date +%s) ELAPSED=$((END_TIME - START_TIME)) echo " Result: $RESULT (exit code: $EXIT_CODE, elapsed: ${ELAPSED}s)" echo " Log: $LOGFILE" # クラッシュ/エラーのキーワードを検索 if grep -q "SIGSEGV\|Segmentation\|ERROR\|FATAL" "$LOGFILE" 2>/dev/null; then echo " ⚠️ CRASH DETECTED" # ログの最後 50 行を表示 echo " === Last 50 lines of log ===" tail -50 "$LOGFILE" | sed 's/^/ /' else echo " ✓ No crash detected" # テール 10 行を表示 echo " === Last 10 lines ===" tail -10 "$LOGFILE" | sed 's/^/ /' fi echo "" done echo "=== Summary ===" echo "" # 各ログファイルのサイズと最終行 for i in $(seq 1 $NUM_RUNS); do LOGFILE="$LOGDIR/run_${i}.log" SIZE=$(wc -c < "$LOGFILE") LAST=$(tail -1 "$LOGFILE" 2>/dev/null || echo "(empty)") echo "Run $i: $SIZE bytes" echo " Last line: $LAST" done echo "" echo "=== Diagnostic Patterns ===" echo "" # すべてのログを結合して、エラーパターンをマイニング cat "$LOGDIR"/*.log 2>/dev/null | \ grep -E "\[.*\]" | \ sort | uniq -c | sort -rn | head -20 | \ sed 's/^/ /' echo "" echo "=== Crash Analysis ===" echo "" # SIGSEGV が出たかどうか CRASH_COUNT=$(grep -l "SIGSEGV\|Segmentation" "$LOGDIR"/*.log 2>/dev/null | wc -l) if [ "$CRASH_COUNT" -gt 0 ]; then echo "✓ Crashes detected in $CRASH_COUNT/$NUM_RUNS runs" echo "" echo "Last crash log:" LAST_CRASH=$(grep -l "SIGSEGV\|Segmentation" "$LOGDIR"/*.log 2>/dev/null | tail -1) tail -100 "$LAST_CRASH" | sed 's/^/ /' else echo "✗ No crashes detected in any run" echo "" echo "This suggests either:" echo " 1. The 180s crash is NOT reproducible in current build" echo " 2. Crash requires specific conditions/load patterns" echo " 3. Issue may have been fixed" fi echo "" echo "Diagnosis complete. Check $LOGDIR for full logs."