前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >linux下 debug 工具 strace 应用之【查找命令依赖库文件】

linux下 debug 工具 strace 应用之【查找命令依赖库文件】

作者头像
大大大黑白格子
发布2020-06-22 14:15:38
2K0
发布2020-06-22 14:15:38
举报
文章被收录于专栏:云服务笔记云服务笔记
Strace 是linux系统中一个用来跟踪系统调用的简易工具,它最简单的用途就是跟踪一个程序整个生命周期里所有的系统调用,并把调用参数和返回值以文本的方式输出
当然它还可以做更多的事情:
  • strace 可以过筛选出特定的系统调用。
  • strace 可以记录系统调用的次数,时间,成功和失败的次数。
  • strace 可以跟踪发给进程的信号。
  • strace 可以通过pid附加到任何正在运行的进程上
问题背景:
centos下执行rpm命令时提示缺失 libplds4.so 的库文件,这导致系统命令执行失败
代码语言:javascript
复制
root@BJ-CentOS7 ~ # rpm -aq | grep ssh
rpm: error while loading shared libraries: libplds4.so: cannot open shared object file: No such file or directory
image.png
image.png
分析解决:
1. 在系统中通过 find 命令查找 libplds4.so 文件,发现文件实际是存在的,但是执行命令怎么还是报错没有这个文件呢?
代码语言:javascript
复制
root@BJ-CentOS7 ~ # find / -name libplds4.so
/usr/lib64/libplds4.so   (这里)
2. 通过 strace 命令追踪 rpm 命令执行过程,发现这里调用的文件绝对路径是 /lib64/libplds4.so ,原因是 /lib64 目录是 /usr/lib64 软链过来的,find 命令默认不查找软链目录,而系统命令调用系统库文件实际绝对路径是软链后的路径,核查发现只是软链后的 /lib64 目录下 libplds4.so 文件丢失了,这里从别的系统导入或从 /usr/lib64 目录下cp、ln一个对应文件到 /lib64 目录解决问题

查看 /lib64 目录是 /usr/lib64 的链接目录(文件权限第一位为 l 代表该文件/目录是链接文件/目录)

image.png
image.png

使用 strace 命令追踪系统命令执行调用的系统文件路径(参数 -e open 用于观察目前进程正引用哪些文件)

代码语言:javascript
复制
root@BJ-CentOS7 ~ # strace -e open rpm -qa | grep ssh
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/librpm.so.3", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/librpmio.so.3", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libcap.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libacl.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libdb-5.3.so", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libbz2.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libelf.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/liblzma.so.5", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/liblua-5.1.so", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libm.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libnss3.so", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libpopt.so.0", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libz.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libpcre.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libattr.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libnssutil3.so", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libplc4.so", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libplds4.so", O_RDONLY|O_CLOEXEC) = 3         libplds4.so文件的绝对路径获取到了
open("/lib64/libnspr4.so", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/librt.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/proc/filesystems", O_RDONLY)     = 3
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/rpm/rpmpopt-4.11.3", O_RDONLY) = 3
... ...
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Strace 是linux系统中一个用来跟踪系统调用的简易工具,它最简单的用途就是跟踪一个程序整个生命周期里所有的系统调用,并把调用参数和返回值以文本的方式输出
  • 当然它还可以做更多的事情:
  • 问题背景:
    • centos下执行rpm命令时提示缺失 libplds4.so 的库文件,这导致系统命令执行失败
    • 分析解决:
      • 1. 在系统中通过 find 命令查找 libplds4.so 文件,发现文件实际是存在的,但是执行命令怎么还是报错没有这个文件呢?
        • 2. 通过 strace 命令追踪 rpm 命令执行过程,发现这里调用的文件绝对路径是 /lib64/libplds4.so ,原因是 /lib64 目录是 /usr/lib64 软链过来的,find 命令默认不查找软链目录,而系统命令调用系统库文件实际绝对路径是软链后的路径,核查发现只是软链后的 /lib64 目录下 libplds4.so 文件丢失了,这里从别的系统导入或从 /usr/lib64 目录下cp、ln一个对应文件到 /lib64 目录解决问题
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档