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下发布的执行文件崩溃的问题定位 心得一则的更多相关文章

  1. Linux下创建可执行bin安装文件

    需求及应用场景 1.简化操作.一般的软件安装过程,如果想要精简步骤,我们一般会将需要在命令行中输入的命令写成一个脚本,同时将安装介质准备好.我们将脚本和安装介质上传到生产环境,然后通过执行脚本来完成安 ...

  2. [置顶] Linux下发布QT程序

    Linux下发布QT程序 概述 无论在windows下还是在linux下,可执行程序的运行都依赖于相关的运行库,我们需要将依赖的库找到放到特定的位置,让可执行文件能够找到.在不知道可执行文件依赖哪些库 ...

  3. 如何用javac 和java 编译运行整个Java工程 (转载)【转】在Linux下编译与执行Java程序

    如何用javac 和java 编译运行整个Java工程 (转载)  http://blog.csdn.net/huagong_adu/article/details/6929817 [转]在Linux ...

  4. linux下生成core dump文件方法及设置

    linux下生成core dump文件方法及设置    from:http://www.cppblog.com/kongque/archive/2011/03/07/141262.html core ...

  5. linux下php上传文件注意

    linux下php上传文件注意1.修改上传目录权限linux 修改某目录下所有所有子目录权限chmod -R 777 html修改某目录为任何用户都用写读执行权限chmod a+rwx html2.设 ...

  6. Linux下遍历目录及文件,更改权限

    Linux下遍历目录及文件,更改权限 引言: 我在Linux下搭建android时,将eclipse及sdk复制到/usr/下时,总会出现无法读,无法写写样的问题. 解决方案: 有两个方案: 一.将复 ...

  7. linux下java调用.so文件的方法1: JNI

    摘自http://blog.163.com/squall_smile/blog/static/6034984020129296931793/ https://my.oschina.net/simabe ...

  8. php 运行linux命令 与 linux下命令行执行php

    1.php运行linux命令 exec函数:string exec(string command, string [array], int [return_var]);  执行函数后不输出结果,返回最 ...

  9. linux下为目录和文件设置权限

    摘:linux下为目录和文件设置权限 分类: Linux2012-05-09 03:18 7456人阅读 评论(1) 收藏 举报 linuxwordpressweb数据库serverfile linu ...

随机推荐

  1. Java生成BASE64编码

    1.所需jar包: BASE64Encoder.jar 2.在导包过程中,可能会出现工程不识别的情况.即:不能找到BASE64Encoder的jar包.此时,可以有两种方法解决这个问题: a.  只需 ...

  2. java中String的相等比较

    首先贴出测试用例: package test; import org.junit.Test; /** * Created by Administrator on 2015/9/16. * */ pub ...

  3. iOS平台快速发布HT for Web拓扑图应用

    iOS平台一直是封闭的生态圈,iOS开发者要缴纳年费加入开发者计划才可进行iOS平台的APP开发测试,所开发的APP需要上传到App Store经过苹果审核以后才可对外发布.如果要开发企业内部应用,则 ...

  4. C#无限极分类树-创建-排序-读取 用Asp.Net Core+EF实现

    今天做一个管理后台菜单,想着要用无限极分类,记得园子里还是什么地方见过这种写法,可今天找了半天也没找到,没办法静下心来自己写了: 首先创建节点类(我给它取名:AdminUserTree): /// & ...

  5. 【C#】Excel舍入函数Round、RoundUp、RoundDown的C#版

    本人在C#中进行小数舍入的时候常常会怀念Excel中的Round.RoundUp.RoundDown这几个函数,原因就是后者“接地气”,比较符合俺小老百姓的舍入要求,啥“银行家舍入法”就让银行家用去吧 ...

  6. 【SQL】找出行数与自增标识值不相等的表(即有缺行)

    环境:mssql ent 2k8 r2 原理:遍历所有含自增列的用户表,用sp_spaceused过程分别获取每张表的行数并写入临时表,然后使用IDENT_CURRENT函数获取表的最大标识值,比较二 ...

  7. 【C#】第3章学习要点(三)--常用类和结构的用法

    分类:C#.VS2015 创建日期:2016-06-19 使用教材:(十二五国家级规划教材)<C#程序设计及应用教程>(第3版) 一.DateTime结构和TimeSpan结构 DateT ...

  8. MVC部分视图的巧用

    View视图界面 @{ Html.RenderAction("demo", "", new { id = ViewBag.id });} 请求的控制器方法 pu ...

  9. C++11学习笔记

    C++11 1.long long新类型 2.列表初始化 int t=0; int t={0}; int t(0); int t{0}; 注意:如果我们使用列表初始化有丢失信息的风险,则编译器报错 l ...

  10. Linux环境下安装Tigase XMPP Server

    Tigase是一种XMPP服务器,可以作为采用XMPP协议的各种IM(Instant Messeging)工具(如Pandion.Spark等)的服务器. 在Linux环境下安装Tigase的步骤如下 ...