我怎样才能使用;gcov“;即使出现分段错误?
我正在编译一个带有标志“-Wall-W-pedantic-O0-coverage”(GCC版本4.8.2)的C程序。但是,当该程序出现分段错误时,我无法提取覆盖率,因为我没有.gcda文件 有人知道即使出现分段错误,我如何使用gcov 谢谢 有人知道即使发生分段错误,我如何使用gcov吗 覆盖率文件通常由我怎样才能使用;gcov“;即使出现分段错误?,c,segmentation-fault,gcov,C,Segmentation Fault,Gcov,我正在编译一个带有标志“-Wall-W-pedantic-O0-coverage”(GCC版本4.8.2)的C程序。但是,当该程序出现分段错误时,我无法提取覆盖率,因为我没有.gcda文件 有人知道即使出现分段错误,我如何使用gcov 谢谢 有人知道即使发生分段错误,我如何使用gcov吗 覆盖率文件通常由atexit处理程序编写,它要求程序调用exit()。当程序与SIGSEGV一起死机时,不会发生这种情况,这就是为什么在这种情况下不能获得.gcda文件的原因 最好的解决方案是首先修复导致SIG
atexit
处理程序编写,它要求程序调用exit()
。当程序与SIGSEGV
一起死机时,不会发生这种情况,这就是为什么在这种情况下不能获得.gcda
文件的原因
最好的解决方案是首先修复导致SIGSEGVSIGSEGV
的任何错误
或者,您可以安装一个SIGSEGV
处理程序,并从中调用exit()
。这并不能保证有效。例如,如果您的程序由于堆损坏而命中了SIGSEGV
,则当exit
调用全局析构函数时,它可能会再次死锁或崩溃
另一种可能的解决方案是在GDB下运行该程序,当您获得
SIGSEGV
时,从调试器调用\uuuugcov\u flush()
,您需要-g
作为调试符号,您应该使用GDB,而不是gcov。您好@MatteoItalia,谢谢您的回复,但我不想调试该程序,我想要程序执行的覆盖范围(即使发生分段错误)。我的问题和这个老问题很相似。呃,对不起,我当时完全误解了这个问题。+1极好-\uugcov\u flush()
正是我需要知道的!非常感谢。在我的上下文中,我没有\u gcov\u flush()
符号,但这个想法奏效了。我只是调用了gcov_exit()
(使用print
命令),我的可执行文件编写了它的.gcda
文件。