2011-06-14 148 views
16

當我的開發盒(Linux Mint)上的PHPUnit測試正常失敗時,它會在我的連續集成盒(Centos)上導致「分段錯誤」。兩臺機器都運行相同版本的PHPUnit。我的開發盒運行PHP 5.3.2-1ubuntu4.9,CI是PHP 5.2.17。儘管如此,我寧願將PHP升級爲最後的手段。PHPUnit分段錯誤

按照此線程:PHPUnit gets segmentation fault 我試過去激活/重新安裝Xdebug。我沒有inclue.so安裝。

在配置框上,我目前只有兩個擴展活動:php-xml(phpunit需要)和memcache(我的框架需要)的dom,所有其他都已關閉。

+1

請你展示如何調用PHPUnit的。你有沒有嘗試過程隔離? – hakre 2011-06-14 12:52:53

+0

內存不足? – powtac 2011-06-14 12:53:22

+0

@hakre - 是的,我已經嘗試過程隔離,我得到的所有錯誤都是由於我的框架未正確實例化。我只是簡單地從命令行調用它:phpunit quiz_service_Test.php – 2011-06-14 12:55:35

回答

21

除了cweiske的建議之外,如果升級PHP不適合您,並且您有找到segfault源的問題,您可以使用調試器來了解更多信息。

可以啓動GDB這種方式來調試PHPUnit的會話:

gdb --args php /usr/bin/phpunit quiz_service_Test.php 

然後輸入r先運行程序和/或設置環境變量。

set env MALLOC_CHECK_=3 
r 

您也可以考慮在系統上安裝PHP的調試符號以獲得更好的調試結果。 gdb會在啓動時爲你檢查,並留下一個通知你如何做到這一點。

+0

謝謝,這幫助我縮小範圍。我們從服務器獲取的數據對於pcre來說太大了。 – 2011-06-14 13:58:06

+0

好的。您可以限制它,以便preg _...不會segfault,但也不會完全執行(如果失敗,通常會返回NULL)。 [查看pcre的ini設置](http://php.net/manual/en/pcre.configuration.php)。 – hakre 2011-06-14 13:59:58

6

當您遇到段錯誤時,請將您的PHP升級到最新版本。不僅是你的軟件包管理器中的最新版本,而且是php.net上的最新版本。如果它仍然存在段錯誤,那麼您確定該問題在PHP本身中尚未得到修復。不要打擾在老版本的PHP中擺脫段錯誤,因爲它可能已經被更新了。

下一步是定位問題:讓你的測試越來越小,直到你不能刪除任何東西(但它仍然是段錯誤)。如果你有這個問題,把測試移動到一個獨立的php腳本中。現在你有一個PHP錯誤跟蹤器中的bug的測試腳本。

14

我遇到了PHPUnit segfaulting的問題,並且無法找到答案,所以希望這可以幫助稍後出現相同問題的人。

PHPUnit的是段錯誤,但僅限於:

  • 如果有錯誤(或多個)
  • 所有的測試都運行後,但被印刷前的錯誤

後而我意識到這是由於使用數據提供者的測試失敗,特別是數據提供者傳遞帶有大量遞歸引用的對象的原因。一聲鍾終於熄滅了,我做了一些挖掘:問題在於,當您使用數據提供程序並且測試失敗時,PHPUnit會嘗試創建一個提供的失敗描述參數的字符串表示形式,以告訴您什麼失敗了,但是這當其中一個參數有一些無限遞歸時是有問題的。實際上,PHPUnit在PHPUnit_Framework_TestCase::dataToString()(第1612行左右)中的功能是使用print_r打印數據提供者提供的所有參數,當PHP嘗試創建無限遞歸對象的字符串表示形式時會導致段錯誤。

我來的解決方案是:

  1. 用我所有的測試類單基類(幸好我已經在做)
  2. 覆蓋dataToString()在我的測試基類,以檢查這些數據數組中的各種對象(在我的情況下可能是這樣,因爲我知道這些對象是什麼樣的)。如果對象存在,我會返回一些特殊的值,如果不是,我只是將它傳遞給父方法。
+1

實際上幫了很多。一種更好的方法是在測試本身中創建數據結構,並在dataprovider中創建純數據(這對我來說很有用) – 2013-01-21 16:50:26

0

我陷入了同樣的問題。我將PHPUnit升級到4.1版本(運行測試),它能夠向我展示Isaac指出的對象。

所以,如果你遇到這個問題,升級到PHPUnit> = 4.1,你將能夠看到錯誤,而不是得到「Segmentation fault」消息。

0

運行帶代碼覆蓋率的PHPUnit時,我不斷收到Segmentation fault: 11。做分段錯誤的堆棧跟蹤後,我發現這是導致分段錯誤如下:

Program received signal SIGSEGV, Segmentation fault. 
0x0000000100b8421a in xdebug_path_info_get_path_for_level() from /usr/lib/php/extensions/no-debug-non-zts-20121212/xdebug.so 

我取代我現在的xdebug.so在上述路徑從Komodo Remote Debugging Package的子文件夾中的最新版本相應的下載包與我有的PHP版本(對我來說是5.5),一切正常。

0

以下固定一個類似的問題,我(當gdb回溯的輸出包括libcurl.solibcrypto.so):

禁用/etc/php.d/pgsql.ini

; Enable pgsql extension module 
; extension=pgsql.so 

編輯/etc/php.d/curl.ini確保pgsql.so被捲曲之前包括:

; Enable curl extension module 
extension=pgsql.so 
extension=curl.so 
curl.cainfo=/home/statcounter/include/config/cacert.pem 
6

我h廣告類似的問題,在

PHPStorm => Edit configuration => Interpreter option : -d zend.enable_gc=0

禁用garbge collactor或者,如果你在命令行運行測試,你可以嘗試添加:

-d zend.enable_gc=0

-1

這與代碼不相關。在我來說,我有這兩個文件

  1. 測試用例
  2. 實例測試

測試用例有方法稱爲createApplication。只是把它留空。
實例測試您可以創建方法並用 $這個 - > assertTrue(TRUE)

以上是基本的設置希望,因爲你需要,你可以擴展的要求填寫。

1

我有同樣的問題,可以釘下來,我試着寫這是不definied類變量:

我的類(這是一個CakePHP的類)造成分段錯誤:

class MyClass extends AppModel { 

    protected $classVariableOne; 

    public function __construct($id = false, $table = null, $ds = null) { 
    parent::__construct($id, $table, $ds); 

    $this->classVariableOne =& ClassRegistry::init('ClassVariableOne'); 

    // This line caused the segmentation fault as the variable doesn't exists 
    $this->classVariableTwo =& ClassRegistry::init('ClassVariableTwo'); 

    } 
} 

我固定它通過添加第二個變量:

class MyClass extends AppModel { 

    protected $classVariableOne; 
    protected $classVariableTwo; // Added this line 

    public function __construct($id = false, $table = null, $ds = null) { 
    parent::__construct($id, $table, $ds); 

    $this->classVariableOne =& ClassRegistry::init('ClassVariableOne'); 
    $this->classVariableTwo =& ClassRegistry::init('ClassVariableTwo'); 

    } 
}