Files
hakmem/docs/SEGFAULT_INVESTIGATION_FOR_GEMINI.md
Moe Charm (CI) 2624dcce62 Add comprehensive ChatGPT handoff documentation for TLS SLL diagnosis
Created 9 diagnostic and handoff documents (48KB) to guide ChatGPT through
systematic diagnosis and fix of TLS SLL header corruption issue.

Documents Added:
- README_HANDOFF_CHATGPT.md: Master guide explaining 3-doc system
- CHATGPT_CONTEXT_SUMMARY.md: Quick facts & architecture (2-3 min read)
- CHATGPT_HANDOFF_TLS_DIAGNOSIS.md: 7-step procedure (4-8h timeline)
- GEMINI_HANDOFF_SUMMARY.md: Handoff summary for user review
- STATUS_2025_12_03_CURRENT.md: Complete project status snapshot
- TLS_SLL_HEADER_CORRUPTION_DIAGNOSIS.md: Deep reference (1,150+ lines)
  - 6 root cause patterns with code examples
  - Diagnostic logging instrumentation
  - Fix templates and validation procedures
- TLS_SS_HINT_BOX_DESIGN.md: Phase 1 optimization design (1,148 lines)
- HEADERLESS_STABILITY_DEBUG_INSTRUCTIONS.md: Test environment setup
- SEGFAULT_INVESTIGATION_FOR_GEMINI.md: Original investigation notes

Problem Context:
- Baseline (Headerless OFF) crashes with [TLS_SLL_HDR_RESET]
- Error: cls=1 base=0x... got=0x31 expect=0xa1
- Blocks Phase 1 validation and Phase 2 progression

Expected Outcome:
- ChatGPT follows 7-step diagnostic process
- Root cause identified (one of 6 patterns)
- Surgical fix (1-5 lines)
- TC1 baseline completes without crashes

