本周五软工团队项目的第一次前后端全部对接时,出了一个蛋疼的错误。

最初起因是小丽叔出于安全的考虑,使用守护进程来跑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隐患,暂时还没有找到更好的解决方案。

[团队项目]expat不兼容BUG的更多相关文章

  1. [BUG随想录] expat不兼容BUG

    本周五软工团队项目的第一次前后端全部对接时,出了一个蛋疼的错误. 最初起因是小丽叔出于安全的考虑,使用守护进程来跑Web服务器.守护进程(Daemon)是运行在后台的一种特殊进程,如果服务器用root ...

  2. 《BUG创造队》第六次作业:团队项目系统设计改进与详细设计

    项目 内容 这个作业属于哪个课程 2016级软件工程 这个作业的要求在哪里 实验十 团队作业6:团队项目系统设计改进与详细设计 团队名称 BUG创造队 作业学习目标 1.编写完整<软件系统设计说 ...

  3. 《BUG创造队》第二次团队作业:团队项目选题报告

    项目 内容 这个作业属于哪个课程 2016级软件工程 这个作业的要求在哪里 实验六 团队作业2:团队项目选题 团队名称 BUG创造队 作业学习目标 可行性自评总结,并且采用NABCD方法进行项目初步分 ...

  4. 《BUG创造队》第三次作业:团队项目原型设计与开发

    项目 内容 这个作业属于哪个课程 2016级软件工程 这个作业的要求在哪里 实验六 团队作业3:团队项目原型设计与开发 团队名称 BUG创造队 作业学习目标 ①掌握软件原型开发技术:②学会使用软件原型 ...

  5. 《BUG创造队》第四次作业:基于原型的团队项目需求调研与分析

    项目 内容 这个作业属于哪个课程 2016级软件工程 这个作业的要求在哪里 实验八 团队作业4:基于原型的团队项目需求调研与分析 团队名称 BUG创造队 作业学习目标 (1)体验以原型设计为基础的团队 ...

  6. THE BUG 队第一次团队项目作业

    队名: THE BUG 队 2.队员学号: 杨梓琦 3118005115(队长) 温海源,3118005109 陈杰才,3118005089 李华,3118005097 钟明康,3118005123 ...

  7. hots团队项目终审报告

    一.团队成员: 徐钧鸿: 1994年1月19日生人,摩羯座最后一天.所以有摩羯的强迫症和水瓶古怪的性格 暂且算队长吧…… 高中的时候因为兴趣学了竞赛,于是就入坑了,于是就来北航学计算机了 兴趣面很广, ...

  8. 团队项目——Alpha发布1

    这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/GeographicInformationScience/homework 这个作业要求在哪里 https ...

  9. Surprise团队项目总结

    Surprise团队项目总结 项目实现情况 实现人人模式:2个用户在同一台电脑上进行切磋下棋,即实现五子棋游戏的基本功能 实现人机模式:初级模式已经实现,可以进行人机交互,但是还没达到智能判断下棋点 ...

随机推荐

  1. Code Consultation

    Need help architecting or coding your application? You can get technical help with building applicat ...

  2. [leetcode]Find Minimum in Rotated Sorted Array @ Python

    原题地址:https://oj.leetcode.com/problems/find-minimum-in-rotated-sorted-array/ 解题思路:话说leetcode上面的二分查找题目 ...

  3. 闲聊Redshift与日本CG行业的近况

    最近不少朋友跟我说Redshift如何如何,恰巧我目前工作的工作室花费了巨资购买了Redshift和Quadro M4000,妄图在艺术家工作站上做一个新的动画项目,把渲染时间控制在15分钟以下.结果 ...

  4. fresco Bitmap too large to be uploaded into a texture

    fresco加载图片方法 布局文件引入 xmlns:fresco="http://schemas.android.com/apk/res-auto" <com.faceboo ...

  5. [置顶] 开关电源的pcb设计规范

    参数设置相邻导线间距必须能满足电气安全要求 印制线的长度和宽度会影响其阻抗和感抗 尽量加粗接地线若接地线很细 按照电路的流程安排各个功能电路单元的位置 在任何开关电源设计中,pcb板的物理设计都是最后 ...

  6. web优化规范

    转载自:http://www.tuicool.com/articles/UZR3Az

  7. 找回Win8.1(windows server 2012 R2)的双拼

    一.微软拼音的选项,只能在metro界面修改: 鼠标移动到屏幕右下,出现metro的菜单,选"设置"然后选最下面的"更改电脑设置" 时间和设置->区域和语 ...

  8. 领域驱动开发推荐代码示例 — Microsoft NLayerApp

    简介: Microsoft NLayerApp是由微软西班牙团队出品的基于.NET 4.0的“面向领域N层分布式架构”代码示例,在codeplex上的地址是:http://microsoftnlaye ...

  9. boost 1.56.0 编译及使用

    boost的编译和使用,经过搜集资料和总结,记录成文.感谢文后所列参考资料的作者. 1 下载 地址:http://sourceforge.net/projects/boost/files/boost/ ...

  10. CSS - Transform(Translate) abnormal shadow in firefox

    问题:当在Firefox中实现动画translate时,会出现虚影的状况: 经查找相关的解决方法,父容器添加样式:outline: 1px solid transparent;//即可解决问题. 但不 ...