2014-02-19 70 views
-1

我從我的C程序中調用make,這個實習生執行另一個程序。我將標準輸出和標準錯誤都重定向到一個文件。但是,當由make運行的程序由於分段錯誤而終止時,會生成一個核心轉儲並將其打印到正在調用make的主程序的控制檯(標準輸出)。coredump重定向到文件

我該如何解決這個問題,而不是在控制檯上顯示核心轉儲?

以下是我的代碼來調用make:

int pid = fork(); 

if(pid==0){ 
dup2(make_logs, 1); 
dup2(make_logs, 2); 
close(make_logs); 
execvp (args[0],args); 
} 

哪裏make_logs是用「開放」

感謝

打開的文件
+0

請確認從命令行運行程序(或任何其他程序)沒有相同的問題。 – Keith

+0

是的,我可以確認,如果運行相同的程序,則存在覈心轉儲。但是,我不明白的是,因爲標準輸出和錯誤都被重定向,所以這應該被寫入文件並且不會被傳播到父進程。 – user1479589

+1

如果你用'strace -f'在這裏運行你的程序,會看到進程的所有系統調用,並查看傳播的內容和方式。 – nos

回答

1

我會嘗試修復核心轉儲,而不是抑制該消息,但有關分段錯誤的消息正在由shell(它檢測孩子的退出值並識別核心轉儲情況)生成,所以你可以通過安裝自己的程序來處理fork()和等待()而不是有殼做的工作。

爲了抑制核心轉儲,只需使用限制coredumpsize 0

樣品的抑制(馬虎的代碼,你真的應該檢查錯誤):

#include <sys/types.h> 
#include <sys/wait.h> 


main(int argc, char **argv) 
{ 
    int pid; 
    if((pid = fork()) > 0) wait(0); 
    else if(pid == 0) { 
     execl("program-that-cdumps", "program-that-cdumps", 0); 
     perror("failed in execl"); 
    } else perror("failed in fork"); 
} 
+0

嗨,我該如何處理它在fork()wait()而不是限制大小? – user1479589

+0

問題仍然存在,我得到在終端下面,我不想: http://pastebin.com/V2yywTmW – user1479589

0

閱讀core(5)signal(7)手冊頁。

gcc -Wall -g編譯所有程序。然後使用

file core 

瞭解哪個二進制轉儲核心。它可能會說像core dump from foo這樣的告訴你方案foo傾銷的核心。然後,開始驗屍調試器就可以了:

gdb foo core 

,並使用共同gdb命令(尤其是bt來回溯,p打印,等等)。

消息dumped core由某個shell給出(或者當其像shell一樣運行時,可能由make給出)。我不認爲core文件輸出到stdout(這是一個很大的二進制文件)。

如果你想避免core(這恕我直言,是一個壞主意,一個core轉儲不對勁了良好的症狀),你可以在你的fork之後和之前的execvp致電setrlimit(2)系統調用與RLIMIT_CORE和0限。我相信你不應該這樣做(或者至少有一些配置的方式,setrlimit不叫:有時你真的需要core轉儲調試問題)。

您應該修復出現core轉儲問題,而不是嘗試避免dumped core消息!

如果您所提供Makefile使得core轉儲是從用戶程序,你真的想保持用戶告知,core確實發生了一個用戶運行make,所以你應該保持core dumped消息。

+0

我在某種程度上沒有正在被打印出來的回溯和存儲器映射只是有興趣當進程遇到seg錯誤時,子進程的子進程...我對解決問題不感興趣,因爲在執行故障注入時,行爲與我的應用程序有關。 – user1479589

+0

BUMP !!!!! !!!!!! – user1479589