记录一次使用unordered_set插入数据异常的题目

打印 上一主题 下一主题

主题 902|帖子 902|积分 2706

题目形貌

题目和 unordered_set 有关,相关代码如下:
  1. //打印unordered_set的所有值
  2. void printSet(const std::unordered_set<std::string> &data)
  3. {
  4.     int index = 0;
  5.     auto it = data.begin();
  6.     for (; it != data.end(); ++it)
  7.     {
  8.         const std::string& key = *it;
  9.         EASE_ERROR("%d:%s", index++, key.c_str());
  10.     }
  11. }
  12. ...//其他业务代码
  13.    
  14. std::unordered_set<std::string> defined_task_variable;//数据定义
  15. defined_task_variable.emplace(task_variable);        //插入代码
  16. printSet(defined_task_variable);                                //打印所有值
复制代码
这些代码作为so提供给 程序A 调用,但是程序实行过程中发现,defined_task_variable 插入值后,printSet()方法应该遍历defined_task_variable,打印出其内部数据的,但实际上其打印出来的都是(null),且只在arm平台出现,且必现,但x86统统正常
排查思路

1、怀疑是线程资源冲突

相关操作函数增长线程id打印,确定是单线程,清除
2、怀疑是局部变量task_variable被释放

起首,unordered_set的emplace方法接纳完美转发,不可能因为传入参数生命周期结束而导致没有值
其次,修改代码,emplace插入纯字符串,发现题目依然,排查
3、怀疑是程序A的题目

编写测试程序B,加载同一个so
此时,测试发现一个奇怪的现象。起首,x86依然正常,但是arm平台出现两种情况:
测试程序B因为代码量小,编译出来的结果在1M以下,运行正常;此时,相同的程序B再额外加上一些代码(这些代码没有用到),导致编译出来的二进制文件大小达到24M,此时运行,复现错误
什么缘故原由呢?运行的题目出如今so中,但是却是调用so的二进制文件大小决定题目是否出现。有点诡异啊。
最终,仍然没有找到根本缘故原由,但是既然文件大小会影响运行结果,那么减小文件是不是就可以制止了呢?
3.1、二进制文件大小

编译时参加编译器优化选项,使用-O3
  1. set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -O3  -Wall")
  2. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3  -Wall")
复制代码
原本编译出来的程序A大小从20多M,降到了5M,运行正常,算是暂时解决了这个题目,但是因为使用了编译器优化,会不会导致逻辑不达预期,必要进一步测试
总结

那么,造成此题目的缘故原由毕竟是什么呢?

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

乌市泽哥

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表