我正在嘗試製作一個程序。這是通過gcc編譯器從C代碼打印錯誤。 編譯錯誤發生時,它會生成錯誤消息中的文本文件。但運行時錯誤發生時。例如,「分段錯誤」。該文件是空的。 它在終端上很好地顯示了分段錯誤,但它不顯示文件中的錯誤。如何將gcc運行時錯誤打印到文本文件?
我試着在幾條命令下鍵入,但它仍然不起作用。
gcc new.c &> myFile
gcc new.c > myFile 2>&1
我正在嘗試製作一個程序。這是通過gcc編譯器從C代碼打印錯誤。 編譯錯誤發生時,它會生成錯誤消息中的文本文件。但運行時錯誤發生時。例如,「分段錯誤」。該文件是空的。 它在終端上很好地顯示了分段錯誤,但它不顯示文件中的錯誤。如何將gcc運行時錯誤打印到文本文件?
我試着在幾條命令下鍵入,但它仍然不起作用。
gcc new.c &> myFile
gcc new.c > myFile 2>&1
我想你需要核心轉儲文件,但沒有趕上gcc
運行時的錯誤,我告訴你如何在Linux下獲得核心轉儲,我寫了一個測試程序,test_coredump.c
:
#include <stdlib.h>
int main(void){
int *ptr = NULL;
*ptr = 10; //Segmentation fault will happen since you write to a null memory
return 0;
}
通常情況下,我會做以下步驟編譯之前:
[email protected]:~/Work/c/test_coredump
-> ulimit -c
0
[email protected]:~/Work/c/test_coredump
-> ulimit -c unlimited
[email protected]:~/Work/c/test_coredump
-> ulimit -c
unlimited
[email protected]:~/Work/c/test_coredump
-> gcc -g ./test_coredump.c
[email protected]:~/Work/c/test_coredump
-> ls
a.out test_coredump.c
[email protected]:~/Work/c/test_coredump
-> ./a.out
Segmentation fault (core dumped)
在此之後,它會爲你生成核心轉儲文件:
[email protected]:~/Work/c/test_coredump
-> ls
a.out core test_coredump.c
,你可以知道使用gdb
或者你喜歡的任何調試工具見:
[email protected]:~/Work/c/test_coredump
-> gdb ./a.out ./core
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./a.out...done.
[New LWP 6421]
Core was generated by `./a.out'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x080483fd in main() at test_coredump.c:5
5 *ptr = 10; //Segmentation fault will happen since you write to a null memory
(gdb)
你可以找到你在哪裏編程陷阱。
謝謝你的回答。這是一個好方法!還有一個問題,你能提取'gdb ./a.out ./core'文件的結果嗎?非常感謝!! –
@ user3422425,我沒有試過,因爲當我運行'gdb ./a.out。/ core'時,'gdb1正在運行。我嘗試'gdb ./a.out ./core> log',但shell等待'gdb'的輸入等待,我可以輸入'q'來退出'gdb',然後你可以在你的日誌文件中找到上面的日誌。然而,'core'文件已經包含了你需要的所有消息,我認爲它是LOG :),但是你需要'gdb'來解碼。 –
太棒了!我認爲懸而未決的問題,我們可以殺死任務。再次感謝你。 –
本應該把錯誤的文件中正確:
gcc new.c -o new.x >& error.log
謝謝。但是,error.log文件仍然是空的。 –
gcc
編譯程序。重定向gcc的輸出將無法幫助您解決程序在編譯成功後運行時發生的任何錯誤。
要運行程序並將程序的stderr
重定向到文件,您可以編寫./yourprogramname 2>file.txt
。
但是,Segmentation fault
消息不是由您的程序生成的。它由操作系統生成,並打印在shell的stderr
(不是您的程序的stderr)上。重定向這個消息取決於你的shell,見this question。
你說的是GCC本身的運行時錯誤? –
我認爲,gcc會產生編譯錯誤的文件。但是,運行時錯誤.... –
那麼,我不知道如何讓海灣合作委員會拋出seg-fault,所以我很難重現! –