0

Before some time i coded my own little db editor program, i was coding it from the zero using Win API's so its not very small project. It was working fine on all OS till now, i have Win 7 x64 with all latest updates and my application is crashing with 0xC000005 exception because of some of the Heap functions(HeapAlloc or HeapFree, i use nothing else), i tried replacing HeapAlloc & HeapFree with VirtualAlloc and VirtualFree and it was all fine, but i dont want to use the virtual memory.... Something else, i tried to attach with debugger to trace the problem, but when i attach debugger its not crashing, then i tried to display MessageBox to trace where it crashes, but when i display MessageBox its not crashing too....

My application is running as 32bit process. Coded in C.

Anyone had similar problem ?

4

2 に答える 2

1

アプリケーションのデバッグバージョンに添付しましたか?問題がデバッグバージョンで表示されない場合は、(最高レベルで)どの警告がコードを生成するかを確認する必要があります。初期化されていない変数が見つかる可能性があります。ここに何もない場合は、静的分析ツールを使用してバグを見つけるのに役立てることができます(PVS-Studio http://www.viva64.com/など) 。

デバッグ情報を有効にしてリリースバージョンをコンパイルすることもできます。これにより、問題が発生したときに、デバッガーを使用してアプリケーションに接続し、関数名を使用してコールスタックを確認できるようになります。デバッグを容易にするために、コードの最適化を無効にします。

Windowsデバッガツールからgflagsを試すこともできます。このプログラムは、バッファ境界の外側に書き込むたびにブレークポイントをトリガーします。すべてのバッファオーバーランが例外で終わるわけではないので、これは本当に便利なツールです。デバッグ情報を有効にして、できればコードの最適化をオフにして、アプリケーションで使用します。アプリでgflagsを有効にするには:

gflags / p / enable myapp.exe / full(http://msdn.microsoft.com/en-us/library/windows/hardware/ff543097%28v=vs.85%29.aspx)

于 2012-04-25T01:27:51.460 に答える
1

Firstly, both HeapAlloc and VirtualAlloc allocate virtual memory.

My guess as to what is happening is that you are writing past the boundary of the allocated memory. The reason why this does not work with HeapAlloc is that it allocates exactly the amount of memory you request. With VirtualAlloc, the size returned is the requested size rounded up to the next page boundary. In your case, this gave a bit more leeway (even though your code is still doing the wrong thing).

In terms of why it has been working so far: you just got lucky. Look carefully at the code accessing the allocated memory and if you get stuck, post the relevant part up here. If the debugger isn't helping and the bug is easily reproducible, just comment out parts of the code until you locate the line causing the crash.

于 2012-04-24T23:14:08.513 に答える