昨天,在 Cygwin 下使用 GCC 编译的 DLL 时,我遇到了一个相当烦人的崩溃。基本上,一旦您使用调试器运行,您最终可能会陷入由 RtlFreeHeap() 接收到它未分配的地址所引起的调试陷阱。
这是Cygwin上 GCC 3.4 的一个已知错误。出现这种情况是因为 libstdc++ 库包含针对空字符串的“聪明”优化。我为您省去了细节(请参阅本文中的参考资料),但是每当您在一个 DLL 中为“属于”另一个 DLL 的 std::string 对象分配内存时,您最终都会给一个堆释放一个来自另一个堆。因此RtlFreeHeap() 中的 SIGTRAP。
当跨 DLL 边界引发异常时,还会报告其他问题。
一旦您的项目基于 DLL 和 STL,这使得 Windows 上的 GCC 3.4 成为不可接受的解决方案。我有几个选项可以跳过这个选项,其中许多非常耗时和/或烦人:
- 我可以修补我的 libstdc++或使用 --enable-fully-dynamic-string配置选项重建它
- 我可以改用静态库,这会增加我的链接时间
由于我正在使用其他一些工具,我也不能(还)切换到另一个编译器。我从一些 GCC 人那里得到的评论是“它几乎从未被报道过,所以这可能不是问题”,这让我更加恼火。
有人有这方面的消息吗?除了GNU Radio bug tracker上的一条评论外,我找不到任何明确的声明表明此问题已得到修复(该错误仍被标记为“已分配”)。
谢谢!