Authon:Baohaitao

Date: 2016-11-25

目的:

linux应用软件运行过程中出现难重现的无规律死机,在core文件中gdb中调试没有发现有价值信息;这里给出了另一个思路:函数打桩。该方法特别适合于中小型嵌入式软件。

===================================================================

设计:

(1)实现一个伺服程序:和应用程序进行进程通信(消息机制),存储应用程序发送过来的的函数地址,如果应用程序死机,则通过存储地址可以跟踪到死在哪个函数;

(2)增加一个编译项:编译器自动在整个工程的所有函数体头尾增加插桩函数;

(3)实现插桩函数:将运行所在函数地址发送给伺服程序;

(4)编译伺服程序和应用程序;

(5)同时启动伺服程序和应用程序;

(6)死机查找:一旦应用程序死机,伺服程序已经记录下应用程序的函数运行地址,通过脚本地址解析即可得到所有的函数名;

===================================================================

使用方法:

总共分两部分,如下:

第一部分:程序代码调整

(1)应用程序增加编译项“

-finstrument-functions”比如:在QT的pro文件中,如下:

QMAKE_CXXFLAGS =

-finstrument-functions -DFL_LIBRARY -D_LARGEFILE_SOURCE

-D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_THREAD_SAFE

-D_REENTRANT

(2)应用程序在应用工程的源代码中增加文件func_trace.h和func_trace.c,并调整Makefile参与编译;

(3)调用函数插桩 main函数中调用初始化语句:“cyg_profile_init();”,并在头部引用头文件“#include

"func_trace.h"”;

(4)伺服程序 根据运行环境,编译traceshm.c,生产伺服程序“traceshm”;注意:在运行应用程序的同时,一定要启动伺服程序(但增加参数,如:“traceshm

init”);

(5)调整解析脚本解析脚本"conv.sh"中的解析函数需要和交叉编译工具关联,打开该脚本,修改“ADDR2LINE”内容为当前交叉编译器所在路径,如下所示:

#ADDR2LINE=/usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-addr2line#ADDR2LINE=/opt/freescale/usr/local/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/arm-linux-addr2lineADDR2LINE=addr2line

第二部分:死机后如何定位(在linux终端中操作)

(1)发现死机再次运行traceshm(但不带参数),此时将会在/tmp目录下,生成traceshm.txt文件(里面记录了死机前的函数地址信息);

(2)解析函数保持三者(traceshm.txt,应用程序,调用脚本)在同一目录,建议:新建一个解析目录"/trace_dir",将/tmp/traceshm.txt拷贝到该目录,调用“conv.sh”进行解析,以应用程序名为kt5000为例,调用方式如下:#./conv.sh

kt5000此时会得到解析信息,类似如下:

Enter

qCleanupResources_calculatorbuilder__dest_class__::~qCleanupResources_calculatorbuilder__dest_class__()

qrc_calculatorbuilder.cpp:127

Enter

qCleanupResources_calculatorbuilder()

qrc_calculatorbuilder.cpp:121

Enter

CalculatorForm::calldump()

calculatorform.cpp:94

Exit

main main.cpp:46

============================================================================================

附录:使用到的文件清单

(1)conv.sh

(解析脚本)

(2)func_trace.c/func_trace.h

(插桩函数)

(3)traceshm.c

(伺服程序)

