最近做一个项目,需要用到xml库加载xml文件。程序编译运行的环境是centos6.5+gcc4.7。
由于使用的centos6.5是简单安装的,因此一些依赖库都是自己下载rpm安装包安装,其中就包括libxml2。
问题出现了,两台简单安装的centos linux 环境虚拟机,一台上面正常运行,一台上面加载xml文件时出现segmentation fault 。
解决过程:
1、bt查看segmentation fault 堆栈,发现死在libc.so.6 中。
2、在另一台正常运行的机器上加断点,对比两个调用栈,发现调用的接口名都是一样。
3、继续找堆栈中的不同,堆栈上面有一些依赖库文件的版本信息,挨个对比,发现正常运行的依赖库中有一个zlib-1.2.3,而出现segmentation fault 的依赖库中没有。
4、使用rpm -qa zlib 查看zlib的版本,发现出现segmentation fault的机器上有两个版本的libz-1.2.3 和 1.2.5。
5、使用rpm -ql zlib 查找zlib所在的路径,进一步对比。segmentation fault的机器上libz.so 软连接的是高版本的libz-1.2.5.
6、删掉segmentation fault的机器上的libz-1.2.5,将libz.so重新软连接到libz-1.2.3,再运行一下程序,segmentation fault的错误没有了,程序正常运行!
总结:这是本人作为一个新手解决问题的方法,有大牛告诉我可以查看符号表,貌似是nm命令,如果上面的方法不能解决问题,大家可以尝试一下nm。希望能帮到大家!