tags:

views:

627

answers:

2

I have my application(VC MFC) run with gflags with Pageheap enabled to track down the page heap corruption.

Now the application has crashed and it shows this error, i could not interpret these lines (other than having a feeel of resource inavailablity)

Can anyone throw a light on what exactly is the reason that has caused the carsh of the app.

[info : Application is a multithreaded one about 500 threads running,in a multi - processor machine)

kernel32!RaiseException+53 msvcrt!_CxxThrowException+36 mfc42u!AfxThrowResourceException+19 mfc42u!AfxRegisterWndClass+ab mfc42u!CAsyncSocket::AttachHandle+5c mfc42u!CAsyncSocket::Socket+25 mfc42u!CAsyncSocket::Create+14

Pls help

A: 

I wonder if this is your actual heap corruption issue, or if your program has just hit a resource limitation as a consequence of running with Pageheap.

I can't remember the exact details, but Pageheap incurs extra memory overhead, so much so that you can run out of memory much sooner than you would without Pageheap enabled.

With 500 threads running, you have a 1MB stack for each, plus any memory they've allocated dynamically along the way.

CAsyncSocket::AttachHandle triggers AfxThrowResourceException if it can't create a window. It seems that your system is saturated due to Pageheap.

Do you have to have 500 threads running to reproduce the problem? Maybe if you could lower that count a little, there would be more resources available.

Kim Gräsman
jebina
Do you need Full Pageheap, or could you try with Normal, per http://support.microsoft.com/kb/286470?Since your heap is corrupted, it could crash anywhere. You never answered my question -- is there a chance of reducing the amount of threads running to conserve resources during the test? Or does the behavior only rise when you have 500 threads running?
Kim Gräsman
+1  A: 

Hi Guys,

This same problem has driven me nuts but finally i fixed it and it is working. This is bug with MFC socket library that when inside a thread [other than main application thread], If we try to do something like

CSocket socket;
socket.Create();

It will throws an unhandled exception. I found an article on it See What Microsoft says about this

that said something from Microsoft but that did not help me either. So here is a workaround i have found and i hope it can help some frustrated fellow like me.

Inside thread, do this

CSocket mySock;
SOCKET sockethandle = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
mySock.m_hSocket= sockethandle;

After that DO NOT call mySock.Create as it has been created already through assignment of socket handle. I am not sure if we can use mySock.Attach(sockethandle) as i did not try it yet.

After that you can call Connect etc directly.

When you are done using the socket, DO NOT call mySock.Close() - rather call closesocket(mySock.m_hSocket); And that will free the socket object. If Attach works in above case then i guess we need to do Detach here when to free the socket.

Good Luck

Nauman Khan