2010-11-27 36 views
3

我有一個C程序使用PIPES與外部應用程序進行通信。如何將RUNTIME ERRORS重定向到STDERR?

我用EXECL此:

execl("./errorprogram","./errorprogram", NULL); 

現在我也用DUP2所有STDERR重定向到管道的書寫端

dup2(fd[1], STDERR_FILENO); 

如果我測試使用一個簡單的Python腳本如:

data = sys.stdin.read() 
sys.stderr.write("Bad error\n") 

我可以高興地讀回「父母」中的錯誤。

現在對於我的問題:比方說,我有一個C「兒童計劃」已經在它的內存泄露或類似「無效指針」錯誤:

#include<stdio.h> 
#include<string.h> 

void main(){ 
    char szInput[1024]; 
    char *badvar; 
    gets(szInput); 

    badvar = realloc(badvar, 100); 
    puts(szInput); 
    fflush(NULL); 
} 

上面的realloc的說法是故意在那裏導致程序死了,我會得到一個錯誤,如在運行時以下(obvioulsy父不受影響,只有子進程):

* glibc的檢測 ./error:realloc的():無效指針:0xb77a5250 * *

而且整體斯特斯跟蹤等....

現在,我怎樣才能得到任何運行時錯誤像這樣STDERR,所以我可以閱讀完整回溯到父?

是否必須將「運行時錯誤重定向到STDERR」?當然,有可能從孩子那裏得到這些忙碌的錯誤,以便父母可以登錄他們等等。

任何幫助或提醒將不勝感激;-)

感謝

林頓

回答

0

一個可能的解決方案,如果你是一個支持信號,如Linux的系統上工作,是使用信號機制。對於無效的內存引用(我相信這是SIGSEGV信號),我認爲應該安裝一個信號動作來捕捉上面給出的特定示例。在處理程序中,您可以根據需要將錯誤消息打印到STDERR。但是,您仍然需要一些方法來確定堆棧跟蹤。

+0

您好,感謝您對信號的評論,我會試試....我希望有一種方法可以簡單地「重定向」,但我想如果信號是唯一的方法,那麼我會試試看...謝謝;-) – 2010-11-27 06:36:27

+0

如果您確實找到了一種您想要的行爲,請將其發佈到此處。我有興趣知道。 – River 2010-11-27 07:33:01

5

默認情況下,Glibc將在進程的控制終端(如果存在)上生成輸出。這聽起來像是你想要設置環境變量LIBC_FATAL_STDERR_=1,它將總是將致命錯誤發送到stderr。

相關問題