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>
273 lines
6.4 KiB
Markdown
273 lines
6.4 KiB
Markdown
# 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: ASan(AddressSanitizer)での検証
|
||
|
||
```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 OFF(Phase 1 互換)
|
||
make clean
|
||
make shared -j8
|
||
LD_PRELOAD=./libhakmem.so ./mimalloc-bench/out/bench/sh8bench 2>&1 | grep -E "error|Segmentation|Total"
|
||
|
||
# Headerless ON(Phase 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.4(Free パスの class_idx 取得)が怪しい
|
||
|
||
---
|
||
|
||
Gemini の調査力に期待しています!
|
||
根本原因の特定と修正パッチの提案をお願いします。🚀
|