2012-05-08 20 views
6

プログラムでアクセス違反を追跡する際に問題が発生しました。デストラクタが3回目に呼び出されたときに発生します。デストラクタが終了するように見えるときです。C++アクセス違反を追跡するためのアドバイスはありますか?

私はこれを追跡しようと数時間を費やしてきたので、できることについてさらにアドバイスを求めています。 newdeleteの演算子でクラスインスタンスを作成しています。 Visual Studioの出力ウィンドウが表示さ:

First-chance exception at 0x60e3ad84 (msvcp100d.dll) in WebCollationAgent.exe: 0xC0000005: Access violation writing location 0xabababab. Unhandled exception at 0x60e3ad84 (msvcp100d.dll) in WebCollationAgent.exe: 0xC0000005: Access violation writing location 0xabababab.

は私がしようとすると、それらのメモリ位置にあったかを調べるために何かできることはありますか? !

Program.exe!Network::`scalar deleting destructor'() + 0x2b bytes C++ 

Program.exe!std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::~basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >() Line 754 + 0xf bytes C++ 

Program.exe!std::_String_val<wchar_t,std::allocator<wchar_t> >::~_String_val<wchar_t,std::allocator<wchar_t> >() Line 478 + 0xb bytes C++ 

msvcp100d.dllのstd :: _ Container_base12 :::

コールスタックウィンドウには、次の(私は、年代順にして最古の最新それを貼り付けてきたように逆の順序で)を示し、 _Orphan_all()行214 + 0x5バイトC++

この情報には、問題の原因となる文字列変数があります。誰もこの情報を解釈する助言をしていますか?

その他のアドバイスもありがとうございます。

私はWindows 7でVisual Studio 2010 Professionalを使用してコーディングしています。

+2

[valgrind](http://valgrind.org/) – dasblinkenlight

+1

0xABABABABは、ガードバイトとしてHeapAllocによって使用されます。どこかでメモリが壊れている可能性があります。 http://asawicki.info/news_1292_magic_numbers_in_visual_c.html –

+0

@dasblinkenlight Valgrindほど涼しく、Windowsをサポートしていません。 – cgmb

答えて

3

BoundsChecker (now part of Borland DevPartner)を使用する前に、メモリのバグを追跡することに成功しました。助けてくれる同様の製品がいくつかあります:HeapAgentRational Purifyです。これらはValGrindとよく似ているようですが、Windows上で動作します。ここで

を助けるかもしれない3つのオープンソースの代替です:

  1. DUMA(その様子では、Windows自身のためにそれを構築する必要がありますが、READMEを行う上で、いくつかの注意事項が含まれています)

  2. XMEM

  3. elephant

これらはどのように動作するのかわかりませんが、非常に有望で、Windows上で動作するように見えます。

Microsoft page on managing memory errorsも役立ちます。また、データが最初に削除または変更されるタイミングを知るのに役立つメモリブレークポイントの設定へのリンクもあります。がんばろう!

+0

これらのリンクは面白そうですが、私はこれを解決するために新しいソフトウェアを購入する必要はありません。 – Interminable

+0

私のプロジェクトは1週間以内に予定されているので、このコードを数日でまとめておきたい。オペレーティングシステムをインストールする余裕がない。IDEに慣れていないと思う。私が経験している問題を解決することが保証されていないデバッグソフトウェアを使用するために、申し訳ありません。編集:このコメントに返信していたコメントは消えたようです。 – Interminable

+0

BoundsCheckerリンクが無効です – TankorSmash

2

Microsoftヒープデバッグ用のものを使用して、あなたの設計がそのケースの1つであることを願ってください。その後、Purifyは次のステップになります。

これはVisual Studioに組み込まれており、場合によっては役立ちます。それが動作すれば、PurifyにはIBMに2〜3ポケットの現金を払ってもらうことができます。

あなたは情報here

TLを見つけることができ、それがあまりにも遅い実行している場合、メインでDR は、この

 
int tmpFlag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); 
// Turn On (OR) - Keep freed memory blocks in the 
// heap's linked list and mark them as freed 
tmpFlag |= _CRTDBG_DELAY_FREE_MEM_DF; 

// Turn on memory checking at each heap operation 
tmpFlag |= _CRTDBG_CHECK_ALWAYS_DF; 

// Set the new state for the flag 
_CrtSetDbgFlag(tmpFlag); 

を行うあなたは、異なる場所に_CRTDBG_CHECK_ALWAYS_DFフラグを切り替えることができます。しかし、問題が発生した場所を知るために、各ヒープ操作をチェックして数回実行します。

1

私はあなたがする必要がある主なものは、バグとコードがスタックにある間に発生するクラッシュまたは例外を取得することですいくつかのヒント

http://www.atalasoft.com/cs/blogs/loufranco/archive/2007/02/06/6-_2200_Pointers_2200_-on-Debugging-Unmanaged-Code.aspx

でこのブログを書いています。バグのコードが実行されて返された後、アクセス違反が発生することが多くあり、実際には(コンピュータ時代の)後で長い時間がかかることがあります。その場合、それを理解することはほとんど不可能です。

ヒントが破損していることを強く示していますが、C++の2つの一般的な理由は、配列の削除を二重にして混乱させることです(delete []または他の方法で)。

単純なコードで再現できる場合は、上記の2つの問題を探します。それ以外の場合は、Microsoftデバッグツールをダウンロードし、gflags +hpa -i program.exeを使用して、ヒープを破損に非常に敏感にするようにします(エラーをより迅速に報告します)。

関連する問題