函数打桩原理_难重现问题定位“函数打桩”相关推荐

  1. api中重载函数的原理_小心重载API方法

    api中重载函数的原理 重载方法是API设计中的一个重要概念,尤其是当您的API是流利的API或DSL( 特定于域的语言 )时. 对于jOOQ就是这种情况,在这种情况下,您经常想使用与完全相同的方法名 ...

  2. 函数不可访问_关于可重入函数

    1 前言 最近在公司维护的项目中碰到一个解决了定位很久的 bug , bug 找到的时候发现犯了很低级的错误--在中断处理函数中调用了 printf 函数,因为中断处理函数的调用了不可重入函数,导致中 ...

  3. find函数常见错误_终于找到你,查找函数,find必不可少

    说起查找类的函数,一般大家想到的都是vlookup这些最常见的函数,而find函数,知名度就没那么高了,的确,光从find函数的功能来看,单兵做战能力的确是不强,但是,团队的力量,才是最强大的,虽然单 ...

  4. java对三次函数求导_如何画三次函数图像

    问题 请绘制 的图形 思路一 借助软件 软件名称 介绍 geogebra image.png GeoGebra是自由且跨平台的动态数学软件,提供各级教育使用,包含了几何.代数.表格.图形.统计和微积分 ...

  5. matlab符号函数绘图法_转载:MATLAB 符号函数作图

    1 符号函数的等高线图 1) ezcontour(f) : 画出二元符号函数 f=f(x,y) 的等高线图. 函数 f 将被显示于默认的平面区域 [-2pi 系统将根据函数变动的激烈程度自动选择相应的 ...

  6. java js中 function函数报错_浅析JS中对函数function的理解(基础篇)

    正文:我们知道,在js中,函数实际上是一个对象,每个函数都是Function类型的实例,并且都与其他引用类型一样具有属性和方法.因此,函数名实际上是指向函数对象的指针,不与某个函数绑定.在常见的两种定 ...

  7. python第六章函数课后答案_浙大PTA-Python题库 函数题(6-1~6-6)题解

    其他各章题解链接如下 浙大PTA-Python题库 编程题第一章(1-1~1-3)题解 https://blog.csdn.net/zimuzi2019/article/details/1070206 ...

  8. python中函数的定义_Python函数是什么_如何定义和调用函数?

    函数是什么? 本节Python培训教程是要大家认识一个"老朋友"--函数. 与数学中的函数不同,在Python中,函数不是看上去冰冷无聊的规则和公式,而是实打实的.有自己作用的代码 ...

  9. python sort函数返回值_如何使用python sort函数?

    不知道大家在做项目时候,有没有遇到这个函数,记得小编第一次看到这个函数,一直纳闷这个函数的使用方法,而后查询了下,今日,小编再一次遇到这个函数,于是,就做了一番整理,内容请看下文. 与sort()函数 ...

最新文章

  1. 【机器视觉案例】(13) 脸部和摄像机间的距离测量,自适应文本大小,附python完整代码
  2. c++ 开方_刷屏时尚圈!The Story Shoulder稳坐风尚C位的背后究竟有什么奇妙魔力?...
  3. Android开发--List与ArrayList区别
  4. git报错:remote: warning: Large files detected.
  5. RocketMQ高性能之底层存储设计
  6. [XMAN2018排位赛]Dragon Quest [MRCTF2020]VirtualTree
  7. awk bc命令 linux_linux之awk命令(转载)
  8. 石板切割问题c语言_岩知识 | 岩板切板有讲究,工艺问题要注意
  9. 前端学习(2606):vue简单叙述
  10. 多核处理器_英特尔十代酷睿i5-10400大战R5 3600,到底谁是千元处理器一霸?
  11. 入微:探究文档中找不到的12c并行索引扫描新特性
  12. django 1.8 官方文档翻译:14-5 信号
  13. 【Antlr】Antlr 在语法中嵌入任意动作
  14. sql进程意外终止_字节跳动五面都过了,竟然意外被刷了下来,问了hr原因竟说是。。。。。...
  15. Java集成openCV实现图片背景切换
  16. 策略模式探究(二)多个门禁对接使用策略模式
  17. 服务器里面增加单页网站,如何设计完美的单页网站
  18. 深度学习中 经常提到的 end to end 的理解
  19. 看大牌厂商PK——2010 ARM研讨会见闻
  20. 阿里云ACR关联gitlab账号

热门文章

  1. 1389:买零食【C++】
  2. GWL30地下水情监测仪应用全自动水情信息实时监测
  3. 管道-过滤器体系结构风格
  4. 四则运算小程序 c语言,四则运算小程序测试
  5. android+酷炫动画效果,Android简单酷炫点击动画(附源码)
  6. Servlet-千锋-学习笔记
  7. 机器学习之朴素贝叶斯实现垃圾邮件过滤
  8. CF 1718 A2. Burenka and Traditions (hard version) 贪心 1900
  9. 关于虚拟机可以ping通主机,主机ping不通虚拟机的问题
  10. mongodb4.0学习总结三(write concern)