qiniu / goc

A Comprehensive Coverage Testing System for The Go Programming Language
Apache License 2.0
817 stars 117 forks source link

是否考虑增加类调试器的采集模式? #347

Closed myzhan closed 1 year ago

myzhan commented 1 year ago

参考 OpenCppCoverage 和 kcov,他们工作在调试器模式下,可以不用修改代码重新编译,即可获取到覆盖率。

我在 goc 也做了类似的实现,大概步骤如下:

  1. 解析被测应用的符号表,获取到所有地址,以及地址和代码行的对应关系。
  2. 通过 goc 启动被测应用,先用 ptrace 让子进程停下来,然后在所有地址上写满断点。
  3. goc 监听子进程的 TRAP 信号,根据 PC 寄存器拿到地址,从第一步保存的对应关系中,查出目前执行的代码行,记录覆盖率。
  4. 移除当前的断点,继续执行子进程。

考虑到工作量不小,目前只是写了一个 POC,如果作者有兴趣,我可以先发出来。

myzhan commented 1 year ago

测试了一下,直接使用这个项目,可以采集 go 的覆盖率 https://github.com/SimonKagstrom/kcov