2010-03-02 47 views
5

我的一個帶有調試Perl代碼的pet peeves(在命令行debbugger中,perl -d)是錯誤地打印(通過x命令)一個巨大數據結構的內容被保證凍結將您的終端永遠打開一半,同時打印100頁的數據。尤其是如果這種情況發生在緩慢的網絡上。限制Perl調試器打印的信息量

因此,我希望能夠限制x打印的數據量。

我看到兩種方法 - 如果有人知道該怎麼做,我會願意嘗試。

  1. 限制調試器打印任何單個命令的數據量。

  2. 更好的是,用某種自定義的Perl方法(它會計算數據結構的「大小」,並拒絕打印它的內容而無需確認)替換內置的x命令。

我專門問:「如何使用自定義的代碼替換x」 - 建立一個足夠好「是數據結構太大」 Perl的方法是我可以對我自己做很可能沒有太多的精力,雖然我看到足夠的陷阱阻止了「完美」的人做出相當令人沮喪的努力。哎呀,只是做Data :: Dumper->轉儲和取出字符串的長度可能會有訣竅:)

請注意,我完全清楚如何通過遞歸檢查數據結構層來手動避免此問題(例如,打印ref,打印鍵/數組元素的數量等)...整個過程就是我想避免不經意間打字x $huge_pile_of_data,或者想着一個bug,數據轉化爲什麼應該是標量。

+0

我經常用在你的問題中提到的簡單的方法,加入這個子程序的代碼我調試:'子XX {使用數據::自卸車;打印Dumper(@_)}'。然後我在調試器中使用'xx $ foo'而不是'x $ foo'。正如你所說,一個人可以通過在打印之前檢查長度來使'xx()'更全面。 – FMc 2010-03-02 16:50:08

+0

@FM - 但是這假設你知道$ foo很大是有先見之明的。我的整個問題都是偶然的。 – DVK 2010-03-02 17:05:42

+0

我的建議並不要求你假設任何關於'$ foo'的事情。相反,它需要改變習慣:始終使用'xx',而不是'x' - 主要是因爲'Data :: Dumper'的輸出比'x'的輸出更好,但也是因爲使用你的自己的轉儲子程序可以很容易地根據手頭問題的需要定製行爲。當然,只是一個想法。 – FMc 2010-03-02 17:48:58

回答

8

調試器中的|命令會將另一個命令的輸出傳遞給傳呼機,例如

 DB<1> |x %huge_datastructure
11

x命令採用可選參數來顯示最大深度。這與將數據量限制爲N頁不完全相同,但它對於防止過載絕對有用。

DB<1> %h = (a => { b => { c => 1 } }) 

    DB<2> x %h 
0 'a' 
1 HASH(0x1d5ff44) 
    'b' => HASH(0x1d61424) 
     'c' => 1 

    DB<3> x 2 %h 
0 'a' 
1 HASH(0x1d5ff44) 
    'b' => HASH(0x1d61424) 

您可以指定通過o命令打印的默認深度。

DB<1>o dumpDepth=1 

將其添加到您的.perldb文件中,以將其應用於所有調試程序會話。

否則,它看起來像x命令調用DB::dumpit()這僅僅是用於dumpval.pl(或者,更具體地,main::dumpValue()子它定義​​)的包裝。您可以根據需要修改/替換該腳本。不過,我不確定你會如何使它互動。