【问题标题】:multithreaded c exe crash but not within vs2013 debug多线程c exe崩溃但不在vs2013调试中
【发布时间】:2015-02-28 17:12:42
【问题描述】:

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

下面是 dll 代码 sn-p 我如何隔离和解决问题? 谢谢!

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]);

【问题讨论】:

  • 这是个玩笑吧?您不会认真地认为代码转储的格式是可以接受的,对吧? Hanlon 的 Razer 肯定有,但必须有限制。
  • 这不是 MCVE。它甚至不是一个可运行的程序。不知道你在期待什么。
  • 我不知道我是否能够提供帮助,但如果您说“崩溃”的性质是什么,有人可能会提供帮助。它是否发生在独立运行时的调试和发布版本中?您是否尝试过创建事件记录器来跟踪导致失败的事件? (需要某种信号量或互斥量,但应用 KISS,这样您就不是在调试调试工具,而是在调试问题。)
  • 我为糟糕的代码格式道歉;
  • 关于已发布的相关 cmets,在 Debug 和 Release 配置中都会发生这种情况。我尝试的是在运行时将 VS2013 调试器附加到独立 exe,这就是我能够识别主线程在 WaitForMultipleObjects() 上的方式,而子线程在 ntdll.dll 中的某个位置。我还在发布的 for..loop 中插入了一些 printf() ,我可以看到崩溃似乎是随机发生的(即,有时 pr_id=0,有时最多 3...)...

标签: c multithreading dll


【解决方案1】:

根据我之前的评论,我安装了 MS Visual C++ 2010 Express,从头开始重新创建项目,并重新编译它。 这确实解决了我的问题,因为我的 .exe 现在运行完美。 正如我所怀疑的那样,似乎崩溃的根本原因在于 VS2013 库,可能是 MSVCRT120(D).dll,但我会留给其他人来解决这个问题。

【讨论】:

  • 非常不太可能问题的根源在于库。虽然 VS 以提供具有大量错误的库而闻名,但您永远不应盲目地将库代码归咎于您自己的代码。除非您能明确指出 VS 中的一个已知错误来解释该行为,否则可能是您的代码有问题。
  • @ComicSansMS: 总的来说你可能是对的,但我这里没有做任何事情盲目地;相反,我只是指出,同样的代码在 VC2010 中编译时运行良好,而在 VS2013 中编译时崩溃。这真是让人大开眼界……
猜你喜欢
  • 1970-01-01
  • 2014-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多