dlopen不使用代码覆盖工具(lcov / gcov)

时间:2013-09-12 12:48:49

标签: c code-coverage dlopen gcov lcov

整个申请的结构:

  1. 共享图书馆说 - low_level.so。
  2. 静态图书馆说 - high_level.a。这个静态库通过调用dlopen函数(用于加载low_level.so)和dlsym函数(用于获取该符号加载到内存中的地址)来使用'low_level.so'。
  3. 应用程序(带'main'功能) - 该应用程序链接'high_level.a'静态库,该库在内部调用'low_level.so'库中所需的函数。
  4. 当前情景(工作/不工作)

    1. 以上结构适用于我没有使用lcov / gcov工具进行代码覆盖的情况。
    2. 我成功使用lcov / gcov工具获取'high_level.a'静态库的代码覆盖率。
    3. 我尝试使用上述结构中的lcov / gcov获取'low_level.so'共享库的代码覆盖率但未成功,下面是尝试的步骤并看到错误:

      • 编译'low_level.so'库时添加了“-fprofile-arcs”“ - ftest-coverage”标志。 并创建了图书馆。

      • 为'high_level.a'库的编译添加了“-coverage”选项。并创造了 库。

      • 为应用程序添加了'LFLAGS = -lgcov -coverage'(带'main'功能)。和 创建了可执行应用程序。

      • 现在,当我尝试执行上面编译的应用程序时,我得到以下错误 dlopen的: 无法dlopen:/home/test/libXXX.so:未定义的符号:__ gcov_merge_add

    4. 问题?:

      1. 这是否意味着dlopen不能与lcov / gcov一起使用,我们需要实际链接静态库中的共享库(通过更改当前的静态库代码)?或者是否有一些我为了使lcov / gcov与dlopen一起工作而缺少的东西?
      2. 注意:所有代码都在'C'。

        仅供参考,我搜索了同样的问题并发现了一些类似的问题,这个问题仍然落后于一个选定的最佳答案: How to find the coverage of a library opened using dlopen()? 除了不使用dlopen之外,网上还没有好的指针。

2 个答案:

答案 0 :(得分:0)

感谢Mat提供一些意见和建议。

内联到那个并做了一些试验和错误,我终于能够通过在编译时添加“-fprofile-arcs”和“-ftest-coverage”选项作为链接器标志以及编译器标志来解决问题'low_level.so'图书馆。

答案 1 :(得分:0)

我通过将-lgcov添加到共享库链接来解决这个问题。