Re: Application crashes when closed
Not really sure where you crash is, you need to narrow it down to a few
lines or something.
But I have a question, are your threads GUI threads or Worker threads?
AliR.
"Punit Kaur" <PunitKaur@discussions.microsoft.com> wrote in message
news:812E6938-E5E9-45B5-BC90-960F9DC735DA@microsoft.com...
Hi,
I have a windows application written using MFC , VC++ 6.0, I am using the
Application Verifier debugging tool to solve some bugs in my application.
When running in debug mode with the Application Verifier running in the
background, the application crashes when I close it. I have overriden the
OnClose method to do the following :
void CRecorder6Dlg::OnClose()
{
char HeaderID[MAX_UID_LEN +10];
char TxIP[20]; //change
CFileFind finder;
SHORT TimeOut = 0;
SYSTEMTIME Timey ; //System time structure
PSYSTEMTIME Ptr2;
Ptr2 = &Timey;
char cDate[11];
char cTime[9] ;
GetLocalTime(Ptr2);
sprintf(cDate,"%04d%c%02d%c%02d",Timey.wYear,'-',Timey.wMonth,'-',Timey.wDay);
sprintf(cTime,"%02d%c%02d%c%02d",Timey.wHour,':',Timey.wMinute,':',Timey.wSecond);
if (MessageBox("Are you sure you want to exit?","Shutdown?",MB_YESNO |
MB_ICONEXCLAMATION) == IDYES)
{
ClosingDown = true;
BeginWaitCursor();
StatbarR.SetText("Closing................. ",0,0);
SaveKeyset();
timeKillEvent(timer_number);
Sleep(300);
RNBOsproReleaseLicense(spro_packet,0,0);
TimeOut = 0;
threadrecvlive = FALSE;
ThreadOTARLive = FALSE;
threadDBlive = FALSE;
StatbarR.SetText("Stopping Receive Thread................. ",0,0);
while (!threadrecvlive && (TimeOut < 100))
{
Sleep(30);
TimeOut++;
}
TimeOut = 0;
StatbarR.SetText("Stopping OTAR Thread................. ",0,0);
while (!ThreadOTARLive && (TimeOut < 10))
{
Sleep(30);
TimeOut++;
}
TimeOut = 0;
StatbarR.SetText("Stopping Database Thread................. ",0,0);
while (!threadDBlive && (TimeOut < 10))
{
Sleep(30);
TimeOut++;
}
//Shut down Playthread thread
TimeOut = 0;
threadplaylive = FALSE;
StatbarR.SetText("Stopping Playback Thread................. ",0,0);
while(!threadplaylive && TimeOut< 50)
{
Sleep(30);
TimeOut++;
}
//Shut down "Get Disk Size" thread
TimeOut = 0;
threadGetSpace = FALSE;
StatbarR.SetText("Stopping Diskspace-Check Thread................. ",0,0);
while(!threadGetSpace && TimeOut< 50)
{
Sleep(30);
TimeOut++;
}
//Close any left open files
memset(HeaderID,0,sizeof(HeaderID));//Null array
sprintf(HeaderID,"%-s","ID Recorder Terminated ");//ANI tag-> ID
memset(TxIP,0,sizeof(TxIP));//Null array,No IP info on Rx //change
sprintf(TxIP,"%-s","IP"); //ADD IP Tag //change
for (int i=1; i<=MAX_CHANS; i++)
{
if(prx[i]->bFileOpen_File_Compr)
{
mmioWrite(prx[i]->File_Compr,(HPSTR)HeaderID,MAX_UID_LEN);//Write empty
ANI to PCM file
mmioWrite(prx[i]->File_Compr,(HPSTR)TxIP,sizeof(TxIP)); //Write empty IP
to PCM File //change
mmioClose(prx[i]->File_Compr,NULL);
}
if(ptx[i]->bFileOpen_File_Compr)
{
mmioWrite(ptx[i]->File_Compr,(HPSTR)HeaderID,MAX_UID_LEN);//Write empty
ANI to PCM file //change
mmioWrite(ptx[i]->File_Compr,(HPSTR)TxIP,sizeof(TxIP));//Write IP to PCM
file
mmioClose(ptx[i]->File_Compr,NULL);
}
}
//Compress remaining PCM files
if (BOOL bWorkingClose = finder.FindFile(cFolderTelwave))
{
StatbarR.SetText("Compressing Files, Please
Wait................................. ",0,0);//Ver 1.1.0
while (bWorkingClose)
{
Sleep(30);//Ver 1.1.0
bWorkingClose = finder.FindNextFile();
bWorkingClose = finder.FindFile(cFolderTelwave);
}
}
finder.Close();
//Shut down Compression thread
TimeOut = 0;
threadComPress = FALSE;
StatbarR.SetText("Stopping Compression Thread................. ",0,0);
while(!threadComPress && TimeOut< 50)
{
Sleep(30);
TimeOut++;
}
//Clean up Rx and Tx class pointers
StatbarR.SetText("Closing................. ",0,0);
for (int p=1; p<=MAX_CHANS; p++)
{
prx[p]->teardown(p);
if (prx[p]!=NULL)
{
delete prx[p];
}
ptx[p]->teardown(p);
if (ptx[p]!=NULL)
{
delete ptx[p];
}
mic[p]->teardown(p); //error line
if (mic[p]!=NULL)
{
delete mic[p];
}
}
//Close DataBase
if (!TelexDB.IsOpen())
{
TelexDB.Close();
}
CompressClose(); //Close compresion stuff
Statbar_fontR.DeleteObject();//Delete font object
EndWaitCursor();
CDialog::OnClose();
DestroyWindow();
//Adding "Network Recorder Closed" entry to the Date_timeLog.txt file
ofstream out("C:\\Program Files\\Telex
Vega\\LogFiles\\Date_TimeLog.txt",ios::app); // Open for writing
out << "Network Recorder closed\t" << cDate<<"\t"<<cTime<<"\n";
}
}
I crashes at the line : see for "//error line "above. Tear down is a user
defined function, and it fails in the setsockopt function
setsockopt(sock, IPPROTO_IP, IP_DROP_MEMBERSHIP,(char FAR
*)&mreq,sizeof(mreq)); which is called inside teardown.
When I verified the value of sock, the value was 000000 and I thought that
was the cause of it. I commented out that line and it started throwing
error
in the previous line's tear down function. I commented out everything in
the
for loop and now it gives me another error .
<avrf:message>Unloading DLL containing an active critical
section.</avrf:message>
<avrf:parameter1>10103944 - Critical section address.</avrf:parameter1>
<avrf:parameter2>0 - Critical section initialization stack
trace.</avrf:parameter2>
<avrf:parameter3>1730fe8 - DLL name address.</avrf:parameter3>
<avrf:parameter4>10000000 - DLL base address.</avrf:parameter4>
- <avrf:stackTrace>
<avrf:trace>vfbasics!VfBasicsStopMessage+8e</avrf:trace>
<avrf:trace>vfbasics!AVrfpFreeMemLockChecks+17c</avrf:trace>
<avrf:trace>vfbasics!AVrfpFreeMemNotify+39</avrf:trace>
<avrf:trace>vfbasics!AVrfpDllUnloadCallback+2c</avrf:trace>
<avrf:trace>ntdll!RtlQueryProcessDebugInformation+117e</avrf:trace>
<avrf:trace>ntdll!RtlInitializeSListHead+44c4</avrf:trace>
<avrf:trace>vfbasics!AVrfpLdrUnloadDll+73</avrf:trace>
<avrf:trace>kernel32!FreeLibrary+19</avrf:trace>
<avrf:trace>ODBC32!SQLErrorA+1b4</avrf:trace>
<avrf:trace>ODBC32!SQLFreeEnv+1d</avrf:trace>
<avrf:trace>MFCD42D!CDatabase::Free+fb</avrf:trace>
<avrf:trace>MFCD42D!CDatabase::~CDatabase+47</avrf:trace>
<avrf:trace>Recorder!$E303+d</avrf:trace>
<avrf:trace>MSVCRTD!doexit+6f</avrf:trace>
<avrf:trace>MSVCRTD!exit+10</avrf:trace>
<avrf:trace>Recorder!WinMainCRTStartup+1c0</avrf:trace>
<avrf:trace>kernel32!RegisterWaitForInputIdle+49</avrf:trace>
Another imp piece of information: When I try to build my project in Debug
mode, I get two warnings all the time:
LINK : warning LNK4098: defaultlib "LIBCMT" conflicts with use of other
libs; use /NODEFAULTLIB:library
LINK : warning LNK4098: defaultlib "MSVCRT" conflicts with use of other
libs; use /NODEFAULTLIB:library
I tried to add /NODEFAULTLIB:MSVCRTD.LIB and LIBCMTD.LIB in ignore files
in
my Project settings under Link tab. But it was of no use.
Are these problems interlinked? I read somewhere that such warnings can
give
rise to problems while freeing memory which I am doing in Onclose
function.
Please suggest.