Closed Antares0982 closed 1 year ago
尝试禁用RTTI,无效
已经明确地在编译选项里禁用了rtti,但是链接上外部模板特化的代码还是调用了dynamic cast,以及使用了collate<char>
类型的typeid。
尝试删除redirect cout相关的所有代码,无效
发现一个临时的解决方案:
memcpy(&std::collate<char>::id, &std::collate<int8_t>::id, sizeof(std::collate<int8_t>::id));
除此之外,注意到如果直接通过可执行程序调用dlopen()打开一个动态链接库并运行,use_facet
是不会抛出错误的,估计问题仅会在java运行时出现
同样的问题会在libLoader出现,推测是jvm那边修改了stdout相关的东西导致的问题
问题排查到了,是oracle jdk会导致这个bug,jdk 17, 18均可复现,并且要在linux平台上。提醒用户不要用linux + oracle jdk就可以
Code of Conduct
问题描述
std::regex
在插件中(Debug,release)构造时,抛出std::bad_cast
异常,但在gtest中不会出现任何问题。在插件
OnEnable
函数中加入下面语句:进行测试,堆栈信息已在下方日志中。gtest运行时并非像实际运行时那样是通过运行时链接,而是编译期链接,根据此结论查找到了相关的资料 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52540 ,但目前没有非常好的解决方案。
细节及已经尝试过的解决方案:
std::use_facet
的断点无法命中。根据上面提到的资料,use_facet对于std::collate<char>
使用了外部的模板特化而非使用自身原本的定义。通过将宏_GLIBCXX_EXTERN_TEMPLATE
定义为0,该断点可命中,以下代码段:将仍然抛出异常。
日志
版本
v2.13.0-alpha
组件
Plugin(SDK)
编译器
gcc/g++, 其他
系统
Linux/Unix
架构
x86-64/amd64