【问题标题】:GCC6.3.0: flag "--coverage" not functioning (no gdca files generated)GCC6.3.0:标志“--coverage”不起作用(没有生成 gdca 文件)
【发布时间】:2019-04-17 07:12:36
【问题描述】:

在 C 中有一个代码 sn-p,在 C++ 中有一个相同的代码,它生成 gdca 文件,执行使用 GCC 4.1.2 编译的 exe。 同样的代码sn-p用GCC6.3.0编译后执行后不生成gdca文件,不是C.exe不是c++.exe

发现gcov库的实现不一样,在GCC4.1.2和GCC6.3.0中,gcov库在GCC6.3.0的版本好像是空的:

_gcov_merge_add.o:     file format elf32-i386

Disassembly of section .text:
00000000 <__gcov_merge_add>:
   0: 55                    push   %ebp
   1: 89 e5                 mov    %esp,%ebp
   3: 5d                    pop    %ebp
   4: c3                    ret
_gcov_merge_single.o:     file format elf32-i386

Disassembly of section .text:
00000000 <__gcov_merge_single>:
   0: 55                    push   %ebp
   1: 89 e5                 mov    %esp,%ebp
   3: 5d                    pop    %ebp
   4: c3                    ret
_gcov_merge_delta.o:     file format elf32-i386

Disassembly of section .text:
00000000 <__gcov_merge_delta>:
   0: 55                    push   %ebp
   1: 89 e5                 mov    %esp,%ebp
   3: 5d                    pop    %ebp
   4: c3                    ret
_gcov_merge_ior.o:     file format elf32-i386
_gcov_merge_time_profile.o:     file format elf32-i386
_gcov_merge_icall_topn.o:     file format elf32-i386
_gcov_interval_profiler.o:     file format elf32-i386
_gcov_pow2_profiler.o:     file format elf32-i386
_gcov_one_value_profiler.o:     file format elf32-i386
_gcov_indirect_call_profiler.o:     file format elf32-i386
_gcov_average_profiler.o:     file format elf32-i386
_gcov_ior_profiler.o:     file format elf32-i386

_gcov_indirect_call_profiler_v2.o:     file format elf32-i386

_gcov_time_profiler.o:     file format elf32-i386
_gcov_indirect_call_topn_profiler.o:     file format elf32-i386
_gcov_dump.o:     file format elf32-i386

Disassembly of section .text:
00000000 <__gcov_dump>:
   0: 55                    push   %ebp
   1: 89 e5                 mov    %esp,%ebp
   3: 5d                    pop    %ebp
   4: c3                    ret
_gcov_flush.o:     file format elf32-i386

Disassembly of section .text:
00000000 <__gcov_flush>:
   0: 55                    push   %ebp
   1: 89 e5                 mov    %esp,%ebp
   3: 5d                    pop    %ebp
   4: c3                    ret
_gcov_fork.o:     file format elf32-i386
_gcov_execl.o:     file format elf32-i386
_gcov_execlp.o:     file format elf32-i386
_gcov_execle.o:     file format elf32-i386
_gcov_execv.o:     file format elf32-i386
_gcov_execvp.o:     file format elf32-i386
_gcov_execve.o:     file format elf32-i386
_gcov_reset.o:     file format elf32-i386

Disassembly of section .text:
00000000 <__gcov_reset>:
   0: 55                    push   %ebp
   1: 89 e5                 mov    %esp,%ebp
   3: 5d                    pop    %ebp
   4: c3                    ret
_gcov.o:     file format elf32-i386

Disassembly of section .text:
00000000 <__gcov_init>:
   0: 55                    push   %ebp
   1: 89 e5                 mov    %esp,%ebp
   3: 5d                    pop    %ebp
   4: c3                    ret

The gcov within the GCC 6.3.0 was build with following flags:

/usr/gnu/gcc/V6.3.0/gcc-6.3.0_build/./gcc/xgcc
-B/usr/gnu/gcc/V6.3.0/gcc-6.3.0_build/./gcc/
-B/opt/V6.3.0/i686-elf/bin/ -B/opt/V6.3.0/i686-elf/lib/ -isystem
/opt/V6.3.0/i686-elf/include -isystem /opt/V6.3.0/i686-elf/sys-include
-fpic -O2 -mpreferred-stack-boundary=3 -O2  -fpic -O2
-mpreferred-stack-boundary=3 -DIN_GCC  -DCROSS_DIRECTORY_STRUCTURE  -W
-Wall -Wno-narrowing -Wwrite-strings -Wcast-qual -Wstrict-prototypes
-Wmissing-prototypes -Wold-style-definition  -isystem ./include
-fpic -g -DIN_LIBGCC2 -fbuilding-libgcc -fno-stack-protector
-Dinhibit_libc  -fpic -I. -I. -I../.././gcc
-I../../../gcc-6.3.0/libgcc -I../../../gcc-6.3.0/libgcc/.
-I../../../gcc-6.3.0/libgcc/../gcc
-I../../../gcc-6.3.0/libgcc/../include    -o _gcov_flush.o -MT
_gcov_flush.o -MD -MP -MF _gcov_flush.dep -DL_gcov_flush -c
../../../gcc-6.3.0/libgcc/libgcov-interface.c

知道 gcov 库有什么问题吗? 或者 GCC6.3.0 中还缺少什么? 在 GCC 6.3.0 下还有其他人在使用 gcov 时遇到困难吗?

【问题讨论】:

  • 您使用的是完整标志吗? --coverage -fprofile-arcs -ftest-coverage
  • 是的,我已经尝试过“完整”标志 -fprofile-arcs -ftest-coverage 和一个 --coverage 标志。使用GCC4.1.2编译的exe在执行时会创建gdca文件,在这两种情况下,使用GCC6.3.0编译的exe只是不创建gdca文件。在所有情况下,使用两种编译器,同时使用编译标志,都会生成 *.gcno 文件。
  • 可以显示编译命令行吗?
  • "./i686-elf-gcc.exe" -MD -x c++ "C:/Test1/Logical/ProgramCpp/Main.cpp" -o "C:/Test1/Temp/Objects/ GCC630/PC/ProgramCpp/Main.cpp.o" "-IC:/GnuInst/V6.3.0/lib/gcc/i686-elf/6.3.0/include" "-IC:/GnuInst/V6.3.0/i686- elf/include" "-IC:/GnuInst/V6.3.0/include/c++/6.3.0" "-IC:/GnuInst/V6.3.0/include/c++/6.3.0/i686-elf" -specs=I386specs_brelf "-IC:/Test1/Logical/ProgramCpp" "-IC:/Test1/Temp/Includes/ProgramCpp" "-IC:/Test1/Temp/Includes"
  • -trigraphs -fno-asm -D _DEFAULT_INCLUDES -D _SG4 -fPIC -O0 -g -Wall -include "C:/Test1/Temp/Objects/GCC630/PC/Libraries.h" --覆盖 -fprofile-arcs -ftest-coverage --coverage -c

标签: c++ c gcc code-coverage gcov


【解决方案1】:

当 target != host 并且您的 libc 标志设置为 true 时,您将不会实现 gcov 库,gcov.a 的对象转储显示没有实现。在这种情况下,将 libgcc 的 inhibit-libc 标志设置为 false,重新编译即可实现 gcov。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    • 2020-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多