我正在使用标志“-Wall -W -pedantic -O0 --coverage”(GCC版本4.8.2)编译C程序。但是,当该程序发生分段错误时,我无法提取覆盖范围,因为我没有.gcda文件......
有人知道即使发生分段错误,我怎样才能使用 gcov ?
感谢。
答案 0 :(得分:6)
有人知道即使出现分段错误,我怎样才能使用gcov?
覆盖文件通常由atexit
处理程序编写,这需要程序调用{{1}}。当程序以exit()
终止时,这不会发生,这就是为什么在这种情况下你没有获得SIGSEGV
文件的原因。
最好的解决方案是首先修复导致.gcda
的任何错误。
或者,您可以安装SIGSEGV
处理程序,并从中调用SIGSEGV
。这不保证可以正常工作。例如,如果您的程序由于堆损坏而命中exit()
,则当SIGSEGV
调用全局析构函数时,它可能会死锁或再次崩溃 。
另一种可能的解决方案是在GDB下运行程序,并在获得exit
时从调试器调用__gcov_flush()
。