fix: gcov Windows本地化 + runner合并 + 决策覆盖率修复
- gcov从WSL 15.2改为Windows MinGW 9.2.0,消除.gcno格式不匹配 - coverage.py去除leaf_stats复位bug(决策覆盖率恢复) - runner.py合并V3编译+SOURCE分组执行+出力保存 - __init__.py gcov条件/outdir解析修复
This commit is contained in:
+19
-11
@@ -18,7 +18,7 @@ def parse_cbl_gcov(gcov_path: str) -> dict[int, int]:
|
||||
-: 17: 源码行 → 不可执行(注释/声明行,跳过)
|
||||
"""
|
||||
counts = {}
|
||||
with open(gcov_path, encoding='utf-8') as f:
|
||||
with open(gcov_path, encoding='utf-8', errors='replace') as f:
|
||||
for line in f:
|
||||
m = re.match(r'^\s*(#####|\d+\*?|-):\s*(\d+):', line)
|
||||
if not m:
|
||||
@@ -35,7 +35,10 @@ def parse_cbl_gcov(gcov_path: str) -> dict[int, int]:
|
||||
|
||||
|
||||
def run_gcov(program_name: str, work_dir: str) -> dict[int, int]:
|
||||
"""在 work_dir 中通过 WSL 执行 gcov 并解析 COBOL 行计数。
|
||||
"""在 work_dir 中执行 gcov 并解析 COBOL 行计数。
|
||||
|
||||
使用 Windows 本地的 gcov(与 GnuCOBOL 内置 MinGW 同版本)。
|
||||
不要通过 WSL 调用 gcov,否则 .gcno/.gcda 版本不匹配。
|
||||
|
||||
Args:
|
||||
program_name: 程序名(不含扩展名),如 "ALLCMDS"
|
||||
@@ -44,21 +47,26 @@ def run_gcov(program_name: str, work_dir: str) -> dict[int, int]:
|
||||
Returns:
|
||||
{COBOL行号: 执行次数} 字典。失败时返回空 dict。
|
||||
"""
|
||||
wsl_work = _wsl_path(work_dir)
|
||||
cmd = ['wsl', 'sh', '-c', f'cd {wsl_work} && gcov {program_name}.c']
|
||||
result = subprocess.run(
|
||||
cmd,
|
||||
capture_output=True, text=True,
|
||||
encoding='utf-8', errors='replace',
|
||||
timeout=30,
|
||||
)
|
||||
try:
|
||||
result = subprocess.run(
|
||||
['gcov', f'{program_name}.cbl'],
|
||||
capture_output=True, text=True,
|
||||
encoding='utf-8', errors='replace',
|
||||
timeout=30,
|
||||
cwd=work_dir,
|
||||
)
|
||||
except FileNotFoundError:
|
||||
logger.warning("gcov 命令未找到(未安装 MinGW gcov 或不在 PATH 中)")
|
||||
return {}
|
||||
if result.returncode != 0:
|
||||
logger.warning(f"gcov 失败 (exit={result.returncode}): {result.stderr.strip()}")
|
||||
return {}
|
||||
|
||||
cbl_gcov = Path(work_dir) / f'{program_name}.cbl.gcov'
|
||||
if not cbl_gcov.exists():
|
||||
logger.warning(f"gcov 输出不存在: {cbl_gcov}")
|
||||
cbl_gcov = Path(work_dir) / f'{program_name}.gcov'
|
||||
if not cbl_gcov.exists():
|
||||
logger.warning(f"gcov 输出不存在 (tried .cbl.gcov / .gcov)")
|
||||
return {}
|
||||
|
||||
gcov_data = parse_cbl_gcov(str(cbl_gcov))
|
||||
|
||||
Reference in New Issue
Block a user