在我的基于asio的应用程序中,我遇到了错误处理问题。我使用带有async_read / async_write函数的asio单线程/单个io_service,当在完成处理程序中传递给我的错误代码不为null时,对其.message()方法的任何调用都会导致段错误,因为错误-category指针指向null。但是,实际值始终是正确的。
奇怪的是,我无法在测试应用程序中重现这一点。这基本上就是我正在做的,但是如果出现错误,调用message()在这里按预期工作:
ctrl.recipeModel.ingredients = _.clone(ctrl.recipeModel.ingredients);
我不认为这是我的应用程序的生命周期的问题,AddressSanitizer没有发现任何潜在的错误,我可以毫无问题地转移数百兆字节的数据。此外,如果我只是取消注释对message()的调用,服务器将继续正常运行并正确处理新连接。无论如何,这是崩溃发生时的callstack:
https://gist.github.com/mariusherzog/82f24caf9eea4d94946706aa8c025ef1 该类别从第11帧开始指向空。
我使用linux with boost 1.62 with clang 3.9.1和gcc 5.4.0
答案 0 :(得分:1)
我唯一能想到的就是现在一段代码初始化为构建全局静态数据的一部分。如果它在那时抓取类别引用并且有多个翻译单元,则可能尚未构建类别实例。
这种情况被亲切地称为Static Initialization Order Fiasco。
除此之外,脑海中浮现出这种情况(全球范畴已被破坏)。这似乎不太可能,因为1.你已经意识到它发生在关机2中。在这种情况下,引用通常不会变为空 - 尽管实现可能