linux下发布的执行文件崩溃的问题定位 心得一则
C++ Release版本发布到客户处执行时,如果程序崩溃,有什么办法能够快速的确认程序的问题呢?
- 如果能gdb调试的话,比较简单了,可以使用gdb命令,类似如下:
gdb ##
set args ****
b main
r
#eip
x/10i 0xb7362040
- 如果开发不在现场等情况,此时可以使用记录崩溃日志的方法进行分析
此时首先要求的是项目使用类似google breakpad这个工具库,对崩溃进行记录
默认breakpad生成的是dmp文件,可以使用breakpad带的工具转换成文字进行查看,如下:
./minidump-2-core -m 7ee5c76f-afe2-f9bd-564dedb7-57d73e0c.dmp >core
./minidump_stackwalk 7ee5c76f-afe2-f9bd-564dedb7-57d73e0c.dmp > dbg.txt
此时根据如上的信息可以确定哪个模块的地址出错了
由于一般的情况,发布的库的源代码对应版本提取,编译比较麻烦,可以直接拿对应出错的库或执行文件进行分析,使用objdump生成出汇编文件,通过对应地址可以初步找到哪个函数出问题,至于猜测出来的代码,那需要根据分析情况构建单元测试或者重新上线进行检验
具体的一些过程实例如下:
objectdump -d ##.so > ##.o
vim ##.o
6 libTaps2.so + 0xa452d
./minidump_stackwalk 7ee5c76f-afe2-f9bd-564dedb7-57d73e0c.dmp
Thread 7 (crashed)
0 linux-gate.so + 0x430
eip = 0xb78b4430 esp = 0xb2952e18 ebp = 0xb2952e30 ebx = 0x00000fff
esi = 0xb5b98864 edi = 0xb5b97ff4 eax = 0x00000000 ecx = 0x00001008
edx = 0x00000006 efl = 0x00000206
Found by: given as instruction pointer in context
1 libc-2.11.1.so + 0x2da81
eip = 0xb5a6fa82 esp = 0xb2952e38 ebp = 0xb2952f58
Found by: previous frame's frame pointer
2 libstdc++.so.6.0.13 + 0xbf52e
eip = 0xb5cba52f esp = 0xb2952f60 ebp = 0xb2952fa8
Found by: previous frame's frame pointer
3 libstdc++.so.6.0.13 + 0xbd464
eip = 0xb5cb8465 esp = 0xb2952fb0 ebp = 0xb2952fc8
Found by: previous frame's frame pointer
4 libstdc++.so.6.0.13 + 0xbd4a1
eip = 0xb5cb84a2 esp = 0xb2952fd0 ebp = 0xb2952fe8
Found by: previous frame's frame pointer
5 libstdc++.so.6.0.13 + 0xbd5e0
eip = 0xb5cb85e1 esp = 0xb2952ff0 ebp = 0xb2953008
Found by: previous frame's frame pointer
6 libTaps2.so + 0xa452d
eip = 0xb738c52e esp = 0xb2953010 ebp = 0xb2953048
Found by: previous frame's frame pointer
7 libTaps2.so + 0x7a03f
eip = 0xb7362040 esp = 0xb2953050 ebp = 0xb2953068
Found by: previous frame's frame pointer
8 libTaps2.so + 0x6aa9d
eip = 0xb7352a9e esp = 0xb2953070 ebp = 0xb29530b8
Found by: previous frame's frame pointer
9 libTaps2.so + 0x68e69
eip = 0xb7350e6a esp = 0xb29530c0 ebp = 0xb2953108
Found by: previous frame's frame pointer
10 libTaps2.so + 0x691a2
eip = 0xb73511a3 esp = 0xb2953110 ebp = 0xb2953158
Found by: previous frame's frame pointer
11 libTaps2.so + 0x71b9c
eip = 0xb7359b9d esp = 0xb2953160 ebp = 0xb29531a8
Found by: previous frame's frame pointer
12 libTaps2.so + 0x71db1
eip = 0xb7359db2 esp = 0xb29531b0 ebp = 0xb29531b8
Found by: previous frame's frame pointer
13 libTaps2.so + 0xa8ac9
eip = 0xb7390aca esp = 0xb29531c0 ebp = 0xb2953208
Found by: previous frame's frame pointer
14 libTaps2.so + 0xa98d8
eip = 0xb73918d9 esp = 0xb2953210 ebp = 0xb2953288
Found by: previous frame's frame pointer
15 libTaps2.so + 0xa78b0
eip = 0xb738f8b1 esp = 0xb2953290 ebp = 0xb29532b8
Found by: previous frame's frame pointer
16 libTaps2.so + 0xa7960
eip = 0xb738f961 esp = 0xb29532c0 ebp = 0xb29532e8
Found by: previous frame's frame pointer
17 libTaps2.so + 0xa88a5
eip = 0xb73908a6 esp = 0xb29532f0 ebp = 0xb2953338
Found by: previous frame's frame pointer
18 libTaps2.so + 0x7207a
eip = 0xb735a07b esp = 0xb2953340 ebp = 0xb2953358
Found by: previous frame's frame pointer
19 tapsdaemon + 0x2e168
eip = 0x08076169 esp = 0xb2953360 ebp = 0xb2953388
Found by: previous frame's frame pointer
20 libpthread-2.11.1.so + 0x596d
eip = 0xb5ba196e esp = 0xb2953390 ebp = 0xb2953488
Found by: previous frame's frame pointer
21 libc-2.11.1.so + 0xcda4d
eip = 0xb5b0fa4e esp = 0xb2953490 ebp = 0x00000000
Found by: previous frame's frame pointer
linux下发布的执行文件崩溃的问题定位 心得一则的更多相关文章
- Linux下创建可执行bin安装文件
需求及应用场景 1.简化操作.一般的软件安装过程,如果想要精简步骤,我们一般会将需要在命令行中输入的命令写成一个脚本,同时将安装介质准备好.我们将脚本和安装介质上传到生产环境,然后通过执行脚本来完成安 ...
- [置顶] Linux下发布QT程序
Linux下发布QT程序 概述 无论在windows下还是在linux下,可执行程序的运行都依赖于相关的运行库,我们需要将依赖的库找到放到特定的位置,让可执行文件能够找到.在不知道可执行文件依赖哪些库 ...
- 如何用javac 和java 编译运行整个Java工程 (转载)【转】在Linux下编译与执行Java程序
如何用javac 和java 编译运行整个Java工程 (转载) http://blog.csdn.net/huagong_adu/article/details/6929817 [转]在Linux ...
- linux下生成core dump文件方法及设置
linux下生成core dump文件方法及设置 from:http://www.cppblog.com/kongque/archive/2011/03/07/141262.html core ...
- linux下php上传文件注意
linux下php上传文件注意1.修改上传目录权限linux 修改某目录下所有所有子目录权限chmod -R 777 html修改某目录为任何用户都用写读执行权限chmod a+rwx html2.设 ...
- Linux下遍历目录及文件,更改权限
Linux下遍历目录及文件,更改权限 引言: 我在Linux下搭建android时,将eclipse及sdk复制到/usr/下时,总会出现无法读,无法写写样的问题. 解决方案: 有两个方案: 一.将复 ...
- linux下java调用.so文件的方法1: JNI
摘自http://blog.163.com/squall_smile/blog/static/6034984020129296931793/ https://my.oschina.net/simabe ...
- php 运行linux命令 与 linux下命令行执行php
1.php运行linux命令 exec函数:string exec(string command, string [array], int [return_var]); 执行函数后不输出结果,返回最 ...
- linux下为目录和文件设置权限
摘:linux下为目录和文件设置权限 分类: Linux2012-05-09 03:18 7456人阅读 评论(1) 收藏 举报 linuxwordpressweb数据库serverfile linu ...
随机推荐
- Linux - 变量
printenv - print all or part of environment 显示所有变量:print 显示某个变量:print <variable name> 或者 echo ...
- Animo.js :一款管理 CSS 动画的强大的小工具
Animo.js 是一个功能强大的小工具,用于管理 CSS 动画.它的特色功能包括像堆栈动画,创建跨浏览器的模糊,设置动画完成的回调等等.Animo 还包括惊人的 animate.css,为您提供了近 ...
- Spring Boot异常处理详解
在Spring MVC异常处理详解中,介绍了Spring MVC的异常处理体系,本文将讲解在此基础上Spring Boot为我们做了哪些工作.下图列出了Spring Boot中跟MVC异常处理相关的类 ...
- Math.ceil(a/b)结果出错--原因是a和b不是double
脑袋短路.连续测试几次发现Math.ceil(188/20)==9; 忍无可忍,突然发现是int问题,顺着表达式走一遍,188/20==9,然后再向上取整.脑袋僵化了.看来一直做简单的不动脑筋的工作, ...
- Sql Server,如何去含有非数字的nvarchar,再转为为数值
菜鸟一枚,今天做项目时,突然遇到一个问题: 在数据库中中存放的nvarchar类型的“时间”,例如:‘08:00’,而我需要进行时间的范围比较,这时就想到了将nvarchar类型转化为int类型. 这 ...
- C# 线程系列三 定时器线程
上一篇文章我们讲诉了自定义线程执行器和任务处理器 我们继续来讲解自定义线程的定时执行器,我们在很多场景下需要做到某些状态或者数据进行更新,如果事情很多很杂,很时候时候会创建很多不同的定时器那么势必会照 ...
- [AngularJS] AngularJS系列(4) 中级篇之指令
目录 API概览 使用Angular.UI.Bootstrap 自定义指令 scope link 我的指令 angular中的指令可谓是最复杂的一块 但是我们的上传组件就能这么写 效果图: API概览 ...
- Redis代码阅读之Hacking Strings
Hacking Strings The implementation of Redis strings is contained in sds.c ( sds stands for Simple Dy ...
- Newtonsoft.Json 的序列化与反序列化
首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framework和NHibernate的.我举例说明DataTable的序列化和反序列化.创建一 ...
- 再一个客户端设置多个git账号
步骤一:用ssh-keygen命令生成一组新的id_rsa_new和id_rsa_new.pub. ssh-keygen -t rsa -C "new email" 平时我们都是直 ...