2011-06-15 22 views
5

當運行在不潔模式一個Perl CGI腳本,我得到以下形式的錯誤源...找到一個Perl的污點模式錯誤

Insecure dependency in some_function while running with -T switch at (eval some_line) line some_other_line. 
Compilation failed in require at my-script.cgi line 39. 
BEGIN failed--compilation aborted at my-script.cgi line 39. 

我-script.cgi線39是使用聲明對於本身不使用eval或some_function的perl模塊,可能會使用另一個庫。 some_line和some_other_line行號在my-script.cgi或my-script.cgi的第39行中使用的庫中似乎沒有意義。

鑑於此錯誤,我如何追蹤發生污點錯誤的位置?

我已經嘗試設置一個新的芯片信號處理程序應打印堆棧跟蹤,即

$SIG{ __DIE__ } = sub { require Carp; Carp::confess(@_); }; 

但這似乎對錯誤沒有影響。也許這是一個錯誤的信號,陷入困境,不及早發生,或者需要更復雜的東西。

+3

通過圍繞我設法縮小問題,足以發現,在CGI.pm中的錯誤是我運行到特定問題的根本原因緩慢移動的模具聲明 - HTTP:// www.nntp.perl.org/group/perl.perl5.porters/2008/01/msg133691.html儘管如此,我仍然對追蹤這類問題的一般方法非常感興趣。 – 2011-06-15 05:28:43

+1

這就是爲什麼人們應該爲CGI使用CGI.pm(而不是「自己動手」)。通過對成千上萬的用戶(如你)進行壓力測試發現錯誤,並報告並修復錯誤。也很好地找到問題。 – DavidO 2011-06-15 05:39:22

回答

2

這幾天我使用Devel::SimpleTrace進行調試,最近我在使用Archive :: Zip時發現了一個問題。

但是,我不知道它是否會適用於您的情況,因爲它本質上是設置您使用的同一個sig處理程序。

+0

是的,它似乎沒有影響我害怕的輸出。 (還是)感謝你的建議。 – 2011-06-16 06:10:37

4

Carp::Always正常工作,異常檢查引發異常。示例輸出:

$ perl -MCarp::Always -T blah.pl 
Insecure dependency in sprintf while running with -T switch at blah.pl line 6 
     main::foo() called at blah.pl line 8 
     main::bar() called at blah.pl line 10 
+0

看起來像一個不錯的計劃,但我無法得到它的工作。將'-I the_carp_always_install_location -MCarp :: Always'添加到CGI的perl調用似乎沒有效果。可能它會直接在命令行上正常運行,正如你所展示的那樣,但是由於錯誤是通過POST文件上傳來觸發的,所以我必須弄清楚如何從命令行模擬這個錯誤。 – 2011-06-16 06:07:05

+0

http://p3rl.org/CGI#DEBUGGING – daxim 2011-06-16 07:39:47

+0

這看起來很方便,但除非我錯過了一些東西,它沒有說如何僞造文件上傳,只是普通的POST參數(除非有一些我不知道的方式發送一個實際上是文件上傳的POST參數)。看起來像這個線程可能會讓我的一些方式 - http://www.perlmonks.org/?node_id=667813 – 2011-06-20 05:46:48