47 lines
2.4 KiB
Markdown
47 lines
2.4 KiB
Markdown
# Debug Session: reexport-strcmp-crash
|
||
- **Status**: [OPEN]
|
||
- **Issue**: TPV 编译时概率崩溃,`ImportsGenMixin.lookup_reexport` 内 `strcmp` 读取垃圾指针 0x12e200000001(READ access-violation)
|
||
- **Debug Server**: 无(原生编译器,用 stderr 捕获)
|
||
- **Log File**: 1.log / 用户运行输出
|
||
|
||
## Reproduction Steps
|
||
1. 用 `TransPyV/output/TransPyV.exe`(ASan 版)编译 TPV 或某个多文件项目
|
||
2. 多次运行,约 1/N 概率在 `lookup_reexport` 的 strcmp 崩溃
|
||
3. 崩溃栈:AnnAssignHandle → translate_value → translate_call → lookup_reexport → strcmp
|
||
(for 循环体内 AnnAssign 的值表达式是跨模块调用)
|
||
|
||
## Hypotheses & Verification
|
||
| ID | Hypothesis | Likelihood | Effort | Evidence |
|
||
|----|------------|------------|--------|----------|
|
||
| A | `self`(ImportsGenMixin 子对象)经 MRO this-adjust 错位 → 读 ReexportSha1s/Count 得到垃圾 | High | Low | Pending |
|
||
| B | perm_pool 中 reexport 表被其他分配越界写覆盖(表指针有效但内容被污染) | Med | Low | Pending |
|
||
| C | Generator 对象(mb)字段被越界写污染(ReexportCount 变垃圾) | Med | Low | Pending |
|
||
| D | `mod_sha1` / `func_name` 参数悬空(AST/SHA1 store 被回收) | Low | Low | Pending |
|
||
| E | register_reexport 用悬空源串写入表 → 表内复制了垃圾 | Low | Low | Pending |
|
||
|
||
## Log Evidence
|
||
(待插桩后收集)
|
||
|
||
### 插桩点(2026-08-19 已加,未提交,验证后移除)
|
||
- `ImportsGenMixin.vp` `lookup_reexport`:
|
||
- `[DBG-RE1]` 入口:self/count/sha1s/funcs/srcs/mod_sha1/func_name(表非空时每次调用打印)
|
||
- ~~`[DBG-RE2]` 循环内每次 strcmp 前状态~~(已按用户要求移除)
|
||
- `CallGenCall.vp` `_translate_method_call` this-adjust:
|
||
- `[DBG-ADJ1]` class/anc/obj
|
||
- `[DBG-ADJ2]` find_struct(anc) 结果 + FieldCount
|
||
- `[DBG-ADJ3]` first_field/anc_off/sub_off/delta
|
||
|
||
### 复现操作
|
||
1. 清缓存 + Phase A 重建(含插桩的 TransPyV)
|
||
2. 反复运行编译目标项目(崩溃概率 1/N),捕获 stdout/stderr 到文件
|
||
3. 崩溃前最后几条 `[DBG-*]` 行即关键证据
|
||
|
||
## Verification Conclusion
|
||
(待定)
|
||
|
||
### 插桩已全部移除(2026-08-19 用户要求)
|
||
- [DBG-RE1/RE2](ImportsGenMixin.vp)已删,文件恢复 HEAD
|
||
- [DBG-ADJ1/2/3](CallGenCall.vp)已删
|
||
- this-adjust fail-fast 修复已提交:TransPyV `6807082`
|
||
- 概率崩溃是否根治待用户重建后观察(如再复发,可重新插桩)
|