专栏首页MyPanda的学习笔记文件丢失?损坏?兼容性问题?到底是什么导致了错误

文件丢失?损坏?兼容性问题?到底是什么导致了错误

在日常的维护中,免不了和文件打交道,文件涉及的问题有很多类,这里讨论: 文件丢失,损坏,兼容性问题。 而对于文件丢失导致的问题一般比较容易定位,而文件损坏,特别是兼容性问题,这类排查起来就比较繁琐. 本文提供一种解决思路,望能起到抛砖引玉的作用.

Symptom:

[root@www ~]# curl 127.0.0.1
curl: (2) Failed initialization
[root@www ~]# 

解决步骤:

  1. 这个提示非常的简单,就是初始化失败,没有更多的信息;
  2. 用 strace来查看下系统调用(open),因为对文件的操作必定要调用open函数,这里主要验证是否存在“文件丢失”的问题。 首先查找系统曾经尝试打开,但是没有找到的文件列表:
[root@www lib64]# strace -f -e open curl 127.0.0.1 2>&1 | grep -Ei "No such file or directory"  | awk -F'[()]' '{print $2}' | awk -F, '{print $1}' | tr -d "\"" | xargs -I{} basename {} | uniq 
libcurl.so.4
libssl3.so
libsmime3.so
libnss3.so
libnssutil3.so
libplds4.so
libplc4.so
libnspr4.so
libpthread.so.0
libdl.so.2
libz.so.1
libc.so.6
libidn.so.11
libldap-2.4.so.2
librt.so.1
libgssapi_krb5.so.2
libkrb5.so.3
libk5crypto.so.3
libcom_err.so.2
libssh2.so.1
liblber-2.4.so.2
libresolv.so.2
libsasl2.so.3
libssl.so.10
libcrypto.so.10
libkrb5support.so.0
libkeyutils.so.1
libcrypt.so.1
libselinux.so.1
libfreebl3.so
libpcre.so.1
legacy-settings
.curlrc
[root@www lib64]# strace -f -e open curl 127.0.0.1 2>&1 | grep -Ei "No such file or directory"  | awk -F'[()]' '{print $2}' | awk -F, '{print $1}' | tr -d "\"" | xargs -I{} basename {} | uniq  | wc -l 
33

然后 用strace 查看成功打开的文件列表:

[root@www lib64]# strace -f -e open curl 127.0.0.1 2>&1 | grep -Evi  "= \-1" | awk -F'["]' '{print $2}' | xargs -I{} basename {} 
ld.so.cache
libcurl.so.4
libssl3.so
libsmime3.so
libnss3.so
libnssutil3.so
libplds4.so
libplc4.so
libnspr4.so
libpthread.so.0
libdl.so.2
libz.so.1
libc.so.6
libidn.so.11
libldap-2.4.so.2
librt.so.1
libgssapi_krb5.so.2
libkrb5.so.3
libk5crypto.so.3
libcom_err.so.2
libssh2.so.1
liblber-2.4.so.2
libresolv.so.2
libsasl2.so.3
libssl.so.10
libcrypto.so.10
libkrb5support.so.0
libkeyutils.so.1
libcrypt.so.1
libselinux.so.1
libfreebl3.so
libpcre.so.1
filesystems
locale-archive
[root@www lib64]# strace -f -e open curl 127.0.0.1 2>&1 | grep -Evi  "= \-1" | awk -F'["]' '{print $2}' | xargs -I{} basename {}  | uniq | wc -l
34

最后,比较两个文件(grep -Ff 命令实现),发现真正没有找到的文件只有:.curlrc,而这个文件并不会导致curl出错,因为它属于curl的配置文件, man curl 有如下的解释:

FILES
       ~/.curlrc
              Default config file, see -K, --config for details.
  1. 由以上的结果可以看出,不会是 找不到对应文件导致的初始化失败;其实对于查找是否有动态链接库文件丢失可以用: ldd 命令,ldd命令输出的结果中会报告有哪些文件是not found的,而通过strace中的系统调用(open),可以获得除了动态链接库之外的其它文件,所以这里用strace来确保没有其他文件丢失,而不仅仅是动态链接库文件
  2. 文件虽然没有缺失,那么是否有可能是 文件遭到了损坏导致的呢? 请参考文章: ldd命令排查文件crash的问题. 这里省略验证过程,验证的结果是:发现没有文件有损坏的情况;
  3. 是不是文件的兼容性导致的问题呢? 我们通过ldd命令可以查看相应的依赖,本质上,依赖的不是文件,而是动态链接库文件中的函数,如果出现了兼容性的问题,那么对应的函数可能会报错. 依据这一点,我们可以根据报错信息来查找 “错误信息” 是来自于哪个动态链接库,从而找到报错的库文件,进一步查看其对应的rpm包是否有兼容性文件;
