专栏首页MyPanda的学习笔记分享一种定位linux 下程序闪退的思路
原创

分享一种定位linux 下程序闪退的思路

这两天把自己的linux 系统升级了,但是遇到了一个比较大的坑,在此分享下解决方法(主要是定位程序闪退的其中一种思路),希望对阅读此文的你有所帮助,也欢迎留言更好的解决方法. 废话不多少,进入正题.

问题发生的过程:

升级系统的过程中,发生了中断,然后重新尝试升级,提示大量的软件包有multi-version(400+) 导致conflicting的存在,然后就有点MB了,关机肯定是不能的,万一reboot之后系统网络不能正常起来,岂不是更麻烦. 所以首先要解决 无法升级的问题, 解决此问题的大致过程如下:

A.

首先把系统中的软件列表导出(包含package name, arch, version)到文件,然后对结果进行分析,查看有哪些重名,并且cpu架构相同,但是版本不同的软件包。

导出上述信息的命令如下:

rpm -qa --qf "%{name}\t%{arch}\t%{version}\n"  >/tmp/installed_pkg.txt

对结果进行分析的命令如下(相信你一定有更简单的方法,以下命令仅供参考):

cat /tmp/installed_pkg.txt |sed 's/\t/-/' | awk '{if(a[$1]++)print $1}'

B.

找到上述符合条件的软件包之后,强制移除高版本的软件包. 用rpm -ev --nodeps <PKGNAME>, 因为整个升级过程因为中断而破坏,所以 卸载包的时候,可能会提示依赖,而用--nodeps 就是强制卸载对应的包.

C.

完成上述包的卸载之后,重新进行update. 成功完成了升级. 至此,看似解决了这个问题。 然后对系统做一个基本的check, reboot 系统进行验证.

D.

成功进入系统,也没有什么明显的错误,但是当要运行一个比较大的java程序的时候,这个应用程序居然一闪而过,什么错误也没有提示. 对于这种情况一般都是查找对应的程序log,然后看看到底什么原因导致程序闪退.

遗憾的是:鄙人对此软件根本不了解,仅仅停留在用户层,根本都不清楚到底日志都分布在哪里,更不用说应该重点看哪些日志了。所以最好的办法是:找vendor 进行解决。

作为一个运维人员,难道就没有好的办法来简单排查下吗?

在经过一番卸载重装以及依赖检查等一系列的操作之后,依然很困惑,没有弄好,也没有找到解决办法。

翻看以前笔记,看到了strace, 既然程序异常退出,那么肯定发生了异常,所以可以考虑用strace看看结果,说不定有所发现呢?

可问题是,程序因为退出比较快,运行程序后,没有时间来得及用strace命令就退出了,看起来是没有办法去trace systemcall.

strace 可以跟踪命令执行时候的系统调用,尝试用 strace -f "COMMAND" 的方式,可是发现 该程序不能在root 身份下运行,而不是root 身份的情况下,该命令又报如下的错误,这个错误在直接运行的时候并不存在,看来用 strace -f "COMMAND" 的方式并不好用.

write(2, "strace: exec: Exec format error\n", 32strace: exec: Exec format error
) = 32
exit_group(1)                           = ?
+++ exited with 1 +++

既然 strace -f "COMMAND" 并不好用,那么依然考虑 strace -p PID的方式,手动获取PID 是没有办法了,毕竟程序是 闪退. 既然手动不可以,思索了好久,那么就用脚本来自动获取PID吧,基本的解决思路如下:

1.

创建一个监控进程pid的脚本(示例如下),然后运行该脚本,假定该session 为1. 该简单脚本会在monitor到PID之后,退出循环并用strace -f -p 进行trace跟踪.

#!/bin/bash
get_pid=""
while [ 1 -gt 0 ];do   #如下的PROCESS_KEYSTRING 需要替换你程序的启动命令中的关键字.
	get_pid=`ps -ef | grep PROCESS_KEYSTRING | grep -Evi grep | awk '{print $2}'`
	if [ -n "$get_pid" ];then 
		break
	fi
done
echo $get_pid
strace -f -p $get_pid

2.

新开一个session 2, 运行出现问题的程序,如果是图形程序,那么直接运行就可以 3.

返回session 1, 查看输出的结果, 在这里确实发现了如下的异常.

 {": ", 2}, {"error while loading shared libra"..., 36}, {": ", 2}, {"libavahi-glib.so.1", 18}, {": ", 2}, {"cannot open shared object file", 30}, {": ", 2}, {"No such file or directory", 25}, {"\n", 1}], 10) = 138
[pid  3310] exit_group(127)             = ?
[pid  3310] +++ exited with 127 +++
<... rt_sigtimedwait resumed> )         = -1 EAGAIN (Resource temporarily unavailable)
open("/proc/3310", O_RDONLY)            = -1 ENOENT (No such file or directory)
exit_group(0)                           = ?
+++ exited with 0 +++

至此,闪退的原因看起来是缺少了库文件libavahi-glib.so.1, 然后找到这个库文件对应的软件包,安装软件包,然后再次验证, 问题成功修复.

如果你有更好的方法,欢迎留言评论!

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

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • pycharm 入门基础配置

    pycharm是python的IDE 工具,这个工具很强大,之所以强大,所以对于其配置也可以很复杂,作为一个pycharm的小白,以下的基本的使用是必需的,然后...

    qsjs
  • 简单实现创建centos的rootfs

    在使用docker 的时候,我们通常都有用到base image, 这里以centos为例,我们通常通过: docker search centos , doc...

    qsjs
  • python中函数位置参数与关键字参数

    Python中函数的参数依照不同的方式,可以有不同的分类,这里以“位置参数”与“关键字参数”两类进行讨论.

    qsjs
  • 基础知识 | 每日一练(166)

    士人有百折不回之真心,才有万变不穷之妙用。立业建功,事事要从实地着脚,若少慕声闻,便成伪果;讲道修德,念念要从虚处立基,若稍计功效,便落尘情。 ...

    闫小林
  • ASP.Net请求处理机制初步探索之旅 - Part 5 ASP.Net MVC请求处理流程

    开篇:上一篇我们了解了在WebForm模式下一个Page页面的生命周期,它经历了初始化Init、加载Load以及呈现Render三个重要阶段,其中构造了页面控件...

    Edison Zhou
  • 移动客户端的证书、策略、信任评估体系

    安全体系一直都是公司需要完成基础设施的支撑。安全包括了数据安全、通信安全、操作安全、代码安全等功能。有的组织则提供了一套标准的安全规范和技术标准比如PKI。而操...

    欧阳大哥2013
  • SpringBoot第3小节:数据库操作(上)

    Spring-Data-Jpa,定义了一系列对象持久化的标准,就是Hibernate的整合。这节讲的是datasouce和jpa的配置。 1.在pom.xml文...

    MonroeCode
  • java基础Haep(堆)和Stack(栈)区别

    简单的可以理解为: heap:是由malloc之类函数分配的空间所在地。地址是由低向高增长的。  stack:是自动分配变量,以及函数调用的时候所使用的一些空...

    xiangzhihong
  • jquery data属性的使用

    windseek
  • iOS自动化探索(五)自动化测试框架pytest - Assert断言的使用

    pytest允许使用标准的python assert语法,用来校验expectation and value是否一致

    周希

扫码关注云+社区

领取腾讯云代金券