2013-11-27 32 views
3

我正在編譯一個帶有標誌「-Wall -W -pedantic -O0 --coverage」(GCC版本4.8.2)的C程序。然而,當分割故障發生在該程序中,我不能提取的覆蓋面,因爲我沒有.gcda文件...即使發生分段錯誤,我如何使用「gcov」?

有誰知道我該如何使用gcov的即使分段錯誤發生

謝謝。

+0

您需要'-g'作爲調試符號,並且您應該使用gdb,而不是gcov。 –

+0

嗨@MatteoItalia,感謝您的回覆,但我不想調試程序,我想要覆蓋程序的執行(即使發生分段錯誤)。我的問題類似於這個舊的[問題](http://gcc.gnu.org/ml/gcc-help/2012-04/msg00108.html)。 – josecampos

+0

對不起,我完全誤解了這個問題。 –

回答

5

有誰知道即使發生分段錯誤,我該如何使用gcov?

覆蓋文件通常由atexit處理程序編寫,該程序需要程序調用exit()。當程序死於SIGSEGV時,這種情況不會發生,這就是爲什麼在這種情況下你沒有得到.gcda文件。

最好的解決方案是首先解決造成SIGSEGV的任何錯誤。

或者,您可以安裝SIGSEGV處理程序,並從中調用exit()。這是不是保證工作。例如,如果您的程序由於堆損壞而命中SIGSEGV,則當exit調用全局析構函數時,它可能會死鎖或崩潰

另一個可能的解決方案是在GDB下運行該程序,並在得到SIGSEGV時從調試器調用__gcov_flush()

+0

+1優秀 - '__gcov_flush()'正是我需要知道的!謝謝! – scraimer

相關問題