2008-10-08 30 views
5

我有一個web應用程序,當數據庫重新啓動並且它試圖使用舊連接時發生segfaults。 gdb --args apache -X下運行它會導致下面的輸出:在mod_perl下的MySQL驅動程序segfaulting - 在哪裏尋找問題

Program received signal SIGSEGV, Segmentation fault. 
[Switching to Thread -1212868928 (LWP 16098)] 
0xb7471c20 in mysql_send_query() from /usr/lib/libmysqlclient.so.15 

我檢查的驅動程序和數據庫都是最新的(DBD::mysql 4.0008時,MySQL 5.0.32-Debian_7etch6日誌)。

煩人我不能跟一個平凡的腳本重現此:

use DBI; 
use Test::More tests => 2; 

my $dbh = DBI->connect("dbi:mysql:test", 'root'); 

sub test_db { 
    my ($number) = $dbh->selectrow_array("select 1 "); 
    return $number; 
} 

is test_db, 1, "connected to db"; 

warn "restart db now"; 
getc; 

is test_db, 1, "connected to db"; 

其中給出以下幾點:

ok 1 - connected to db 
restart db now at dbd-mysql-test.pl line 23. 

DBD::mysql::db selectrow_array failed: MySQL server has gone away at dbd-mysql-test.pl line 17. 
not ok 2 - connected to db 
# Failed test 'connected to db' 
# at dbd-mysql-test.pl line 26. 
#   got: undef 
#  expected: '1' 

這種行爲正確,告訴我請求失敗的原因。

什麼讓我感到遺憾的是,它是分割的,它不應該這樣做。由於它只在整個應用程序運行時纔會發生(使用DBIx::Class),因此很難將其降至測試用例。

我應該在哪裏開始調試呢?有沒有人看過這個?

UPDATE:進一步推動顯示它在mod_perl下是一個紅色的鯡魚。把它簡化爲一個簡單的測試腳本,我現在發佈到DBI mailing list。感謝您的回答。

回答

3

這可能意味着你的mod_perl環境和你通過腳本測試的環境是有區別的。有些事情要檢查:

  • 是你的mod_perl與相同版本的Perl編譯

  • 是@ INC的上是相同的

  • 你在你的mod_perl安裝使用線程?我不相信DBD :: mysql是完全線程安全的。

2

我已經看到了這個問題,但我不確定它是否與您的原因相同。您是否偶然使用某個模塊從您的應用程序發送郵件(忘記了名字,抱歉)?當我們在一個項目中遇到問題時,經過幾天的調試後,我們發現這個郵件模塊在打開文件描述符時做了一些奇怪的事情,然後分離出另一個稱爲控制檯工具sendmail的進程,這又對文件描述符做了一些奇怪的事情。我想其中的一個文件描述符是與數據庫的連接,但我仍然不確定。當我們切換到另一個模塊發送郵件時,問題消失了。也許它也值得一看。

+0

否 - 它似乎是DBD :: mysql或mysql客戶端二進制文件的問題。謝謝,雖然:) – EvdB 2008-10-10 08:40:48

2

如果你遇到段錯誤,你有核心文件嗎?如果沒有,請檢查ulimit -c。如果它返回0,你的系統將不會創建核心文件,你將不得不改變它。如果你有一個核心文件,你可以使用gdb或類似的工具來調試它。這不是特別的樂趣,但它是可能的。該命令的開始看起來像:

gbd /usr/bin/httpd core 

有很多散落在Web上debugging core files教程。

更新:剛剛爲ensuring you get core dumps from mod_perl找到了參考。這應該有所幫助。

+0

感謝指針 - 我最終減少到一個小測試腳本並張貼到DBI郵件列表(請參閱問題的鏈接)。 – EvdB 2008-10-10 08:51:31

相關問題