【问题标题】:Using gcov with shared objects used by executable将 gcov 与可执行文件使用的共享对象一起使用
【发布时间】:2023-03-31 15:10:01
【问题描述】:

我正在尝试为我的项目生成覆盖率报告。 .gcno 文件是按预期为共享对象代码文件生成的,但是当我运行可执行文件(它使用生成的共享对象)时,.so 也存在于与可执行文件相同的位置,但共享对象的 .gcda 文件不会生成而可执行代码的 .gcda 文件按预期生成。 方法有问题吗? 请告知

【问题讨论】:

  • 我有 gcc 4.1 工具链,4.1 是否支持上面共享的链接参考 gcc 4.5?
  • 您能否详细说明您的编译位置和可执行文件的运行位置,即您是否在您构建的同一位置运行您的可执行文件?
  • 是的,我的可执行文件在我构建的同一个地方,并且.so(由可执行文件使用)存在于同一个目录中(作为 exec)[我在同一个地方构建]

标签: gcov


【解决方案1】:

它可以覆盖共享库。 我尝试使用具有共享库概念的 gcov 进行简单的 hello 应用程序分析,我能够获得代码覆盖率。 让我们拿两个文件 hello.c 和 extlib.c

首先编译extlib.c

#include <stdio.h>

extern void print(const char* p, ...);

void print(const char* p, ...) {
    printf("%s World!\n", p);

}

gcc -shared -fPIC extlib.c -o libext.so -ftest-coverage -fprofile-arcs

这里会得到extlib.gcno libextlib.so

接下来将它链接到主 hello 程序 //你好ç extern void print(const char*, ...);

int main() {
    print("Hello");
}

gcc hello.c -L./ -lextlib -o test -ftest-coverage -fprofile-arcs

在这个 hello.gcno 文件之后。 执行./test

执行后会得到extlib.gcda和hello.gcda

使用gcov *.c 可以检查覆盖率。

所以我的建议是在你的项目中尝试一些简单的文件,使用 gcov 分析单独编译它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 2015-07-20
    • 1970-01-01
    • 2010-12-12
    • 2013-12-07
    相关资源
    最近更新 更多