🤖 Generated with Claude Code (https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 20:41:34 +09:00

273 lines
6.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Segmentation Fault 調査指示書 for Gemini
Version: 1.0 (2025-12-03)
Status: Phase 2 Headerless 実装中に segfault 発生
---
## 🔍 現状
### ビルド状況
-**ビルド成功**: `libhakmem.so` が正常に生成される
- ✅ インクルード順序エラー解決済み
- ⚠️ **実行時エラー**: Segmentation Fault が発生
### Segfault 情報
**報告内容**:
- Phase 2 Headerless 実装中に segfault 発生
- ビルドは通るが実行時にクラッシュ
- 詳細なエラーメッセージは未報告
---
## 🎯 調査目標
1. **Segfault が発生する正確な条件を特定**
2. **どのコンポーネントが原因か判定**
3. **修正パッチを提案**
---
## 📋 調査手順
### Step 1: デバッグビルド& GDB での実行
```bash
cd /mnt/workdisk/public_share/hakmem
# クリーンビルド(デバッグシンボル付き)
find . -name "*.o" -delete
make clean
make shared -j8 EXTRA_CFLAGS="-g -O1"
# GDB で実行
gdb --args ./mimalloc-bench/out/bench/sh8bench
# GDB 内:
(gdb) run
# → Segfault が発生したら:
(gdb) backtrace
(gdb) frame 0
(gdb) info locals
(gdb) disassemble
```
### Step 2: ASanAddressSanitizerでの検証
```bash
# ASan ビルド
make clean
make asan-shared-alloc -j8
# ASan 実行(詳細なエラー情報が出力される)
LD_PRELOAD=./libhakmem_asan.so ./mimalloc-bench/out/bench/sh8bench 2>&1 | head -100
```
**ASan が出力する情報**:
- どのアドレスでクラッシュしたか
- どの関数で発生したか
- メモリ破壊の詳細
### Step 3: 最小限のテストプログラム作成
Segfault が頻繁に発生する場合、最小限のテストプログラムを作成して確認:
```c
// tests/test_segfault_minimal.c
#include <stdio.h>
#include <stdlib.h>
#include "../core/hakmem.h"
int main() {
printf("Test 1: Simple malloc\n");
void* ptr1 = malloc(15);
printf(" malloc(15) = %p\n", ptr1);
printf("Test 2: Simple free\n");
free(ptr1);
printf(" free() succeeded\n");
printf("Test 3: Multiple allocations\n");
for (int i = 0; i < 100; i++) {
void* p = malloc(15);
free(p);
}
printf(" 100 alloc/free cycles succeeded\n");
printf("Test 4: Concurrent-like pattern\n");
void* ptrs[10];
for (int i = 0; i < 10; i++) {
ptrs[i] = malloc(15 + i);
}
for (int i = 0; i < 10; i++) {
free(ptrs[i]);
}
printf(" Concurrent pattern succeeded\n");
return 0;
}
```
### Step 4: Headerless フラグの確認
Headerless モードPhase 2での動作確認
```bash
# Headerless OFFPhase 1 互換)
make clean
make shared -j8
LD_PRELOAD=./libhakmem.so ./mimalloc-bench/out/bench/sh8bench 2>&1 | grep -E "error|Segmentation|Total"
# Headerless ONPhase 2
make clean
make shared -j8 EXTRA_CFLAGS="-DHAKMEM_TINY_HEADERLESS=1"
LD_PRELOAD=./libhakmem.so ./mimalloc-bench/out/bench/sh8bench 2>&1 | grep -E "error|Segmentation|Total"
```
**確認項目**:
- [ ] Headerless OFF で segfault が出ないか
- [ ] Headerless ON で segfault が出るか
- [ ] Phase 1 と Phase 2 のどちらの問題か判定
---
## 🔧 よくある Segfault 原因と確認方法
### 原因1: Use-After-Free
**兆候**:
- Free 後のポインタアクセス
- GDB: `backtrace` に free → access の順序が見える
**確認コマンド**:
```bash
# ASan で USE_AFTER_FREE エラーが報告される
LD_PRELOAD=./libhakmem_asan.so ./test 2>&1 | grep -i "use.*after.*free"
```
### 原因2: Buffer Overflow
**兆候**:
- 配列境界外アクセス
- 隣接メモリの破壊
**確認コマンド**:
```bash
# ASan で BUFFER_OVERFLOW エラーが報告される
LD_PRELOAD=./libhakmem_asan.so ./test 2>&1 | grep -i "buffer\|overflow"
```
### 原因3: NULL ポインタデリファレンス
**兆候**:
- `malloc()` が NULL を返す
- NULL チェックなしでアクセス
**確認コマンド**:
```bash
# GDB で frame 0 の命令が NULL の dereference か確認
(gdb) disassemble
# → 「mov $0x0」「dereference」のパターン
```
### 原因4: メモリリーク → ヒープ枯渇
**兆候**:
- 長時間実行でメモリ使用量が増加
- やがてメモリ割り当て失敗 → segfault
**確認コマンド**:
```bash
# メモリ使用量を監視しながら実行
( while true; do ps aux | grep sh8bench | grep -v grep | awk '{print $6}'; sleep 1; done ) &
LD_PRELOAD=./libhakmem.so ./mimalloc-bench/out/bench/sh8bench
```
---
## 📝 調査報告形式
Segfault の調査が完了したら、以下の形式で報告してください:
```markdown
## Segfault 調査結果
### 環境
- ビルドオプション: [e.g., "-DHAKMEM_TINY_HEADERLESS=1"]
- テスト内容: [e.g., "sh8bench"]
### GDB 情報
\`\`\`
(gdb) backtrace
#0 0x... in function_name ()
#1 0x... in caller_function ()
...
(gdb) frame 0
#0 address in function_name ()
at file.c:123
\`\`\`
### ASan 出力
[ASan error output if available]
### 根本原因
[Your analysis of the root cause]
### 修正案
[Proposed fix]
```
---
## 🎯 実装フロー
**推奨手順**:
1. **Step 1-2 実行**: GDB + ASan で問題を特定
2. **Step 3 実行**: 最小限テストプログラムで再現
3. **Step 4 実行**: Headerless ON/OFF の判定
4. **修正提案**: 原因に基づいた修正をコード提示
---
## 📚 参考資料
### これまでのドキュメント
- `docs/REFACTOR_PLAN_GEMINI_ENHANCED.md` - 全体計画
- `docs/PHASE2_HEADERLESS_INSTRUCTION_FOR_GEMINI.md` - Phase 2 実装指示
- `docs/tls_sll_hdr_reset_final_report.md` - Phase 2 の背景
### デバッグツール
- GDB: `gdb --args ./program`
- ASan: `make asan-shared-alloc`
- Valgrind: `valgrind --leak-check=full ./program`
### 既知の課題
- TLS_SLL_HDR_RESET は Phase 2 で解決予定
- Headerless モード実装中のため、不安定な可能性あり
---
## 💡 ヒント
1. **頻繁に segfault が発生する場合**:
- 最小限テストプログラムを使用して条件を狭める
- GDB で `run``backtrace``frame 0` の順で実行
2. **ASan のエラーメッセージが出ない場合**:
- ASan が検出できない微妙なメモリ破壊の可能性
- GDB で manual inspection
3. **Headerless モードが原因の場合**:
- Phase 2 指示書の Task 2.1-2.7 を見直す
- 特に Task 2.4Free パスの class_idx 取得)が怪しい
---
Gemini の調査力に期待しています!
根本原因の特定と修正パッチの提案をお願いします。🚀