我正在編譯一個帶有標誌「-Wall -W -pedantic -O0 --coverage」(GCC版本4.8.2)的C程序。然而,當分割故障發生在該程序中,我不能提取的覆蓋面,因爲我沒有.gcda文件...即使發生分段錯誤,我如何使用「gcov」?
有誰知道我該如何使用gcov的即使分段錯誤發生?
謝謝。
我正在編譯一個帶有標誌「-Wall -W -pedantic -O0 --coverage」(GCC版本4.8.2)的C程序。然而,當分割故障發生在該程序中,我不能提取的覆蓋面,因爲我沒有.gcda文件...即使發生分段錯誤,我如何使用「gcov」?
有誰知道我該如何使用gcov的即使分段錯誤發生?
謝謝。
有誰知道即使發生分段錯誤,我該如何使用gcov?
覆蓋文件通常由atexit
處理程序編寫,該程序需要程序調用exit()
。當程序死於SIGSEGV
時,這種情況不會發生,這就是爲什麼在這種情況下你沒有得到.gcda
文件。
最好的解決方案是首先解決造成SIGSEGV
的任何錯誤。
或者,您可以安裝SIGSEGV
處理程序,並從中調用exit()
。這是不是保證工作。例如,如果您的程序由於堆損壞而命中SIGSEGV
,則當exit
調用全局析構函數時,它可能會死鎖或崩潰。
另一個可能的解決方案是在GDB下運行該程序,並在得到SIGSEGV
時從調試器調用__gcov_flush()
。
+1優秀 - '__gcov_flush()'正是我需要知道的!謝謝! – scraimer
您需要'-g'作爲調試符號,並且您應該使用gdb,而不是gcov。 –
嗨@MatteoItalia,感謝您的回覆,但我不想調試程序,我想要覆蓋程序的執行(即使發生分段錯誤)。我的問題類似於這個舊的[問題](http://gcc.gnu.org/ml/gcc-help/2012-04/msg00108.html)。 – josecampos
對不起,我完全誤解了這個問題。 –