【问题标题】:dlopen not working with code-coverage tools (lcov/gcov)dlopen 无法使用代码覆盖工具 (lcov/gcov)
【发布时间】:2013-09-16 20:52:15
【问题描述】:

整个应用的结构:

  1. 说共享库 - low_level.so。
  2. 说静态库 - high_level.a。这个静态库通过调用 dlopen 函数(用于加载 low_level.so)和 dlsym 函数(用于获取该符号加载到内存中的地址)来使用“low_level.so”。
  3. 应用程序(带有“main”函数)- 此应用程序链接“high_level.a”静态库,该库在内部调用“low_level.so”库中所需的函数。

当前场景(工作/不工作)

  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:/home/test/libXXX.so:未定义符号:__gcov_merge_add

问题?:

  1. 这是否意味着 dlopen 不能与 lcov/gcov 一起使用,我们需要实际链接静态库中的共享库(通过更改相同的当前静态库代码)?或者,为了使 lcov/gcov 与 dlopen 一起工作,我还有什么需要做的吗?

注意:所有代码都在“C”中。

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

【问题讨论】:

  • 我不知道答案,但似乎问题是__gcov_merge_add 是必需的,dlopen 不会尝试在“主”应用程序中找到它,而是在另一个图书馆。也许您需要将其静态链接到您的“low_level.so”?
  • 感谢垫子的想法。 'low_level.so' 被'high_level.a' 调用。我尝试在编译“high_level.a”时添加 -coverage 选项。但是 dlopen 仍然没有捡起它。无论如何,“主”应用程序只是调用'high_level.a'的函数,而不是直接调用'low_level.so'的函数。
  • 我的意思是,覆盖功能似乎需要与 low_level.so... 但我不知道这是如何工作的,我只是从错误中解释您收到的消息。
  • 感谢 cmets,Mat。

标签: c code-coverage dlopen gcov lcov


【解决方案1】:

感谢 Mat 提供一些意见和想法。

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

【讨论】:

    【解决方案2】:

    我通过在共享库链接中添加 -lgcov 解决了这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-30
      • 2011-06-06
      • 2014-03-21
      • 2012-11-22
      • 1970-01-01
      • 2011-09-15
      • 2016-10-07
      • 1970-01-01
      相关资源
      最近更新 更多