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

最初起因是小丽叔出于安全的考虑,使用守护进程来跑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的更多相关文章

  1. [团队项目]expat不兼容BUG

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

  2. 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 ...

  3. ie7,8常见bug,共计257个bug汇总?如何解决ie的历史bug

    ie7.8常见bug,共计257个bug汇总 针对web开发者来说,浏览器的bug,特备是ie的bug是很多人的噩梦,因为ie的更新换代没有ff,chrome,safari,opera那么快,而且ie ...

  4. 软件测试中Bug的生命周期以及Bug的严重等级

    软件测试中Bug的生命周期以及Bug的严重等级 我猜你们都会,但能说专业且全面不? 1.首先当测试人员接到一个项目或产品准备测试的时候,测试人员会根据测试用例一步步的来执行用例进行简单的功能测试.当测 ...

  5. 软件测试过程中如何区分什么是功能bug,什么是需求bug,什么是设计bug?

    问题描述: 测试过程中如何区分什么是功能bug,什么是需求bug,什么是设计bug? 精彩答案: 会员 土土的豆豆: 本期问题其实主要是针对不同方面或纬度上对于bug的一个归类和定位. 个人认为,从软 ...

  6. 解Bug之路-串包Bug

    解Bug之路-串包Bug 笔者很热衷于解决Bug,同时比较擅长(网络/协议)部分,所以经常被唤去解决一些网络IO方面的Bug.现在就挑一个案例出来,写出分析思路,以飨读者,希望读者在以后的工作中能够少 ...

  7. 记一次事件委托在 ios 下的兼容 bug

    项目中碰到的兼容类 bug,记录一二. 页面上有几个同类型的控件,点击它们会触发一些事件,很显然,事件委托优于批量绑定.为了图方便,我将 click 事件绑定到了 document.body 上(绑定 ...

  8. IE兼容BUG汇总及解决方案(持续更新)

    本篇为总结开发过程当中遇到的各种IE兼容性的小问题,比较复杂的会单开一篇文章来讲解. 另:我手头目前只有原生IE8,原生IE9,原生IE11,以及IE11模拟的IE5,7,8,9,10.因IE6太过古 ...

  9. 常见ie6的浏览器兼容bug

    1.文字本身的大小不兼容 同样是font-size:14px的宋体文字,在不同浏览器下占的空间是不一样的, ie下实际占高16px,下留白3px ff 下实际占高17px,上留白1px,下留白3px ...

随机推荐

  1. Python高级网络编程系列之基础篇

    一.Socket简介 1.不同电脑上的进程如何通信? 进程间通信的首要问题是如何找到目标进程,也就是操作系统是如何唯一标识一个进程的! 在一台电脑上是只通过进程号PID,但在网络中是行不通的,因为每台 ...

  2. shiro实战系列(十四)之配置

    Shiro 被设计成能够在任何环境下工作,从最简单的命令行应用程序到最大的的企业群集应用.由于环境的多样性,使得许多配置机制适用于它的配置. 一. 许多配置选项 Shiro的SecurityManag ...

  3. 一兄弟把/etc/init.d/functions误删除了,这是多么悲催的节奏啊;

    RPM resource /lib/lsb/init-functions /lib/lsb/init-functions vs. /etc/init.d/functions in init scrip ...

  4. $\rm{NOIP}$前的模拟题整理·菜鸡互啄篇

    嗯,打算整理一下我们机房菜鸡互啄中比较不错的题-- 大概情况就是每个人出三道题,然后互测这种感觉-- 至于某些Y姓基佬.Z姓基佬偷偷出原题--就不说了233 嗯,剩下的就先\(magpie\)着吧23 ...

  5. [浅谈CSS核心概念] CSS元素类型和盒模型

    元素类型 在CSS中,HTML标签元素分为三种类型: 块状元素 内联元素(也叫行内元素) 内联块状元素 它们之间的区别在于: 块级元素会独占一行,内联元素和内联块状元素则都会在一行内显示 块状元素和内 ...

  6. AbelSu的区块链笔记

    最近几年,像比特币.以太坊.ICO.区块链等概念突然成为互联网热门话题,今天写这篇博客,也是做一些笔记,大概说一下对这个的解释和其他相关内容. 区块链: 区块链是分布式数据存储.点对点传输.共识机制. ...

  7. PHP设计模式——訪问者模式

    声明:本系列博客參考资料<大话设计模式>,作者程杰. 訪问者模式表示一个作用于某对象结构中的各元素的操作. 它使你能够在不改变各元素类的前提下定义作用于这些元素的新操作. UML类图: w ...

  8. 2019年北航OO第2单元(电梯模拟)总结

    1 三次作业的设计策略 经过了上一单元的训练,我也积累了一些设计策略上的经验.在这一单元的一开始,我便尽可能地把问题中的各个功能实体区分开来,分别封装成类,以便于随后作业中新需求的加入.与此同时,我也 ...

  9. Verilog使用相对路径时应注意的问题

    在Quartus编译环境下,使用include, fopen等文件操作指令时,会涉及到文件路径问题. 以 E:\quartus_project\sd_card_controller\rtl\sd_wb ...

  10. 20155218《网络对抗》Exp8 Web基础

    20155218<网络对抗>Exp8 Web基础 1.基础问题回答 1.什么是表单? 表单是一个包含表单元素的区域,表单元素是允许用户在表单中(比如:文本域.下拉列表.单选框.复选框等等) ...