CN101169752A - 一种捕获导致内存被野指针改写的函数的方法 - Google Patents
一种捕获导致内存被野指针改写的函数的方法 Download PDFInfo
- Publication number
- CN101169752A CN101169752A CNA2007101875496A CN200710187549A CN101169752A CN 101169752 A CN101169752 A CN 101169752A CN A2007101875496 A CNA2007101875496 A CN A2007101875496A CN 200710187549 A CN200710187549 A CN 200710187549A CN 101169752 A CN101169752 A CN 101169752A
- Authority
- CN
- China
- Prior art keywords
- function
- task
- pointer
- memory
- address
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种捕获导致内存被野指针改写的函数的方法,包括如下步骤:在***中加入函数调用和返回钩子函数,并配置一个全局函数指针;***运行时,在函数调用钩子函数里记录下被监控的内存的值,在函数返回钩子函数里,将函数调用钩子函数所记录的内存值与当前的内存值进行比较,若不一致,则将当前运行的函数的地址记录到所述全局的函数指针里。进一步地,任务切换时,将所述全局函数指针赋值为切入的任务在内存区中对应的记录函数指针地址。应用本发明的捕获方法,可以实时捕获并记录下导致内存被野指针改写的函数,进一步地,还可以定位到调用该函数的任务。
Description
技术领域
本发明涉及通信技术领域,尤其涉及一种捕获导致内存被野指针改写的函数的方法。
背景技术
在通信领域中的包含有CPU的通信产品,在市场应用或实验室环境中会遇到由于内存被非法改写而导致***功能异常、甚至死机的异常情况。由于造成上述异常情况的原因是非法改写,特别是野指针非法改写内存。在问题出现之后,所看到的只是被改写后的内存状态,至于是由哪个任务的哪个函数改写的则无法知道,所以很难定位这种问题究竟是何原因造成的。
在通信领域中,野指针改写内存的问题仍是个难题。目前,一般没有***性的方法来实现对改写内存原因的定位,通常情况下是靠不停的复现问题,分析流程,然后再不停的加入调试手段来一步一步分析和定位问题,以便确认哪个任务的哪个函数把内存给改写了。分析定位的过程繁杂且准确性较差,不能快速准确的定位到出现问题的原因。
通信产品一般都是实时的嵌入式***,都是基于任务或者进程来调度的,也就是说任务或者进程是集合各种***资源实现特定功能的最小运行单元,函数可以认为是任务或进程最小的构成单元。如果能够捕捉到改写内存的函数以及运行这个函数的任务,那么基本上就已经找到导致问题的原因了。
但是,由于任务切换和函数的调用,在一个实时性***里非常地频繁,假如监控手段过于占用***资源,监控时就会导致***性能下降,影响***主要功能的运行。
因此,如何能够以占用较小的***资源为代价,来捕获导致内存被改写的函数以及运行该函数的任务成为一个急需解决的问题,若能准确定位到产生问题的原因,则可以为定位这一类***故障提供有效的记录信息,以便于定位***问题,提高产品在市场中的稳定性。
发明内容
本发明所要解决的技术问题在于,提供一种捕获导致内存被野指针改写的函数的方法,实现以占用较小的***资源来实时捕获并记录下导致内存被野指针改写的函数,进一步地,还可以定位到调用该函数的任务。
本发明提供一种捕获导致内存被野指针改写的函数的方法,包括如下步骤:
在***中加入函数调用和返回钩子函数,并配置一个全局函数指针;
***运行时,在函数调用钩子函数里记录下被监控的内存的值,在函数返回钩子函数里,将函数调用钩子函数所记录的内存值与当前的内存值进行比较,若不一致,则将当前运行的函数的地址记录到所述全局的函数指针里。
进一步地,所述方法进一步包括:
在为用户保留的内存区中还为每一任务分配一个记录函数指针地址;
***运行时,在任务切换钩子里刷新所述全局函数指针的地址为本任务用于记录当前函数的记录函数指针地址,任务切换时,将所述全局函数指针赋值为切入的任务对应的记录函数指针地址;
进一步地,所述方法进一步包括:
在所监控的内存被改写后,查看内存区记录找出改写的任务和函数,确认哪一条记录到的任务和函数为非法改写的情况。
进一步地,所述为用户保留的内存区,是操作***启动时保留的用于记录基于任务的当前调用的函数信息的一块内存区。
进一步地,所述记录函数指针地址,是在内存记录区上构造的一个用来记录函数地址的函数指针数组的元素,其中,每个元素和一个任务一一对应。
进一步地,所述全局函数指针,是在内存记录区上分配的一个全局地址。
本发明的捕获导致内存被野指针改写的函数的方法,以及捕获运行该函数的任务的方法,适用于整个通信领域,尤其适用于定位通信产品在市场应用或实验室环境中内存被非法改写的情况。本发明可以***性地来定位内存被野指针改写的问题,定位内存被野指针改写问题时不需要一步一步地分析流程或一步一步加入调试信息,就能定位到是哪个任务的哪个函数把内存给改写了,能够把问题精确定位到函数一级,大大缩小了查找问题的范围。
附图说明
图1是本发明实施例中捕获导致内存被野指针改写的函数的流程图;
图2是本发明实施例中任务切换时记录函数指针地址切换的示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,以下结合附图对本发明作进一步地详细说明。
本发明的主要目的在于,如何能够以占用较小***资源来实现快速准确的对内存问题进行定位,尤其是如何确定导致内存被野指针改写的函数,以及确定调用该函数的任务,从而为定位这一类***故障提供有效的记录信息,以便于定位***问题,提高产品在市场中的稳定性。
在本发明实施例中采用一种高效的方法,即:利用通信产品软硬件的现有特性来捕获到导致内存被改写的函数及运行该函数的任务。嵌入式***一般会给用户提供一些钩子函数接口,用于监控嵌入式***内部运行的一些关键事件。虽然不能更改嵌入式***的源码来加入调试手段,但是可以通过钩子函数加入所需要的定位代码,从而捕获一些***运行的信息。
因此,在本发明的实施例中利用现有的“任务切换钩子函数”接口,在任务切换钩子函数里,更新用于记录当前正在运行的函数的全局函数指针为本任务对应的内存记录区,每次任务切换时,总是将记录当前正在运行的函数的全局函数指针更新为用于记录本任务的当前正在运行的函数指针。
每个任务都分配一个内存记录区来记录本任务当前运行的函数指针,为了提高效率引入了一个全局函数指针用于记录,但这样就要求任务切换时要更新这个全局函数指针为切入任务的记录函数指针处。
在***中加入的“函数调用钩子函数”里,只要把函数指针记录到这个记录当前正在运行的函数的全局函数指针里就可以了,这样就不会因为加入函数钩子导致***性能大幅下降,从而提高了监控的高效性。
虽然嵌入式***的操作***并没有提供关于函数调用或返回的***钩子函数的方法,但是函数调用和返回的汇编指令或者机器码都是具有固定特点的,所以可通过匹配函数调用或者返回的关键指令并把其替换的方法,来加入函数的调用或返回钩子,这样就可以监控函数调用或返回了。对于这种加入函数调用或返回的钩子函数的方法,现在已有专门工具软件。只要运行这种用于加入函数调用或者返回的钩子函数的专用工具软件,就可以把函数钩子加入到***的所有函数调用或返回处。
本发明的主要思路在于,把***要运行的文件加入函数调用和返回钩子函数,在函数调用钩子函数里记录下被监控的内存的值,在函数返回钩子函数里用函数调用钩子函数记录的内存值和当前内存值去比较,如果值不一样就说明内存被改写了,然后把本函数的地址记录到事先定义的一个全局的函数指针里。进一步还可以利用任务切换钩子函数记录当前运行的任务。
如图1所示,本发明实施例中捕获导致内存被野指针改写的函数的流程,分为如下步骤:
步骤101:在***中加入函数调用和返回钩子处理函数,加入时使用工具向***要运行的文件中加入函数调用和返回钩子函数。
在函数调用钩子函数里,记录下被监控的内存的值;
在函数返回钩子函数里,将函数调用钩子函数所记录的内存值与当前的内存值进行比较,如果两种内存值不一样,就说明内存已被改写了,然后把本任务当前运行的函数的地址记录到事先定义的一个全局的函数指针里。
步骤102:操作***启动时保留一块内存区用于记录基于任务的当前调用的函数的信息。
步骤103:分配内存记录区,为每个任务分配一个记录函数指针地址,再分配一个全局地址。具体而言,是在内存记录区上构造一个函数指针数组用来记录函数地址,然后把这个数组的每个元素和一个任务一一对应,定义一个全局的函数指针用来跟踪当前运行的任务的调用函数。
步骤104:在任务切换钩子里刷新全局记录地址为本任务用于记录当前函数的记录地址。在任务切换钩子函数里,将定义的用来跟踪当前任务的所述全局函数指针赋值为新切入的任务对应的指针数组元素的地址,这样就能保证永远跟踪当前运行的任务。
步骤105:在函数返回钩子里判断,如内存被改写,则记录函数地址到全局记录函数指针里;
在函数返回钩子函数里,如果判断所监控内存被改写,则把本函数地址记录到全局的函数指针里,这样就能确保能监控到本任务当前调用的函数。
步骤106:在所监控的内存被改写后,查看记录找出改写的任务和函数,确认哪一条记录到的任务和函数是否非法改写的情况。若限定比较的内存范围,则一般是知道起始地址和长度就可以。
如图2所示,显示了本发明中任务切换时记录函数指针地址的切换示意图。
本专利提供了一种***性的方法来定位内存被野指针改写的问题,利用本方法定位内存被野指针改写问题不需要一步一步分析流程,一步一步加入调试信息就能定位到是哪个任务的哪个函数把内存给改写了,能够把问题精确定位到函数一级,大大缩小了查找问题的范围。
本文所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。因此,凡在本发明的精神和原则之内所作的任何修改、等同替换、改进以及更新等等,均应包含在本发明的保护范围之内。
Claims (6)
1.一种捕获导致内存被野指针改写的函数的方法,其特征在于,包括如下步骤:
在***中加入函数调用和返回钩子函数,并配置一个全局函数指针;
***运行时,在函数调用钩子函数里记录下被监控的内存的值,在函数返回钩子函数里,将函数调用钩子函数所记录的内存值与当前的内存值进行比较,若不一致,则将当前运行的函数的地址记录到所述全局的函数指针里。
2.如权利要求1所述的方法,其特征在于,所述方法进一步包括:
在为用户保留的内存区中还为每一任务分配一个记录函数指针地址;
***运行时,在任务切换钩子里刷新所述全局函数指针的地址为本任务用于记录当前函数的记录函数指针地址,任务切换时,将所述全局函数指针赋值为切入的任务对应的记录函数指针地址。
3.如权利要求2所述的方法,其特征在于,所述方法进一步包括:
在所监控的内存被改写后,查看内存区记录找出改写的任务和函数,确认哪一条记录到的任务和函数为非法改写的情况。
4.如权利要求2所述的方法,其特征在于,
所述为用户保留的内存区,是操作***启动时保留的用于记录基于任务的当前调用的函数信息的一块内存区。
5.如权利要求2所述的方法,其特征在于,
所述记录函数指针地址,是在内存记录区上构造的一个用来记录函数地址的函数指针数组的元素,其中,每个元素和一个任务一一对应。
6.如权利要求1至5中任何一项所述的方法,其特征在于,
所述全局函数指针,是在内存记录区上分配的一个全局地址。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNB2007101875496A CN100517249C (zh) | 2007-11-26 | 2007-11-26 | 一种捕获导致内存被野指针改写的函数的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNB2007101875496A CN100517249C (zh) | 2007-11-26 | 2007-11-26 | 一种捕获导致内存被野指针改写的函数的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101169752A true CN101169752A (zh) | 2008-04-30 |
CN100517249C CN100517249C (zh) | 2009-07-22 |
Family
ID=39390384
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNB2007101875496A Active CN100517249C (zh) | 2007-11-26 | 2007-11-26 | 一种捕获导致内存被野指针改写的函数的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN100517249C (zh) |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106557300A (zh) * | 2015-09-24 | 2017-04-05 | 腾讯科技(深圳)有限公司 | 一种野指针的函数栈信息确定方法、装置及电子设备 |
CN107506199A (zh) * | 2017-09-04 | 2017-12-22 | 北京京东尚科信息技术有限公司 | Hook方法、装置以及计算机可读存储介质 |
CN108255746A (zh) * | 2017-12-29 | 2018-07-06 | 北京元心科技有限公司 | 内存改写检测方法及装置 |
CN108762920A (zh) * | 2018-05-18 | 2018-11-06 | 四川斐讯信息技术有限公司 | 一种动态内存中野指针的确定及定位方法 |
CN109542615A (zh) * | 2018-10-18 | 2019-03-29 | 深圳市景阳科技股份有限公司 | 一种可变节点通用队列的实现方法、装置及终端设备 |
CN111338864A (zh) * | 2020-02-18 | 2020-06-26 | 上海闻泰电子科技有限公司 | 内存问题检测方法、装置、计算机设备及存储介质 |
Families Citing this family (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10268465B2 (en) | 2016-10-24 | 2019-04-23 | International Business Machines Corporation | Executing local function call site optimization |
US10108404B2 (en) | 2016-10-24 | 2018-10-23 | International Business Machines Corporation | Compiling optimized entry points for local-use-only function pointers |
US9952844B1 (en) | 2016-10-24 | 2018-04-24 | International Business Machines Corporation | Executing optimized local entry points and function call sites |
US10360005B2 (en) | 2016-10-24 | 2019-07-23 | International Business Machines Corporation | Local function call tailoring for function pointer calls |
US10534593B2 (en) | 2016-10-24 | 2020-01-14 | International Business Machines Corporation | Optimized entry points and local function call tailoring for function pointers |
US10108407B2 (en) | 2016-10-24 | 2018-10-23 | International Business Machines Corporation | Loading optimized local entry points for local-use-only function pointers |
US10169011B2 (en) | 2016-10-24 | 2019-01-01 | International Business Machines Corporation | Comparisons in function pointer localization |
US10108406B2 (en) | 2016-10-24 | 2018-10-23 | International Business Machines Corporation | Linking optimized entry points for local-use-only function pointers |
US10169016B2 (en) | 2016-10-24 | 2019-01-01 | International Business Machines Corporation | Executing optimized local entry points |
-
2007
- 2007-11-26 CN CNB2007101875496A patent/CN100517249C/zh active Active
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106557300A (zh) * | 2015-09-24 | 2017-04-05 | 腾讯科技(深圳)有限公司 | 一种野指针的函数栈信息确定方法、装置及电子设备 |
CN106557300B (zh) * | 2015-09-24 | 2020-04-07 | 腾讯科技(深圳)有限公司 | 一种野指针的函数栈信息确定方法、装置及电子设备 |
CN107506199A (zh) * | 2017-09-04 | 2017-12-22 | 北京京东尚科信息技术有限公司 | Hook方法、装置以及计算机可读存储介质 |
CN108255746A (zh) * | 2017-12-29 | 2018-07-06 | 北京元心科技有限公司 | 内存改写检测方法及装置 |
CN108762920A (zh) * | 2018-05-18 | 2018-11-06 | 四川斐讯信息技术有限公司 | 一种动态内存中野指针的确定及定位方法 |
CN109542615A (zh) * | 2018-10-18 | 2019-03-29 | 深圳市景阳科技股份有限公司 | 一种可变节点通用队列的实现方法、装置及终端设备 |
CN109542615B (zh) * | 2018-10-18 | 2020-11-10 | 深圳市景阳科技股份有限公司 | 一种可变节点通用队列的实现方法、装置及终端设备 |
CN111338864A (zh) * | 2020-02-18 | 2020-06-26 | 上海闻泰电子科技有限公司 | 内存问题检测方法、装置、计算机设备及存储介质 |
CN111338864B (zh) * | 2020-02-18 | 2023-08-18 | 上海闻泰电子科技有限公司 | 内存问题检测方法、装置、计算机设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN100517249C (zh) | 2009-07-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN100517249C (zh) | 一种捕获导致内存被野指针改写的函数的方法 | |
CN101615143B (zh) | 用于内存泄漏诊断的方法和装置 | |
CN101901164B (zh) | 时间计划调度模块和方法 | |
US20070136402A1 (en) | Automatic prediction of future out of memory exceptions in a garbage collected virtual machine | |
CN103109276B (zh) | ***测试方法 | |
CN102200941A (zh) | 进程状态监控方法及单元 | |
US20080313502A1 (en) | Systems, methods and computer products for trace capability per work unit | |
CN100530126C (zh) | 一种记录导致***异常的函数的方法 | |
CN108829342B (zh) | 一种日志存储方法、***及存储装置 | |
US20150248421A1 (en) | System and method for recovering system status consistently to designed recovering time point in distributed database | |
CN104866619A (zh) | 数据仓库的数据监控方法和*** | |
CN101609429B (zh) | 一种调试嵌入式操作***的方法和装置 | |
CN102073591A (zh) | 嵌入式***内存占用状况检测方法及*** | |
CN100388234C (zh) | 一种基于有限状态机的对内存变量改写进行监控的方法 | |
US20140350993A1 (en) | Information management device and method | |
CN104572448A (zh) | 一种线程堆栈的使用情况的实现方法和装置 | |
CN101251822A (zh) | 一种内存被改写的监控方法 | |
CN107423110A (zh) | 一种基于libvirt的虚拟机实时监测方法及其装置 | |
CN101685420B (zh) | 多线程调试方法和装置 | |
CN101520754A (zh) | 内存越界访问的定位方法及装置 | |
CN103034577A (zh) | 一种定位关机慢的方法及装置 | |
CN101237350B (zh) | 用于多任务环境单板机的全局变量异常改写定位方法 | |
CN104123104A (zh) | 日志控制***及方法 | |
CN100382043C (zh) | 一种内存监控的装置及方法 | |
CN104461880A (zh) | 一种嵌入式***中自动检测内存越界的方法及*** |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |