函数打桩原理_难重现问题定位“函数打桩”
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
(伺服程序)
函数打桩原理_难重现问题定位“函数打桩”相关推荐
- api中重载函数的原理_小心重载API方法
api中重载函数的原理 重载方法是API设计中的一个重要概念,尤其是当您的API是流利的API或DSL( 特定于域的语言 )时. 对于jOOQ就是这种情况,在这种情况下,您经常想使用与完全相同的方法名 ...
- 函数不可访问_关于可重入函数
1 前言 最近在公司维护的项目中碰到一个解决了定位很久的 bug , bug 找到的时候发现犯了很低级的错误--在中断处理函数中调用了 printf 函数,因为中断处理函数的调用了不可重入函数,导致中 ...
- find函数常见错误_终于找到你,查找函数,find必不可少
说起查找类的函数,一般大家想到的都是vlookup这些最常见的函数,而find函数,知名度就没那么高了,的确,光从find函数的功能来看,单兵做战能力的确是不强,但是,团队的力量,才是最强大的,虽然单 ...
- java对三次函数求导_如何画三次函数图像
问题 请绘制 的图形 思路一 借助软件 软件名称 介绍 geogebra image.png GeoGebra是自由且跨平台的动态数学软件,提供各级教育使用,包含了几何.代数.表格.图形.统计和微积分 ...
- matlab符号函数绘图法_转载:MATLAB 符号函数作图
1 符号函数的等高线图 1) ezcontour(f) : 画出二元符号函数 f=f(x,y) 的等高线图. 函数 f 将被显示于默认的平面区域 [-2pi 系统将根据函数变动的激烈程度自动选择相应的 ...
- java js中 function函数报错_浅析JS中对函数function的理解(基础篇)
正文:我们知道,在js中,函数实际上是一个对象,每个函数都是Function类型的实例,并且都与其他引用类型一样具有属性和方法.因此,函数名实际上是指向函数对象的指针,不与某个函数绑定.在常见的两种定 ...
- python第六章函数课后答案_浙大PTA-Python题库 函数题(6-1~6-6)题解
其他各章题解链接如下 浙大PTA-Python题库 编程题第一章(1-1~1-3)题解 https://blog.csdn.net/zimuzi2019/article/details/1070206 ...
- python中函数的定义_Python函数是什么_如何定义和调用函数?
函数是什么? 本节Python培训教程是要大家认识一个"老朋友"--函数. 与数学中的函数不同,在Python中,函数不是看上去冰冷无聊的规则和公式,而是实打实的.有自己作用的代码 ...
- python sort函数返回值_如何使用python sort函数?
不知道大家在做项目时候,有没有遇到这个函数,记得小编第一次看到这个函数,一直纳闷这个函数的使用方法,而后查询了下,今日,小编再一次遇到这个函数,于是,就做了一番整理,内容请看下文. 与sort()函数 ...
最新文章
- 【机器视觉案例】(13) 脸部和摄像机间的距离测量,自适应文本大小,附python完整代码
- c++ 开方_刷屏时尚圈!The Story Shoulder稳坐风尚C位的背后究竟有什么奇妙魔力?...
- Android开发--List与ArrayList区别
- git报错:remote: warning: Large files detected.
- RocketMQ高性能之底层存储设计
- [XMAN2018排位赛]Dragon Quest [MRCTF2020]VirtualTree
- awk bc命令 linux_linux之awk命令(转载)
- 石板切割问题c语言_岩知识 | 岩板切板有讲究,工艺问题要注意
- 前端学习(2606):vue简单叙述
- 多核处理器_英特尔十代酷睿i5-10400大战R5 3600,到底谁是千元处理器一霸?
- 入微:探究文档中找不到的12c并行索引扫描新特性
- django 1.8 官方文档翻译:14-5 信号
- 【Antlr】Antlr 在语法中嵌入任意动作
- sql进程意外终止_字节跳动五面都过了,竟然意外被刷了下来,问了hr原因竟说是。。。。。...
- Java集成openCV实现图片背景切换
- 策略模式探究(二)多个门禁对接使用策略模式
- 服务器里面增加单页网站,如何设计完美的单页网站
- 深度学习中 经常提到的 end to end 的理解
- 看大牌厂商PK——2010 ARM研讨会见闻
- 阿里云ACR关联gitlab账号
热门文章
- 1389:买零食【C++】
- GWL30地下水情监测仪应用全自动水情信息实时监测
- 管道-过滤器体系结构风格
- 四则运算小程序 c语言,四则运算小程序测试
- android+酷炫动画效果,Android简单酷炫点击动画(附源码)
- Servlet-千锋-学习笔记
- 机器学习之朴素贝叶斯实现垃圾邮件过滤
- CF 1718 A2. Burenka and Traditions (hard version) 贪心 1900
- 关于虚拟机可以ping通主机,主机ping不通虚拟机的问题
- mongodb4.0学习总结三(write concern)