使用boost::timed_join和FreeLibrary时崩溃
Crash when using boost::timed_join and FreeLibrary
我需要使用LoadLibrary
和GetProcAddress
来调用一些dll(插入我的应用程序)中的函数,但我不希望它们能够通过包含无限循环或挂起自己来挂起我的程序,所以我试图使用boost::thread
(没有经验)来绕过这一点。但是,如果函数确实挂起,则在调用FreeLibrary
进行清理时,我会使用ACCESS_DENIED(0x00000005)崩溃。
这里有一个最小DLL(mydll.dll
),它再现了这个问题:
extern "C" {
void __declspec(dllexport) foo() {
for(;;); //<-- infinite loop
}
}
这里有一个崩溃的最小cpp。为了简洁起见,我省略了错误检查,但我可以向您保证不会出现错误:
#include <boost/thread.hpp>
#include <iostream>
#include <windows.h>
int main() {
using FuncType = void (*)();
HMODULE dll = LoadLibrary("mydll.dll");
FuncType func = (FuncType)GetProcAddress(dll, "foo");
boost::thread thr = [func] {func();};
if (!thr.timed_join(boost::posix_time::seconds(1))) {
std::cout << "Timed out.";
//thr.detach();
FreeLibrary(dll);
}
for (;;);
}
运行此程序后,将打印"Timed out.",崩溃时的调用堆栈(CodeBlocks上的gdb)如下所示:
#0 00000000 0x6c1c1214 in ??() (??:??)
#1 0040133E operator() (__closure=<optimized out>) (C:...thread test.cpp:17)
#5 00000000 0x00000000 in ??() (??:??)
如果不进行优化,就变成:
#0 00000000 0x6c1c1214 in ??() (??:??)
#1 00401348 operator() (__closure=0x898f90) (C:...thread test.cpp:17)
#2 00401780 boost::detail::thread_data<main()::<lambda()> >::run(void)(this=0x898f70) (c:/.../boost/thread/detail/thread.hpp:62)
#5 00000000 0x00000000 in ??() (??:??)
我尝试的第一件事是在上面评论的thr.detach();
行中添加,但这产生了相同的结果。
我也尝试过以下方法,但没有成功:
- 用函数替换lambda(我不确定Boost与C++11的配合程度)---崩溃
- 注释掉
FreeLibrary
行——效果不错,但我宁愿在加载后释放它,即使它是基于引用的。我对以后工作中的这种行为也很谨慎 - 将DLL中的无限循环替换为返回---的循环效果很好,但我不能指望
- 不使用
LoadLibrary
或任何东西并内联无限循环——效果很好,但我需要使用DLL:
boost::thread thr=[]{for(;;);};
DLL和cpp都是在Windows 7 64位上使用32位输出类型的GCC 4.7.1编译的。我的Boost版本是1.49.0。如果内存可用的话,我想在转移到另一台计算机之前,我在Windows XP 32位(相同的编译器等)上进行了一两次测试。
为什么会崩溃?如何确保我动态调用的函数不会挂起我的程序?
从根本上说,你不能这么做。线程不提供那种隔离。如果需要,请使用流程。
相关文章:
- 当回溯以零开始时,如何调试崩溃
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- 程序崩溃并显示"std::out_of_range"错误
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- CoInitialize()在单独的线程上崩溃而不返回
- 使用调试/崩溃报告将应用程序部署到客户端
- 为什么所有C++编译器都会崩溃或挂起此代码
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 为什么我的多线程作业队列崩溃
- ExtractIconEx:可以工作,但偶尔会崩溃
- 为什么引用传递会导致此崩溃(C++)
- 试图创建流或fopen时程序崩溃
- 类对象数组的问题会导致崩溃
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 为什么要增加导致崩溃的指针
- 在虚幻引擎中删除NXOpen对象时崩溃
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 使用boost::timed_join和FreeLibrary时崩溃