问题1
问题概述:
编译插件代码,cmake和make均成功,但是执行sudo make install时报错cannot find -lclass_loader,在CMakeLists.txt中添加find_package(class_loader),cmake时提示可以找到class_loader,但是make install 还是报错。
解决方案:
修改系统时间 sudo date -s “YYYY/MM/DD HH:mm:ss”。
问题2
问题概述:
pm_test中起线程执行pm的run函数,单独运行device_manager_test/test_pm/test_show成功,但是在DA代码中以同样的方式起线程执行pm中的run函数时报内存错误。
场景pm_test代码:
DA起pm部分代码
运行DA代码报错:
由于前后都是出错位置前后都是场景相关的打印,所有被认定时我们的问题。
对比代码后排除DA错误调用pm的可能性。
通过gdb调试定位到是在起线程pm中的run重载函数时出错的,不起线程进入run函数在new物理域的对象时程序也会异常结束,因此猜想在起线程之前内存结构已经遭到了破坏。后又通过valgrind调试提示在构造函数中调用新增的map的empty()函数出现异常:Invalid write of size 8和Invalid read of size 8,之前遇到过同样的问题,是由于新增的int类型变量在两个map变量之后声明,在构造函数中给该int类型变量赋初值时也出现异常,后将该变量定义移动到新增的两个map变量之前声明就没再出现过异常现象,但是并没有解决根本问题。
将构造函数中对新增的两个map变量的判空和清空处理的操作都删除了之后调试发现没有Invalid read of size 8了,但是还有Invalid write of size 8。
由于新增的map变量中含有嵌套map和void *,猜想可能是由于void *和map没有初始化导致的,因此重新编译了两个版本对新增的两个map变量进行了初始化,还是存在内存错误。
map变量初始化:
方案1
方案2
构造函数初始化列表
PluginManager:: PluginManager():paramsFlag(), _runMap()
{
…..
}
通过gdb反复调试,进入run函数中将入参中map通过“=”赋值给新增map变量_runMap时程序异常退出,由于_runMap中含有嵌套map和void *,猜测是map浅拷贝造成的,但是通过测试并没有出现异常。
最终解决方案:
1. 参考 C语言 GCC编译的程序运行报错 malloc.c:2401: sysmalloc: Assertion 的分析解决_星空千代-CSDN博客
修改方案:
2. 参考 【已解决】C++中由于字节对齐引起的踩内存问题_WINGREZ‘S BLOG-CSDN博客
修改方案:
在pluginManager.h中类的声明前后分别增加#pragma pack(push, 4)和#pragma pack(pop)
经验证,两种方式均可解决问题。