【发布时间】:2015-07-23 04:37:47
【问题描述】:
我有一个 MSVC 项目,该项目由多个从可执行文件调用的 DLL 组成。其中一个 DLL 初始化 CEF(Chromium Embedded Framework),另一个提供一些其他通用功能,我们将它们称为 cefDLL 和 generalDLL。电话是这样的:
- 所有调用都是从可执行文件中完成的。
- 我调用 cefDLL 中的函数来初始化 CEF。
- 我将函数称为第二个通用DLL。
- CEF 中的某些线程内部崩溃并出现 Windows 错误弹出窗口报告“应用程序无法正确启动 (0xc0000124)。单击确定关闭应用程序。”。
- 出现一个 Windows 弹出窗口,声明 Application.exe 已停止工作。
- 即使我在“已停止工作”弹出窗口中关闭程序,主线程也会继续运行。
如果我尝试在崩溃的程序上运行调试器,我会得到一个空白的 Visual Studio,没有调用堆栈,没有本地变量,什么都没有,甚至没有失败的 DLL 的名称。
如果我从另一个 DLL 调用一个函数,或者从可执行文件本身调用一个函数,或者根本不调用一个函数,代码就可以很好地到达我的无限循环(我正在使用无限循环来阻止程序的其余部分运行)。
如果我让它继续运行到程序的其余部分并且不使用无限循环停止它,CEF 中的另外两个线程崩溃,总共三个崩溃线程。这些产生与第一个线程完全相同的错误。我不确定是什么原因造成的,因为我还没有时间研究这个问题。
即使在一般DLL 中调用的函数完全不执行任何操作,这仍然会发生。如果我的代码是
,我确定是调用它们的行为导致了这种情况initializeCEF();
while (true)
{
}
如果代码是,它可以工作
initializeCEF();
someBlankFunctionInGeneralDLL();
while (true)
{
}
线程崩溃。
CEF 的初始化包括:
//Initialize
CefMainArgs mainArgs;
//Launch Threads
CefExecuteProcess(mainArgs, nullptr, nullptr);
//Settings
CefSettings settings;
settings.pack_loading_disabled = true;
settings.windowless_rendering_enabled = true;
settings.multi_threaded_message_loop = false;
settings.no_sandbox = true;
//Sandbox Info
void *sandboxInfo = nullptr;
//Launch System
CefInitialize(mainArgs, settings, nullptr, sandboxInfo);
有没有人知道这可能是由什么引起的?这很容易成为我遇到过的最奇怪的错误之一。 这个项目非常庞大,大约有 50,000 行,而且实际上没有任何其他相关部分,所以恐怕我无法提供任何示例。让我知道是否有一些您认为有助于查看的代码。
【问题讨论】:
标签: c++ multithreading visual-c++ dll chromium-embedded