0

nedmalloc のデバッグ機能を使用して、コード内の潜在的なメモリ リークを見つけようとしています。そこで、フラグENABLE_LOGGINGとをアクティブにしNEDMALLOC_TESTLOGENTRYます。

私のプログラムでは、システム メモリ プールのみを使用します。プログラムの最後で、neddestroysyspoolすべてのメモリ イベントをフラッシュするために関数を呼び出します。

まず、スタック トレース機能を有効にすることができません。この深さを変更すると、数回の割り当て後にプログラムがクラッシュします。VS2010 でコンパイルするには、自分自身を;DeinitSymの呼び出しで定義する必要がありました。CloseHandle私は正しくやっているといいのですが、うまくいきません。だから私はそれを使用しません。

したがって、ファイル nedmalloc.csv を解析するだけです。アドレスのおかげでソートし、割り当てられたサイズを合計し、解放されたサイズをアドレスから減算します。理由は不明ですが、いくつかの大きなチャンク (サイズ > 400kb) では、割り当て時に指定されたサイズは正しいのですが、解放時に指定されたサイズは異なり、割り当てられたサイズを超えています。たとえば、840352 バイトのブロックを割り当てましたが、解放すると記録されたサイズは 851932 バイトでした。正常ですか?

この問題に対する答えやヒントはありますか?

4

1 に答える 1

1

まず、メモリ リークの検出に nedmalloc のログ機能を使用するつもりはまったくありません。valgrind は、リソース リークを見つける非常に優れた方法です。valgrind を利用するために、正確に dlmalloc の代わりにシステム アロケータを使用するように nedmalloc にハックさえあります。

第二に、はい、スタック バックトレース コードは少し壊れやすい可能性があります。私の記憶が正しければ、パフォーマンスを大幅に向上させるために何か悪いことをしたのですが、パフォーマンスが十分に機能していませんでした。私は率直に言って、そのコード パスを使用したことはほとんどないので、適切にデバッグする理由はあまりありませんでした。私の目的には十分に機能しました。

第 3 に、より大きなブロックの場合、dlmalloc は、ブックキーピングを含む割り当てを 64Kb の倍数に切り上げます。そのため、12 チャンク割り当ては 13 チャンク割り当てに変わることが予想されます。

最後に、nedmalloc の作成者として、Windows 7 以降、3.x カーネルを搭載した Linux、過去 3 年間に作成された Mac OS X では nedmalloc を使用しないことをお勧めします。なんで?システムアロケータはおそらく十分であり、個人的には何年もの間 nedmalloc を必要としていなかったので、コードが少し腐っていることを率直に認めます。

それが役立つことを願っています。

ニール

于 2013-12-04T22:32:53.513 に答える