2013-04-19 7 views
7

私はバグのある(メモリリークされた)ソフトウェアを持っています。 証拠として、私は1GBのcore.dumpファイルを持っています。ヒープサイズは900MBなので、明らかに何かが割り当てられますが、メモリは解放されません。gdb、ダンプメモリ、フォーマットされた出力をファイルに保存

私はこのように調べるメモリ領域を持っています。

(gdb) x/50000s 0x200000000 

ただし、これはオブジェクトや構造体が解放されていない肉眼では推測しにくいです。 私の考え方は、「gdb形式の出力をファイルに保存し、パターンマッチを実行して、どのマジック文字列が最大になるかを調べる」というものです。だから私の質問です:

私はアナライザーを書くことができるように、テキストファイルに次のコマンドの出力を保存する方法は?

(gdb) x/10000000s 0x20000000 <-- I need this output into a file 

ありがとうございました。

答えて

7

私はアナライザーを書くことができるように、次のコマンドの出力をテキストファイルに保存するにはどうすればよいですか?

実際には非常に簡単です
(gdb) x/10000000s 0x20000000 

(gdb) set height 0 # prevent GDB from stopping every screenfull 
(gdb) set logging on # GDB output is now also copied into gdb.txt 
(gdb) x/10000000s 0x20000000 
(gdb) quit 

ほら、gdb.txtであなたの出力をお楽しみください。

私はバギー(メモリリーク)ソフトウェアを持っています。 ... "gdb形式の出力をファイルに保存し、パターンマッチを実行して、どのマジック文字列が最大になるかを確認してください。"

この考えは、満足のいく結果をもたらすことは考えにくいです。考えてみましょう:

void some_function() { 
    std::vector<string> *v = new std::vector<string>(); 
    // code to insert and use 1000s of strings into "v". 
    return; // Oops: forgot to delete "v". 
} 

あなたが効果的にあなたはすべての文字列をリークしていることを発見するでしょう、「最もまで来る魔法の文字列を参照してください」ができたとしても、彼らはではない問題は、漏れ "v"が問題です。

あなたが本当に望むのは、割り当てられた領域が他の割り当てられた領域を指しているグラフを作成し、そのグラフの「ルート」を見つけることです。これは手作業ではほとんど不可能です。

だからは何ですか?あなたはメモリリークを見つけるのに役立つでしょうか?

  • ...などなど

    • Valgrindを、
    • Googleのヒープがchecker漏れる、
    • jemalloc、:幸いにも、あなたのためにこの問題を解決することができたくさんのツールのがあります
  • +0

    を書くログ に表示されますことを行います。 も参照してください。https://sourceware.org/gdb/onlinedocs/gdb/Dump_002fRestore-Files.html – Alex

    16

    あなたは、GDBの機能を "ダンプ" を参照してください使用することができますhttps://sourceware.org/gdb/onlinedocs/gdb/Dump_002fRestore-Files.html

    ご例えば:

    dump binary memory result.bin 0x200000000 0x20000c350 
    

    これはあなたにプレーンバイナリダンプint型のファイルresult.binを与えるだろう。また、進形式でそれをダンプするために、以下を使用することができます。dumpコマンドを使用して

    dump ihex memory result.bin 0x200000000 0x20000c350 
    

    は(さえ何とか私のために動作しませんでした)gdbのロギングハックを使用するよりも、はるかに明確です。

    0

    あなたが書くことができ、簡単なLKMは

    lkm: 
    #include <linux/kernel.h> 
    #include <linux/module.h> 
    
    int *ptr=(int*)0Xc18251c0; //the address you want to read from kernel space 
    int module_i(void) 
    { 
    printk("%d\n",*ptr); 
    } 
    module_init(module_i); 
    

    とデータは非常に専用のダンプコマンドは、GDBでもあり

    enter code here 
    dmesg 
    
    +0

    これを行うには、/ dev/kmemまたは/ proc/kcoreを使用します。さらに、これは質問に答えません。 – minmaxavg

    関連する問題