2016-10-24 9 views
3

私のアプリケーション内でメモリリークをデバッグしようとしています。リークしたオブジェクトは、(ヒープを破棄する前に)識別するのがやや難しく、多くの同様のオブジェクトが作成されています。セッションごとに同じアドレスを使用する場合は、かなり簡単になります。そのため、実行可能ファイルのリンカープロパティで/FIXED/DYNAMICBASE:NOを使用してASLRを無効にしようとしています。MSVC2015の固定ベースアドレス

しかし、これは望ましい結果を達成していないようですが、そのアドレスは毎回異なります。さらに、mainargvのアドレスであっても、セッションごとに異なる。私が設定する必要があるいくつかの追加パラメータがありますか、または私は何とかこれらのフラグの目的を誤解していますか?

+1

あなたのリークを見つける最良の方法は、WindowsのCrtデバッグ機能を使用することです。 https://msdn.microsoft.com/en-us/library/x98tx3cf.aspx – BitTickler

+0

@BitTickler - 私はすでに死体を漏らしたオブジェクトを知っています(CRTダンプが教えてくれるのと同じように - 私は似たようなことがありますリークレポーティングシステム)、しかし、私はオブジェクトが割り当てられているとき(そして参照されるとき)オブジェクトを識別したいので、割り当てアドレスを一定にする必要があります。 – MuertoExcobito

+1

Crtデバッグ機能を使用すると、いくつかの非常に便利なことができます。同様に、オブジェクトの割り当て番号にブレークポイントを設定します。ですから、最初にcrtを使って問題を引き起こす割り当てを特定し、次の実行でそれを打ち破ることができます。これは通常、成功への私の道です....それと、単体テストの書き方...私はそれが実際のシステムで論理的な誤りを見つけるのはかなり時間の無駄だと考えているからです。スレッディングに関連する問題がある場合は、時にはそれがあなたのできることです。 – BitTickler

答えて

4

あなたはデータアドレスを見ています。 ASLRは主にコード用です。 EXEおよびDLLコードセグメントのロード先を決定します。

メモリ割り当てを制御するためにoperator newをオーバーライドし、定義済みのベースアドレスを使用してVirtualAllocを使用して、割り当てをより決定性にすることができます(ただし、マルチスレッド競合状態も可能です)。または、MSVCのデフォルトヒープデバッグ機能を使用して、アドレスではなくシーケンス番号でブロックを識別します。

関連する問題