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

最初起因是小丽叔出于安全的考虑,使用守护进程来跑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. VS2010自行编译OpenCV2.4.4时缺少python27_d.lib的解决方法

    错误 24 error LNK1104: 无法打开文件“python27_d.lib”  C:\OpenCV\VS2013_64\modules\python\LINK opencv_python 编 ...

  2. Git同时使用不同平台代码仓库

    问题描述 公司项目使用代码仓库为gitinn/gitlab等,个人项目使用github进行托管,而公司项目和个人项目设置的邮箱和用户名是不同的,而ssh的密钥对又是基于这两个信息生成的,所以此时想要同 ...

  3. ping和telnet

    ping命令 验证IP的可达性 本地ping虚拟机中的ip地址: telnet命令 验证服务的可用性,某个端口是否打开 连接到服务器的端口上: 几种场景: (1)ping通,telnet不行 ip地址 ...

  4. PAT B1007 素数对猜想 (20 分)

    让我们定义d​n​​为:d​n​​=p​n+1​​−p​n​​,其中p​i​​是第i个素数.显然有d​1​​=1,且对于n>1有d​n​​是偶数.“素数对猜想”认为“存在无穷多对相邻且差为2的素 ...

  5. 修复在“Android 在ScrollView中嵌入ViewPage后ViewPage不能很好的工作的问题解决”这篇博客中MyScrollView出现滑动一会就不会上下滑动的问题

    在“Android 在ScrollView中嵌入ViewPage后ViewPage不能很好的工作的问题解决”,这篇博客中的大部分问题已经解决了. 唯一遗憾的是,ViewPage随人能够工作了,但是My ...

  6. (转)LVS+Keepalived使用总结 vip丢失

    /sbin/ifconfig lo: $vip broadcast $vip netmask 255.255.255.255 up /sbin/ifconfig lo: 172.16.254.63 b ...

  7. golang sqlite3 CRUD

    package main import ( "database/sql" "fmt" "log" _ "github.com/ma ...

  8. sql的一个查询,情景:a表中存在的数据,且在b表中不存在 (not in,not exists

    这里需要强调的是b表中关联字段的值是唯一的这种情况,并且b表尽量是列举类型的,意味着表比较小. ==================== 准备数据: 1. 建两个类似表,test1,test2,只有i ...

  9. 配置Docker镜像加速器

    由于在国内下载docker官方镜像的速度很慢且容易报错,因此需要配置docker镜像加速器来解决这个问题,加速器就是镜像代理的概念,只代理公有镜像,报错结果如下: net/http: request ...

  10. 大数据入门第十七天——storm上游数据源 之kafka详解(二)常用命令

    一.kafka常用命令 1.创建topic bin/kafka-topics. --replication-factor --zookeeper mini1: // 如果配置了PATH可以省略相关命令 ...