diff --git a/lib/Projectrans/Phase2Translator.py b/lib/Projectrans/Phase2Translator.py index 44fa4b2..ef7bfce 100644 --- a/lib/Projectrans/Phase2Translator.py +++ b/lib/Projectrans/Phase2Translator.py @@ -917,6 +917,22 @@ class Phase2Translator: raise _vlog().warning(f"收集源文件导入的 include 模块失败: {_e}", "Exception") + # --hotspot-sites:上面两个缓存/重组分支在 hotspot_on 时被跳过, + # 本轮每个模块都会强制重译 .ll;此时必须让旧的 {sha1}.obj 一并失效, + # 否则 _compile_ll_files 会因 .obj 已存在而跳过重编,复用上一次未插桩 + # 的目标文件,导致部分模块热点计时/计数静默缺失、耗时被计入调用者 self。 + # 这里用 os.path.isfile 而非 _CachedIsFile:避免把"已存在"写进存在性 + # 缓存后又被本函数删除,使后续 _compile_ll_files 读到过期缓存而漏编。 + if hotspot_on: + obj_path = os.path.join(self.output_dir, f"{sha1}.obj") + if os.path.isfile(obj_path): + try: + os.remove(obj_path) + except OSError as e: + # 不中断构建,但真实错误(如权限不足)必须打印告警,不静默吞掉 + _vlog().warning( + f"Phase2Translator: 删除热点插桩模块的旧目标文件失败: {obj_path}: {e}") + if not hotspot_on and _CachedIsFile(out_path): deps_changed = self._check_deps_changed(sha1, current_ModuleSha1Map) if not deps_changed: