2015-08-15 61 views
7

所以,這是一個有點簡單化情況下 - 但如果我設置了這樣一個循環引用:尋找「丟失」的變量(循環引用)

#!/usr/bin/perl 
use strict; 
use warnings; 

{ 
    my $thing; 
    my $otherthing; 
    $thing -> {otherthing} = \$otherthing; 
    $otherthing -> {thing} = \$thing; 
} 

我創建了一個內存泄漏 - 因爲引用計數,這裏分配的內存將永遠不會被釋放,儘管沒有任何外部「接入點」。

所以我想知道 - 在這種情況下,有沒有什麼辦法我可以 - 通過調試或類似 - 「找回」這些變量並重新獲得對它們的訪問?

假設我正在考慮一個不太平凡的案例 - 你有一個內存泄漏的對象,但想'再次'看看它裏面有什麼,給出一個提示,因此問題開始的地方。

+0

我知道http://search.cpan.org/~lds/Devel-Cycle-1.10/lib/Devel/Cycle.pm和http://search.cpan.org/~ilyaz/Devel- Peek-0.96/Peek.pm都可以幫助解決這些問題,但是當變量超出範圍並丟失時,我從未使用它們,因此我不知道它們在這些情況下是否有用。值得一看 – stevieb

+0

也許[Devel :: LeakTrace :: Fast](https://metacpan.org/pod/Devel::LeakTrace::Fast)? – ThisSuitIsBlackNot

+0

https://metacpan.org/pod/Devel:: Gladiator,https://metacpan.org/pod/Devel::MAT::Dumper,'pmat-explore-gtk' – melpomene

回答

5

這只是一個關於該問題的意見建議模塊的策展。它包括一個鏈接到每個模塊的POD文件,並且引用名稱描述部分。它意味着可以訪問。無處有我添加或更改的作者寫什麼,或從其他任何地方拉到信息比名稱和說明部分

歡迎任何人,只要他們保持這種格式附加模塊來更新它。另外,任何人都可能會提請我注意它需要更新的事實,並且我會在我能夠這樣做的時候這麼做

許多優秀的程序員對英語不太好,所以儘管我已經嘗試引用文檔,我已經砍了我認爲是不太相關的部分在這篇文章

Devel::Cycle的目標一致 - 查找對象

存儲週期這是一個簡單的開發者尋找對象和其他循環引用工具參考類型。由於Perl基於引用計數的內存管理,循環引用會導致內存泄漏。

Devel::LeakTrace::Fast - 指明泄露變量的來源。

Devel::LeakTrace::FastDevel::LeakTrace重寫。像Devel::LeakTrace它使用在Perl 5.6及更高版本,以跟蹤正在運行的程序的SV分配發現可插拔runops功能。

END時間Devel::LeakTrace::Fast標識任何剩餘的變量,並報告出現的線路。

Devel::Gladiator - 走Perl的舞臺

Devel::Gladiator迭代Perl的內部內存結構,可用於枚舉所有目前居住的SV。

這可以用於狩獵泄漏和剖析內存使用情況。

Devel::MAT::Dumper - 寫堆轉儲文件供以後分析

該模塊提供用於創建其可隨後通過Devel::MAT::Dumpfile讀取的堆轉儲文件存儲器傾銷功能。它提供了一個不導出的單個函數,它將文件寫入給定的路徑。

轉儲文件將包含Perl競技場中每個SV的表示形式,提供有關它們之間指針的信息以及有關創建時進程狀態的其他信息。它包含當時過程的快照,稍後可以使用Devel::MAT::Dumpfile通過各種工具加載和分析。

Devel::Peek - 爲對XS程序員

Devel::Peek包含功能,其允許原料的Perl數據類型到從Perl腳本進行操作的數據的調試工具。這被那些做XS編程的人用來檢查他們從C發送到Perl的數據看起來是否應該看起來像。