问题背景
开发一个功能,在centos-32bit环境下运行好好的,切换部署到centos-64bit环境竟然崩溃了段错误,调试之,提示out of bounds。
问题分析
根据现象是内存出错(要么被释放了,要么越界),仔细分析下源码,没问题呀,malloc主动分配,不应该会被系统回收释放,地址范围也没错;
断点一步步调试,发现是在调用某个so库的函数时返回一个指针,在返回的下一步就提示out of bounds,查看对应内存地址,原来的值确实也没了,看来问题应该是在函数调用返回的时候触发的;这个函数是在一个线程环境中执行的,难道跟线程调用有关系;扣取调用so函数的代码放到主线程,还是挂(跟线程环境没关系?);接下来干脆放到main函数去调用,竟然没挂,这时候想起来有人引用了对应的头文件可以解决问题,报着尝试的态度,发现还真没有include,添加后,再运行,正常了。
总结
这个应该是centos64环境下gcc编译c代码规则更严格了,仔细查了下编译信息,确实有implicit declaration of function的警告,所以为了避免一些不必要的奇怪现象,坚决做到0警告,0错误才行。