2012-08-05 47 views
2

我真的很喜歡使用Firebug來調試我的JavaScript代碼,HTML DOM和網絡加載,即:關於Web開發的所有客戶端。是否有像服務器端Perl/CGI的Firebug調試工具?

服務器端的情況並不那麼明朗。我正在使用的應用程序使用Perl和強制性標準模塊,如CGIDBI。我知道standard troubleshooting techniques,但似乎沒有調試工具可以跟蹤例如數據庫查詢或函數調用,並給我很好的輸出。

輸出必須特別是不能僅僅在stdout(想象Content-Type: application/json)或標準錯誤(通過錯誤日誌grepping是相當不舒服)猛拉,該工具不應該要求我手動猴子補丁的東西到核心模塊或灑use Data::Dumper; print '<pre>',Dumper($foo),'</pre>'通過 - 沒有代碼。

長話短說:有沒有一種工具可以讓Perl/CGI的服務器端調試與Firebug在客戶端上一樣有趣?

回答

7

是有,但他們依靠Plack。 Plack是一個位於Web框架和Web服務器之間的層。 Plack平滑了服務器的差異,並提供了一個地方plug in all sorts of debugging tools。這些信息包括數據庫profiletrace,您可以write your own debugging panels。還有一個interactive debugger,雖然我沒有使用它自己。

現在很多Perl Web框架(例如Catalyst和Dancer)都使用Plack,但是如果你使用直接的Perl和CGI,你就不會得到它。幸運的是,在Plack上運行CGI應用程序非常簡單。可以是replace CGI with a subclass that uses Plackwrap your CGI code in an emulation layer

轉換爲普拉克有很多的優勢超越了調試工具,這是非常值得的努力。

+0

+1,因爲PSGI/Plack是現代化的方式。我真的很喜歡[Enbugger](https://metacpan.org/module/Enbugger),它允許在運行時加載調試器。 – 2012-08-06 03:05:31

+0

Plack :: Middleware :: Debug看起來不錯,但仍然存在這樣的問題,即它只處理'Content-Type:text/html',因爲它處理了「STDOUT」。 – 2012-08-06 13:43:40

+0

@StefanMajewsky是的,你必須暫時改變內容類型。否則,它將不得不是一個瀏覽器插件,我不知道任何要調試的服務器端代碼。 – Schwern 2012-08-07 01:12:34

6

不,不是真的。

事情你可以做的是:

與調試代碼灑上你的代碼。

use constant DEBUG => 1; 
...; 
debug_function($var) if DEBUG; 

一旦您取消設置進行部署DEBUG不斷,你不會有任何額外的費用運行時(在報表會被優化掉),你可以隨時neccessary重新激活它們。

,你甚至可以說喜歡

BEGIN {require Data::Dumper if DEBUG} 

有條件負荷調試模塊邪惡的東西。

如果你想覆蓋核心函數,爲什麼不添加調試處理程序?這不是邪惡的補丁,這是增加...

BEGIN { 
    if (DEBUG) { 
     my $oldfunction = \&CORE::function; 
     *CORE::function = sub { # add prototypes if you like them 
     debug_handler(@_); 
     &$oldfunction; 
     }; 
    } 
} 

使用此技術將您的調用登錄到您的數據庫。

您可以重新打開STDERR一些特殊的文件(或管道,或終端,或......)

BEGIN { 
    if (DEBUG) { 
     close STDERR or die "STDERR hates me and doesn't want to be closed."; 
     open STDERR, '>', "/path/to/my/error/log.file" or die "couldn't open error log"; 
    } 
} 

您可以定義DIEWARN處理程序做一些想:

$SIG{__WARN__} = sub { 
    print MYERRORS "There was a warning: $!"; 
    # do additional error handling unless you're paranoid 
} 

warnings編譯可以幫助你做出了重要的警告致命的:

use warnings qw(FATAL importantWarning); 

,或者創建自己的警告,只看到文檔

而獲得調用堆棧跟蹤,窺視caller功能的多種可能性。從本質上講,您可能希望構建您對Carp模塊的個人解釋,因爲CGI::Carp可能無法滿足您的需求。

+1

更正:'print'不能被覆蓋。見例如http://stackoverflow.com/a/3678957/334761 – 2012-08-05 16:42:23

+0

@StefanMajewsky謝謝你的提示,我做了我的例子通用。 – amon 2012-08-05 16:50:20

1

除上述之外,還可以查詢Devel::LTrace,它可以告訴你什麼時候調用了指定的子例程,以及Devel::CallTrace,它可以告訴你什麼時候在什麼地方調用子程序。

相關問題