【发布时间】: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