问题描述
问题和 unordered_set 有关,相关代码如下:
//打印unordered_set的所有值
void printSet(const std::unordered_set<std::string> &data)
{
int index = 0;
auto it = data.begin();
for (; it != data.end(); ++it)
{
const std::string& key = *it;
EASE_ERROR("%d:%s", index++, key.c_str());
}
}
...//其他业务代码
std::unordered_set<std::string> defined_task_variable;//数据定义
defined_task_variable.emplace(task_variable); //插入代码
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
set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -O3 -Wall")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3 -Wall")
原本编译出来的程序A大小从20多M,降到了5M,运行正常,算是暂时解决了这个问题,但是因为使用了编译器优化,会不会导致逻辑不达预期,需要进一步测试
总结
那么,造成此问题的原因究竟是什么呢?
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
暂无评论内容