119 lines
3.2 KiB
Bash
119 lines
3.2 KiB
Bash
|
|
#!/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."
|