[root@www lib64]# ldd `which curl`
    linux-vdso.so.1 =>  (0x00007ffe77150000)
    libcurl.so.4 => /lib64/libcurl.so.4 (0x00007fbd9c354000)
    libssl3.so => /lib64/libssl3.so (0x00007fbd9c102000)
    libsmime3.so => /lib64/libsmime3.so (0x00007fbd9bedb000)
    libnss3.so => /lib64/libnss3.so (0x00007fbd9bbae000)
    libnssutil3.so => /lib64/libnssutil3.so (0x00007fbd9b97e000)
    libplds4.so => /lib64/libplds4.so (0x00007fbd9b77a000)
    libplc4.so => /lib64/libplc4.so (0x00007fbd9b575000)
    libnspr4.so => /lib64/libnspr4.so (0x00007fbd9b337000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fbd9b11b000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007fbd9af17000)
    libz.so.1 => /lib64/libz.so.1 (0x00007fbd9ad01000)
    libc.so.6 => /lib64/libc.so.6 (0x00007fbd9a934000)
    libidn.so.11 => /lib64/libidn.so.11 (0x00007fbd9a701000)
    libldap-2.4.so.2 => /lib64/libldap-2.4.so.2 (0x00007fbd9a4ac000)
    librt.so.1 => /lib64/librt.so.1 (0x00007fbd9a2a4000)
    libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007fbd9a057000)
    libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007fbd99d6e000)
    libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007fbd99b3b000)
    libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007fbd99937000)
    libssh2.so.1 => /lib64/libssh2.so.1 (0x00007fbd9970d000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fbd9c5a9000)
    liblber-2.4.so.2 => /lib64/liblber-2.4.so.2 (0x00007fbd994fe000)
    libresolv.so.2 => /lib64/libresolv.so.2 (0x00007fbd992e5000)
    libsasl2.so.3 => /lib64/libsasl2.so.3 (0x00007fbd990c8000)
    libssl.so.10 => /lib64/libssl.so.10 (0x00007fbd98e56000)
    libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007fbd989f4000)
    libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007fbd987e4000)
    libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007fbd985e0000)
    libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007fbd983a9000)
    libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fbd98182000)
    libfreebl3.so => /lib64/libfreebl3.so (0x00007fbd97f7f000)
    libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fbd97d1d000)
[root@www lib64]# curl -i 127.0.0.1
curl: (2) Failed initialization
[root@www lib64]# 

通过strings 命令查看对应的动态链接库文件的报错信息,通过比对,最终发现有且只有 /lib64/libcurl.so.4 这个文件有 "Failed initialization" 这个报错信息,然后进一步发现该文件所属的rpm包为rhel6发行版的,而当前的os是centos7. 所以替换掉这个旧包,然后问题顺利解决;

本文原创,转载请著名出处

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ldd命令排查文件crash的问题

    ldd用来输出二进制可执行文件或者库文件的依赖;它本是一个script, 并不是binary 文件,其本质上只是设置了环境变量: D_TRACE_LOADED...

    qsjs
  • nginx配置学习--反向代理篇

    这里主要讨论服务器端的情况,在上图中,服务端侧的Server Proxy 就是一个反向代理服务器。

    qsjs
  • Here Documents 结合expect的使用--(2)

    我们已经知道expect可以帮我们自动完成“交互工作”,但是如果我们需要拿到 通过expect spawn的sub-process 所执行命令的结果,那么怎么做...

    qsjs
  • SDK热更系列之如何获取应用在当前设备上的so对应的指令集

    子勰
  • Linux下so动态库一些不为人知的秘密

    Linux 下有动态库和静态库,动态库以.so为扩展名,静态库以.a为扩展名。二者都使用广泛。本文主要讲动态库方面知识。

    刘盼
  • Android 动态库压缩壳的实现

    计算机软件领域所说的壳实际上是一种软件加密技术。壳主要分为两大类:加密壳和压缩壳,加密壳侧重于防止软件被篡改,而压缩壳则侧重于减小软件体积。其实,在Window...

    小时光
  • 一种Android App在Native层动态加载so库的方案

    这篇文章通过实战案例,介绍了一种有条理的组织Native层代码层级结构的方法。并且,在良好的代码层级、作用分工的基础上,实现了动态的按需加载、卸载so库。文章...

    QQ音乐技术团队
  • Android 动态加载so文件

    在开发中,我们时常会遇到包体积过大的情况。其中,一个大的第三方so文件,经常会让人头痛。那么,能否动态加载.so文件呢?答案是可以的。

    Oceanlong
  • Linker加载so失败问题分析

    原文链接:https://wetest.qq.com/lab/view/421.html

    WeTest质量开放平台团队
  • ldd命令排查文件crash的问题

    ldd用来输出二进制可执行文件或者库文件的依赖;它本是一个script, 并不是binary 文件,其本质上只是设置了环境变量: D_TRACE_LOADED...

    qsjs

扫码关注云+社区

领取腾讯云代金券