多线程c exe崩溃,但不在vs2013调试内

多线程c exe崩溃,但不在vs2013调试内,c,multithreading,dll,C,Multithreading,Dll,使用Visual Studio 2013 Express,我用c开发了一个多线程dll,以及一个使用一些dll函数的关联exe。只要我从VS IDE本地Windows调试器中启动exe,一切正常;但是,当从命令行运行exe时,dll崩溃。通过从IDE中连接到正在运行的exe,我可以看到崩溃总是在WaitForMultipleObjects调用时发生,但这确实没有多大帮助,因为生成的线程的堆栈跟踪丢失在ntdll.dll中的某个地方 下面是dll代码片段,我如何隔离和修复该问题? 谢谢 根据我以前

使用Visual Studio 2013 Express,我用c开发了一个多线程dll,以及一个使用一些dll函数的关联exe。只要我从VS IDE本地Windows调试器中启动exe,一切正常;但是,当从命令行运行exe时,dll崩溃。通过从IDE中连接到正在运行的exe,我可以看到崩溃总是在WaitForMultipleObjects调用时发生,但这确实没有多大帮助,因为生成的线程的堆栈跟踪丢失在ntdll.dll中的某个地方

下面是dll代码片段,我如何隔离和修复该问题? 谢谢


根据我以前的评论,我安装了MS Visual C++ 2010 Express,从头开始重新创建项目,并重新编译它。 这确实解决了我的问题,因为我的.exe现在运行得完美无缺。


正如我所怀疑的,似乎崩溃的根本原因在于VS2013库,可能是MSVCRT120D.dll,但我会让其他人来解决这个问题。

这是个笑话,对吗?你不会真的认为代码转储的格式是可以接受的,对吧?Hanlon的剃须刀当然可以,但一定要有限制。这不是MCVE。它甚至不是一个可运行的程序。我不知道你在期待什么。我不知道我是否能帮上忙,但如果你说出坠机的性质,可能会有人帮上忙。当独立运行时,它是否发生在的调试和发布版本中?您是否尝试创建事件记录器来跟踪导致故障的事件?需要某种信号量或互斥量,但应用KISS,这样您就不会调试调试工具,而不会出现问题;关于发布的相关注释,这在调试和发布配置中都会发生。我尝试的是在standaloine exe运行时将VS2013调试器附加到它,这就是为什么我能够识别主线程在WaitForMultipleObjects上,而子线程在ntdll.dll中的某个位置。我还在posted for..循环中插入了一些printf,我可以看到崩溃似乎是随机发生的,即有时pr_id=0,有时高达3。。。问题的根本原因不太可能在于图书馆。虽然VS以提供高bug数量的库而闻名,但您永远不应该盲目地指责库代码而不是您自己的代码。除非你能明确指出VS中的一个已知错误来解释这种行为,否则很可能是你的代码出了问题。@ComicSansMS:一般来说,你可能是对的,但在这里,我不是盲目地做任何事情;相反,我只是指出,同样的代码在VC2010中编译时运行良好,而在VS2013中编译时崩溃。这是它能看到的最开阔的眼界。。。
for (pr_id=0; pr_id<pBestPredictorsCount; pr_id++){
    arg[FH][pr_id]->OutputType = FH;
    arg[FH][pr_id]->CBaseVal = CRec[0].High;
    arg[FH][pr_id]->PredictorId = pr_id;
    arg[FH][pr_id]->Delta = vDelta;
    arg[FH][pr_id]->Scale = vHpScale;
    arg[FH][pr_id]->DebugLevel = pDebugLevel;
    arg[FH][pr_id]->LogFile = pLogFile;
    arg[FH][pr_id]->TotalBars = pTotalBars;
    arg[FH][pr_id]->PredictionLen = pPredictionLen;
    arg[FH][pr_id]->Forecast = oForecast;
    arg[FH][pr_id]->ChrMutex = ChrMutex;
    arg[FH][pr_id]->CVal = vCVal[FH];
    arg[FH][pr_id]->HVal = vHVal[FH];
    handle[ThreadCount] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)DoGATrainAndRun,
                          (void*)arg[FH][pr_id], 0, &th_id);
    ThreadCount++;

    arg[FL][pr_id]->OutputType = FL;
    arg[FL][pr_id]->CBaseVal = CRec[0].High;
    arg[FL][pr_id]->PredictorId = pr_id;
    arg[FL][pr_id]->Delta = vDelta;
    arg[FL][pr_id]->Scale = vHpScale;
    arg[FL][pr_id]->DebugLevel = pDebugLevel;
    arg[FL][pr_id]->LogFile = pLogFile;
    arg[FL][pr_id]->TotalBars = pTotalBars;
    arg[FL][pr_id]->PredictionLen = pPredictionLen;
    arg[FL][pr_id]->Forecast = oForecast;
    arg[FL][pr_id]->ChrMutex = ChrMutex;
    arg[FL][pr_id]->CVal = vCVal[FL];
    arg[FL][pr_id]->HVal = vHVal[FL];
    handle[ThreadCount] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)DoGATrainAndRun,
                          (void*)arg[FL][pr_id], 0, &th_id);
    ThreadCount++;
}

WaitForMultipleObjects(ThreadCount, handle, TRUE, INFINITE);
for (i = 0; i < ThreadCount; i++)
    CloseHandle(handle[i]);