[BUG随想录] expat不兼容BUG
本周五软工团队项目的第一次前后端全部对接时,出了一个蛋疼的错误。
最初起因是小丽叔出于安全的考虑,使用守护进程来跑Web服务器。守护进程(Daemon)是运行在后台的一种特殊进程,如果服务器用root权限来跑的话会有安全隐患,但是daemon本身无法更改一些没有放开权限的文件,即使网站被黑也不会有数据隐私泄露的情况。
但是在使用守护进程的过程中出现了一个很蛋疼的问题,在root权限下我们在Python中使用xml读取是完全没问题的,但是在使用守护进程后,却出现了一个毫无头绪的bug,报错信息如下:
Traceback (most recent call last):
File "-------------", line , in <module>(为保护隐私已经删去具体路径)
finish_str = ReadXmlTop()
File "--------", line , in ReadXmlTop dom = xml.dom.minidom.parse(sys.argv[])
File "/usr/lib/python2.7/xml/dom/minidom.py", line , in parse
from xml.dom import expatbuilder
File "/usr/lib/python2.7/xml/dom/expatbuilder.py", line , in <module>
from xml.parsers import expat
File "/usr/lib/python2.7/xml/parsers/expat.py", line , in <module>
from pyexpat import *
ImportError: /usr/lib/python2./lib-dynload/pyexpat.x86_64-linux-gnu.so: undefined symbol: XML_SetHashSalt
很奇怪,我们虽然用到了minidom来读取xml,但是为什么root权限就可以,但是守护进程运行时就跪了呢?
一开始我们参考了何涛的建议,认为可能是因为守护进程没有权限去读/lib这个文件夹。但是在加了权限后,事实表明,依然不对!
那能是什么问题?在几经搜索与查找后,(在stackoverflow上有一个类似问题但是并没有人回答...)终于在一个国外的论坛上找到了些许眉目,原因就是动态链接库的命名冲突!
于是我们按照下面的方法在root权限下进行了检查:
ldd /usr/lib/python2./lib-dynload/pyexpat.x86_64-linux-gnu.so
发现显示如下
linux-vdso.so. => (0x00007fffba39e000)
libpthread.so. => /lib/x86_64-linux-gnu/libpthread.so. (0x00007fbb9306f000)
libc.so. => /lib/x86_64-linux-gnu/libc.so. (0x00007fbb92caa000)
libexpat.so. => /lib/x86_64-linux-gnu/libexpat.so. (0x00007fbb92a7f000)
/lib64/ld-linux-x86-.so. (0x00007fbb934a8000)
其实能看出来这个动态链接库的指向路径确实是没有错误的,都是指向/lib/x86_64这个路径下的动态链接库,那么,究竟是哪里出了问题呢?
我们思索很长时间,终于想到,我们现在是在root下查询的,结果当然是正确的,于是我们在守护进程里去查询,终于发现了一些端倪:
libexpat.so. => /opt/lampp/lib/libexpat.spo.1.5.
其余动态链接库的指向全部正确,唯有这个指向出了错误!错误就是在这里,因为laravel框架里自带的一些动态链接库与python的libexpat.so.1动态链接库命名相同,并且在默认条件下,守护进程的LD_LIBRARY_PATH是/opt/lampp/lib,所以这个守护进程优先选择了lampp自带的expat。
但是由于lampp自带的expat是不兼容系统的expat的!(缺少一部分字段)所以没有办法执行xml的正确读取。
错误知道了,该如何解决呢?我们起初是想,更改守护进程的LD_LIBRARY_PATH,使用:
export LD_LIBRARY_PATH =/lib
但是不幸的是,不管我们如何更改,发现都没有办法成功更改守护进程的LD_LIBRARY_PATH,值永远是那个。在这过程中,我们还使用了一次ldconfig而让网站直接挂了...
最后机智过人的小丽叔想到了一点,守护进程是一个特殊的进程而不是一个用户,这就意味着,它必须得起一个shell来更改它的环境变量才可以成功。之前我们都是直接使用终端让守护进程执行一些操作,而像更改环境变量这种操作他没办法直接实现。所以最后写了一个shell脚本来更改环境变量,然后守护进程执行shell脚本才成功。
最后有一点要提示的是,在Linux上跑matlab,apache这些,也会有类似的expat的不兼容问题,解决方法与上一致。这种方法只能说是将影响降到最低,但是还是会有Bug隐患,暂时还没有找到更好的解决方案。
[BUG随想录] expat不兼容BUG的更多相关文章
- [团队项目]expat不兼容BUG
本周五软工团队项目的第一次前后端全部对接时,出了一个蛋疼的错误. 最初起因是小丽叔出于安全的考虑,使用守护进程来跑Web服务器.守护进程(Daemon)是运行在后台的一种特殊进程,如果服务器用root ...
- DK NIO的BUG,例如臭名昭著的epoll bug,它会导致Selector空轮询,最终导致CPU 100%。
NIO的epoll空轮询bug - Lost blog - 博客园 https://www.cnblogs.com/JAYIT/p/8241634.html NIO的epoll空轮询bug JDK ...
- ie7,8常见bug,共计257个bug汇总?如何解决ie的历史bug
ie7.8常见bug,共计257个bug汇总 针对web开发者来说,浏览器的bug,特备是ie的bug是很多人的噩梦,因为ie的更新换代没有ff,chrome,safari,opera那么快,而且ie ...
- 软件测试中Bug的生命周期以及Bug的严重等级
软件测试中Bug的生命周期以及Bug的严重等级 我猜你们都会,但能说专业且全面不? 1.首先当测试人员接到一个项目或产品准备测试的时候,测试人员会根据测试用例一步步的来执行用例进行简单的功能测试.当测 ...
- 软件测试过程中如何区分什么是功能bug,什么是需求bug,什么是设计bug?
问题描述: 测试过程中如何区分什么是功能bug,什么是需求bug,什么是设计bug? 精彩答案: 会员 土土的豆豆: 本期问题其实主要是针对不同方面或纬度上对于bug的一个归类和定位. 个人认为,从软 ...
- 解Bug之路-串包Bug
解Bug之路-串包Bug 笔者很热衷于解决Bug,同时比较擅长(网络/协议)部分,所以经常被唤去解决一些网络IO方面的Bug.现在就挑一个案例出来,写出分析思路,以飨读者,希望读者在以后的工作中能够少 ...
- 记一次事件委托在 ios 下的兼容 bug
项目中碰到的兼容类 bug,记录一二. 页面上有几个同类型的控件,点击它们会触发一些事件,很显然,事件委托优于批量绑定.为了图方便,我将 click 事件绑定到了 document.body 上(绑定 ...
- IE兼容BUG汇总及解决方案(持续更新)
本篇为总结开发过程当中遇到的各种IE兼容性的小问题,比较复杂的会单开一篇文章来讲解. 另:我手头目前只有原生IE8,原生IE9,原生IE11,以及IE11模拟的IE5,7,8,9,10.因IE6太过古 ...
- 常见ie6的浏览器兼容bug
1.文字本身的大小不兼容 同样是font-size:14px的宋体文字,在不同浏览器下占的空间是不一样的, ie下实际占高16px,下留白3px ff 下实际占高17px,上留白1px,下留白3px ...
随机推荐
- vue2.0模拟锚点
在vue项目中,因为采用路由跳转,会导致无法使用常规的a标签配合ID的锚点功能. 解决办法: <a href="javascript:void(0)" @click=&quo ...
- CSS鼠标经过另类做法
HTML <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...
- python openpyxl.md
Openpyxl 创建一个工作簿 下面是创建一个工作簿.而每个工作簿至少一个工作表我们可以通过active获取正在运行的工作表. In [1]: from openpyxl import Workbo ...
- Actor模式初步入门
Actor模型概念 Actor模型为并行而生,简单说是未解决高并发的一种编程思路.在Actor模型中,主角是Actor,类似一种worker,Actor彼此之间直接发送消息,不需要经过什么中介,消息是 ...
- UPF Usage
在 multi-voltage design 中,当涉及到多个power supply 时,需要 upf 文件来描述power细节,现将 upf 中的基本概念和使用方法记录如下: upf 中的基本概念 ...
- PAT A1007 Maximum Subsequence Sum (25 分)——最大子列和,动态规划
Given a sequence of K integers { N1, N2, ..., NK }. A continuous subsequence is defined to ...
- sql语句截取字符串
Postgresql 当中有四种方式获取当前时间. 一:now() 通过now()获取的时间是最完整的时间,包括时区,秒也保留到了6位小数. select now(); ...
- laravel 5.5 《电商实战 》辅助函数
Laravel 提供了很多 辅助函数,有时候我们也需要创建自己的辅助函数. 这里介绍了 tinker,一个laravel内置的php交互式控制台,方便调试php代码 php artisan tinke ...
- 关于新版SDK报错You need to use a Theme.AppCompat theme的两种解决办法 - 转
android的一个小问题: Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme ( ...
- 2017-2018-1 20155320 嵌入式C语言——时钟
2017-2018-1 20155320 嵌入式C语言--时钟 要求: 在作业本上完成附图作业,要认真看题目要求. 提交作业截图 作弊本学期成绩清零(有雷同的,不管是给别人传答案,还是找别人要答案都清 ...