我需要一些关于此异常的帮助,我正在实现一个NPAPI插件,以便能够使用来自浏览器扩展的本地套接字,为此我正在使用Firebreath框架.
对于套接字和连接,我使用带有异步调用的Boost asio和一个包含5个工作线程的线程池.另外,每个线程都有一个截止日期来实现传输超时.
我使用插件扩展工作流程如下:
得到回应1
打开另一个插座2
写入套接字2
写套接字1
关闭套接字1(socket.cancel(),deadline.cancel(),socket.shutdown(),套接字释放).
得到回应2
由于所有内容都是跨语言,异步实际上很难调试,但是所有打开,写入或关闭都是从javascript调用的,并且从套接字1中读取,调用open 2,write 2,write 1并按顺序关闭1.
也许我告诉的事情是无关紧要的,因为抛出异常时调用堆栈没有显示我的任何函数,只显示它在malloc调用内部_heap_alloc_dbg_impl
因为它通常在第2或第3个完整周期中失败,似乎在步骤5和7之间发生.
但是,我认为它必须与asio相关,因为使用单个工作线程执行所有操作只会在第一个循环中与异常崩溃.
如果您需要,我愿意发布更多信息代码.
更新1:

更新2:
有10个线程启动:
workPtr.reset( new boost::asio::io_service::work(io_service));
for ( int i = 0; i < 10; ++i) {
m_threadGroup.create_thread( boost::bind(&boost::asio::io_service::run, &io_service) );
}
Run Code Online (Sandbox Code Playgroud)
第11届_threadstartex我不知道是谁推出的
在另一个线程(不是VS声称导致崩溃的那个)上有一个join_all()进行中因为我的类被销毁但我认为它不应该,所以也许这个崩溃是由于另一个异常和Firebreath进程关闭一切当它崩溃.
我正在尝试编写一个单元测试来检测我的类的lock()功能的无效使用.为了做到这一点,我想使用析构函数并从那里抛出一个异常.不幸的是,g ++决定调用std :: terminate()而不是捕获异常.
该类有一个非常简化的版本:
class A
{
public:
A() : f_lock(0) {}
~A() { if(f_lock) throw my_exception("still locked"); }
lock() { ++f_lock; }
unlock() { --f_lock; }
private:
int f_lock;
};
Run Code Online (Sandbox Code Playgroud)
有一个有效的测试:
A *a = new A;
a->lock();
...
a->unlock();
delete a;
Run Code Online (Sandbox Code Playgroud)
我正在尝试编写无效测试:
A *a = new A;
a->lock();
...
bool success = false;
try
{
delete a;
}
catch(my_exception const&)
{
success = true;
}
catch(...)
{
// anything else is a failure
}
if(!success)
{
// test …Run Code Online (Sandbox Code Playgroud) c++ ×2
boost-asio ×1
boost-thread ×1
destructor ×1
exception ×1
firebreath ×1
g++ ×1
throw ×1
visual-c++ ×1