2012-08-12 56 views
0

我花了數小時試圖調試一個使用exec()運行c模擬的php腳本。在將stderr打印消息放到任何地方後,我終於發現底層問題是使用sprintf()將打印目錄路徑打印到字符數組太小。來自php執行c腳本的錯誤消息

我猜這是段錯誤,但我從來沒有看到shell錯誤消息說'段錯誤'。當我改變分配大小時,一切正常。

我已經將stderr輸出重定向到一個日誌文件,並且該日誌文件從fprintf獲得所有消息(stderr,「...」);但它沒有收到任何shell錯誤消息。

的命令是這個

exec("$cmd 2>> $logFile & $PROCFILE 1 $ipaddr $! 2>> $logFile", $output, $rv); 

$ CMD運行一個C仿真和$ PROCFILE運行的第二個C程序,有三個參數(1,$ IPADDR和$!)。在解決分配大小問題之前,php腳本會停止執行$ cmd模擬,並繼續執行下一行(即在exec()語句之後)。在PHP文件中的下一行是

if(rv!=0){handle error} 

但這也沒有發現問題。

我一直在想我遇到了權限錯誤。如何獲得exec()來顯示shell錯誤?或者這是與'&'同時運行這兩個程序的結果?

回答

0

程序死亡時,「分段錯誤」消息來自shell,而不是來自程序。重定向只適用於程序的輸出,而不適用於shell。該消息應該放入$ output變量中。如果$ rv是0並且$輸出中沒有任何內容,我懷疑你發生了什麼事情是錯誤的。我建議你寫一個簡單的測試程序,它只是沒有驗證這一點:

kill(0, SIGSEGV); 

順便說一句,你爲什麼不使用snprintf(),所以你不能在第一時間緩衝區溢出?

+0

沒有使用snprintf(),因爲我很蠢。我相當確定問題是打印超出了字符數組的邊界,因爲加倍分配修復了問題。我想$ rv可能不是0,因爲我同時執行兩個命令。你的意思是嘗試exec(「kill(0,SIGSEGV)」)? – jroz 2012-08-12 06:37:43

+0

不,我的意思是讓$ cmd中的程序成爲一個簡單的程序,它只是用分段錯誤自殺。 – Barmar 2012-08-13 15:00:32