2013-03-08 8 views
11

編集:本当にバグを見つけていただきありがとうございます。しかし、見つけたり、再現したりするのが難しいかもしれないので、一般的なデバッグヘルプも非常に高く評価されます!私を助けてください! =)Pythonメモリフォールトをデバッグするには?

編集2:コードをコメントアウトして編集します。

編集3:lxmlが原因ではないようですね、ありがとう!完全なスクリプトはhereです。私は参照を探してそれを調べる必要があります。彼らはどんな見た目ですか?

編集4:実際にそれのparse_og一部、スクリプトが停止し、この中で(100%を行きます)。だから編集3は偽です - 何とかlxmlでなければなりません。

編集5 MAJOR EDIT:デビッド・ロビンソン、以下TankorSmashによって示唆されるように、私は野生のループでlxml.etree.HTML(data)をお送りしますdataコンテンツの種類を見つけました。 (私はうっかりそれを無視し、私はデバッグの余分な2日間の曲に価格を支払ってきたように私の罪が贖わ見つける;!)A working crashing script is here.(Also opened a new question.)

編集6:判明これはバグですlxmlバージョン2.7.8以下( 以上)。 Updated to lxml 2.9.0、バグがなくなった。上の上級者にも感謝this follow-up question.

私はこの奇妙な問題をデバッグする方法がわかりません。 以下のコードは、RAMが突然完全にいっぱいになる(約100MBの間に200MBから1700MBに達した後、メモリがいっぱいになると、ブルーの待機状態になる)約5分間正常に実行されます。

以下のコード、具体的には最初の2行が原因です。それは確かだ。しかし、何が起こっているのですか?この行動を説明できるものは何でしょうか?

def parse_og(self, data): 
    """ lxml parsing to the bone! """ 
    try: 
     tree = etree.HTML(data) # << break occurs on this line >> 
     m = tree.xpath("//meta[@property]") 

     #for i in m: 
     # y = i.attrib['property'] 
     # x = i.attrib['content'] 
     # # self.rj[y] = x # commented out in this example because code fails anyway 


     tree = '' 
     m = '' 
     x = '' 
     y = '' 
     i = '' 

     del tree 
     del m 
     del x 
     del y 
     del i 

    except Exception: 
     print 'lxml error: ', sys.exc_info()[1:3] 
     print len(data) 
     pass 

enter image description here

+1

私たちもコードをテストできるように、HTMLの 'data'をリンクできますか? – TankorSmash

+0

'data'はそこのHTML文書の最初の5000バイトです。 – knutole

+1

難しいことではありませんが、さまざまなページで試してみましたが、どのデータを渡しても問題ありません。 – TankorSmash

答えて

3

Low-level Python debugging with GDBを試すことができます。おそらく、Pythonインタプリタやlxmlライブラリにバグがあり、余分なツールがなくてもそれを見つけるのは難しいでしょう。

CPU使用率が100%になったときにgdbで実行されるスクリプトを中断し、スタックトレースを見ることができます。おそらく、スクリプト内で何が起こっているのかを理解するのに役立ちます。

2

それが生きている文書を保ついくつかの参照によるものでなければなりません。 xpath評価の文字列結果には常に注意する必要があります。 Nonetreemに割り当てましたが、yxiには割り当てられていません。

xiにもNoneを割り当てることができますか?

+0

ありがとう!ちょうどそれを試した。申し訳ありませんが、同じ結果。 – knutole

+1

これらのすべてで 'del'を使ってみましたか? –

+0

ええ、運はありません。ありがとうございました!更新された質問。 – knutole

2

ツールは、メモリの問題を追跡するときにも役立ちます。私はguppyが非常に便利なPythonのメモリプロファイリングと探査ツールであることを発見しました。

良いチュートリアルやドキュメントがないために始めるのが最も簡単な方法ではありませんが、いったん把握すれば非常に便利です。機能私は使用する:必要に応じて

  • 強力、かつ一貫したライブデータを示し、使用量をグラフ化するための

    • (ソケットを介して)リモートメモリプロファイリング
    • 基本的なGUIを、Pythonでデータの使用を探索するためのインターフェイスシェル
  • +0

    ありがとうございました。このツールで「紛失した」参考文献を見つけることができますか? – knutole

    +1

    @knutole:ある程度の努力で、はい。メモリ状態(問題の原因と思われるトリガの前と後)のスナップショットを取って比較することができます。あなたはただの変化だけを見ることができます。そこから、グローバルスコープと目的のオブジェクトとの間の最短経路を得ることができます。 – RobM

    関連する問題