CN110908819B - 定位代码运行崩溃的方法及装置、终端、存储器 - Google Patents

定位代码运行崩溃的方法及装置、终端、存储器 Download PDF

Info

Publication number
CN110908819B
CN110908819B CN201811085437.4A CN201811085437A CN110908819B CN 110908819 B CN110908819 B CN 110908819B CN 201811085437 A CN201811085437 A CN 201811085437A CN 110908819 B CN110908819 B CN 110908819B
Authority
CN
China
Prior art keywords
function
identification
macro
monitored
character
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.)
Active
Application number
CN201811085437.4A
Other languages
English (en)
Other versions
CN110908819A (zh
Inventor
马伟忠
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Qianxun Spatial Intelligence Inc
Original Assignee
Qianxun Spatial Intelligence Inc
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Qianxun Spatial Intelligence Inc filed Critical Qianxun Spatial Intelligence Inc
Priority to CN201811085437.4A priority Critical patent/CN110908819B/zh
Publication of CN110908819A publication Critical patent/CN110908819A/zh
Application granted granted Critical
Publication of CN110908819B publication Critical patent/CN110908819B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
    • G06F11/0766Error or fault reporting or storing
    • G06F11/0778Dumping, i.e. gathering error/state information after a fault for later diagnosis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
    • G06F11/079Root cause analysis, i.e. error or fault diagnosis
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Health & Medical Sciences (AREA)
  • Biomedical Technology (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明适用于计算机技术领域,提供了一种定位代码运行崩溃的方法及装置、终端、存储器,所述定位代码运行崩溃的方法包括:设置与定位标识关联的关联函数;在待监控函数运行时执行所述关联函数的逻辑,并获取对应的字符串标识;根据所述字符串标识分析是否发生崩溃以及崩溃的位置。本发明中,根据关联函数的逻辑生成字符串标识,进而分析崩溃的发生以及其发生位置,具有通用性,可以在不同的操作***上无缝集成。

Description

定位代码运行崩溃的方法及装置、终端、存储器
技术领域
本发明属于计算机技术领域,尤其涉及一种定位代码运行崩溃的方法及装置、终端、存储器。
背景技术
我们在一些嵌入式设备,尤其使用的操作***功能不是那么强大,操作***没有提供追踪崩溃(crash)时候堆栈信息;甚至没有操作***的类似一些单片机上。发生crash的时候没有堆栈***可供分析排查,这样解决漏洞(bug)变得非常困难。
现有技术捕获crash堆栈的方式千差万别,***不同方式也不同,给开发造成困难。有些导致crash的信号(signal)不能被捕获,所以即使有捕获crash机制,在某些情况下也不能捕获到crash。尤其一些嵌入式设备根本没有crash堆栈捕获机制,所以发生问题,根本不知道哪里出问题。
而现有的通过打日志(log)的方式也有局限性,尤其对于嵌入式设备有很多局限性,比如大小太大,很难控制大小,本身很多嵌入式设备内存有限,另外通常每条log语句都有几十个以上字节,很影响嵌入式性能;另外在软件开发中,对于发布(release)产品中基本不会打log。Release发生问题这种方式行不通
发明内容
本发明实施例提供了一种定位代码运行崩溃的方法及装置、终端、存储器,旨在解决现有技术的代码崩溃时候能够记录崩溃的发生点,以及前后上下文,便于分析代码的问题。
一种定位代码运行崩溃的方法,包括:
设置与定位标识关联的关联函数;
在待监控函数运行时执行所述关联函数的逻辑,并获取对应的字符串标识;
根据所述字符串标识分析是否发生崩溃以及崩溃的位置。
优选地,所述设置与定位标识关联的关联函数,具体为:
定义标识宏作为所述定位标识;
在所述待监控函数中添加所述标识宏;
将所述待监控函数中的所述标识宏替换成所述关联函数。
优选地,所述定义标识宏作为所述定位标识,具体为:在公共头文件中宏定义第一标识宏、第二标识宏、第三标识宏为空;
所述在所述待监控函数中添加所述标识宏,具体为:在所述待监控函数的进入点打上所述第一标识宏,在所述待监控函数的退出点打上所述第二标识宏,在所述待监控函数的进入点与退出点之间打上任意个所述第三标识宏;
所述将所述待监控函数中的所述标识宏替换成所述关联函数,具体为:将所述第一标识宏、所述第二标识宏、所述第三标识宏分别替换成不同变量的所述关联函数。
优选地,所述在待监控函数运行时执行所述关联函数的逻辑,并获取对应的字符串标识,具体为:
所述待监控函数运行至所述第一标识宏处时,所述字符串标识的对应位置写上第一字符;
所述待监控函数运行至所述第二标识宏处时,所述字符串标识的对应位置写上第二字符;
所述待监控函数运行至所述第三标识宏处时,所述字符串标识的对应位置写上第三字符;
所述待监控函数未运行过的所述标识宏处,所述字符串标识的对应位置写上第四字符。
优选地,所述在待监控函数运行时执行所述关联函数的逻辑,并获取对应的字符串标识,还包括:
所述字符串标识重复出现所述第一字符时,清空前面的第一个所述第一字符至对应的所述第二字符之间的所有字符。
优选地,所述根据所述字符串标识分析是否发生崩溃以及崩溃的位置,还包括:
遍历所述字符串标识;
发现所述第一字符时,如果后面没有找到所述第二字符或者又出现另一个所述第一字符,则说明发生了崩溃;
如果发现所述第一字符后又出现另一个所述第一字符,则所述前一个所述第一字符所在的待监控函数发生了崩溃。
优选地,所述将所述第一标识宏、所述第二标识宏、所述第三标识宏分别替换成不同变量的所述关联函数,具体为:
设置一全局变量n;
遇到任所述标识宏则n加1;
将所述第一标识宏替换成变量为10000+n的所述关联函数,所述第二标识宏替换成变量为-n的所述关联函数,所述第三标识宏替换成变量为n的所述关联函数。
优选地,所述在待监控函数运行时执行所述关联函数的逻辑,并获取对应的字符串标识,具体为:
所述待监控函数运行至变量大于10000的所述关联函数处时,所述字符串标识的对应位置写上‘s’;
所述待监控函数运行至变量小于0的所述关联函数处时,所述字符串标识的对应位置写上‘e’;
所述待监控函数运行至变量0至10000之间的所述关联函数处时,所述字符串标识的对应位置写上‘1’;
所述待监控函数未运行过的所述标识宏处,所述字符串标识的对应位置写上‘0’。
本发明还提供一种定位代码运行崩溃的装置,其特征在于,包括:
设置单元,用于设置与定位标识关联的关联函数;
执行单元,与所述设置单元连接,用于在待监控函数运行时执行所述关联函数的逻辑,并获取对应的字符串标识;
分析单元,与所述执行单元连接,用于根据所述字符串标识分析是否发生崩溃以及崩溃的位置。
本发明还提供一种存储器,所述存储器存储有计算机程序,其特征在于,所述计算机程序被处理器执行如下步骤:
设置与定位标识关联的关联函数;
在待监控函数运行时执行所述关联函数的逻辑,并获取对应的字符串标识;
根据所述字符串标识分析是否发生崩溃以及崩溃的位置。
本发明还提供一种终端,包括存储器、处理器及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现以下步骤:
设置与定位标识关联的关联函数;
在待监控函数运行时执行所述关联函数的逻辑,并获取对应的字符串标识;
根据所述字符串标识分析是否发生崩溃以及崩溃的位置。
本发明实施例中,根据关联函数的逻辑生成字符串标识,进而分析崩溃的发生以及其发生位置,具有通用性,可以在不同的操作***上无缝集成。
附图说明
图1为本发明第一实施例提供的一种定位代码运行崩溃的方法的流程图;
图2为本发明第一实施例提供的一种定位代码运行崩溃的方法的一优选方式的流程图;
图3为本发明第二实施例提供的一种定位代码运行崩溃的装置的结构图;
图4为本发明第二实施例提供的一种定位代码运行崩溃的装置的一优选方式的结构图;
图5为本发明第四实施例提供的一种终端的结构图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
本发明实施例中,一种定位代码运行崩溃的方法,包括:设置与定位标识关联的关联函数;在待监控函数运行时执行所述关联函数的逻辑,并获取对应的字符串标识;根据所述字符串标识分析是否发生崩溃以及崩溃的位置。
为了说明本发明所述的技术方案,下面通过具体实施例来进行说明。
实施例一:
图1示出了本发明第一实施例提供的一种定位代码运行崩溃的方法的流程图,该方法包括:
步骤S1,设置与定位标识关联的关联函数;
崩溃(crash)一定是发生在某个函数里面。具体地,在待监控函数中设置多个定位标识,并设置关联函数的变量与各定位标识相关联,如待监控函数的进入点、退出点以及进入点与退出点之间的中间点。
步骤S2,在待监控函数运行时执行所述关联函数的逻辑,并获取对应的字符串标识;
具体地,待监控函数运行至任一定位标识处时,获取与该定位标识相关联的变量的值,再根据该变量执行关联函数的逻辑,获取字符串标识中对应位置的字符。
步骤S3,根据所述字符串标识分析是否发生崩溃以及崩溃的位置;
具体地,正常运行的函数进入点一定对应一个退出点。如果字符串标识中指示待监控函数进入点的字符后面没有指示待监控函数退出点的字符或者后面又有一个指示待监控函数进入点的字符,则说明发生了崩溃。如果字符串标识中指示待监控函数进入点的字符后面又有一个指示待监控函数进入点的字符,则崩溃发生在前一个待监控函数内部。在运行开始阶段先分析上一次运行记录下来的字符串标识,遍历一遍,发现crash了可以上报服务器,这样就即使正式发出去了版本也能远程监测到crash问题点。
本实施例中,根据关联函数的逻辑生成字符串标识,进而分析崩溃的发生以及其发生位置,具有通用性,可以在不同的操作***上无缝集成。
在本实施例的一个优选方案中(见图2),该步骤S1具体为:
步骤S10,定义标识宏作为所述定位标识;
具体地,在公共头文件中宏定义第一标识宏BRKS_、第二标识宏BRKE_、第三标识宏BRK_为空。为了保证编译不报错,在工程里面某个公共头文件里面定义类似#define BRK_#define BRKS_ #define BRKE_这样的宏定义。
步骤S11,在所述待监控函数中添加所述标识宏;
具体地,在所述待监控函数的进入点打上所述第一标识宏BRKS_,在所述待监控函数的退出点打上所述第二标识宏BRKE_,在所述待监控函数的进入点与退出点之间打上任意个所述第三标识宏BRK_。在待监控函数的进入点与退出点之间,第三标识宏BRK_设置得越多,定位越精确。
步骤S12,将所述待监控函数中的所述标识宏替换成所述关联函数。
具体地,将所述第一标识宏BRKS_、所述第二标识宏BRKE_、所述第三标识宏BRK_分别替换成不同变量的所述关联函数。即在发布打包出库之前先通过外部脚本把代码里面的第一标识宏BRKS_/第二标识宏BRKE_/第三标识宏BRK_替换成关联函数BRK(i),i是数字。
更具体地:先把*.c文件按名称唯一排序,按照顺序遍历每个文件,搜索BRK_/BRKS_/BRKE_关键字符串。设置一全局变量n,初始值为0;遇到任所述标识宏则n加1;将所述第一标识宏BRKS_替换成变量为10000+n的所述关联函数,所述第二标识宏BRKE_替换成变量为-n的所述关联函数,所述第三标识宏BRK_替换成变量为n的所述关联函数。即,把BRKS_变成BRK(100000+n),BRK_变成BRK(n),BRKE_变成BRK(-n);这样分析时候方便,遇到>10000的就知道这些点都是待监控函数的进入点,<0的点是待监控函数的退出点,其它属于两者之间的点。
在本实施例的一个优选方案中,步骤S2中根据与第一标识宏BRKS_/第二标识宏BRKE_/第三标识宏BRK_相关联的变量执行关联函数的逻辑,并获取对应的字符串标识。该步骤S2具体为:所述待监控函数运行至所述第一标识宏BRKS_处时,所述字符串标识的对应位置写上第一字符;所述待监控函数运行至所述第二标识宏BRKE_处时,所述字符串标识的对应位置写上第二字符;所述待监控函数运行至所述第三标识宏BRK_处时,所述字符串标识的对应位置写上第三字符;所述待监控函数未运行过的所述标识宏处,所述字符串标识的对应位置写上第四字符。
更具体地,代码里面定义函数void BRK(int k){xxx}这样的函数,功能是运行关联函数BRK(i)时候解析当前的点是进入点还是退出点还是两者中间点,然后在字符串的对应的字符上记录。所述待监控函数运行至变量大于10000的所述关联函数处时,所述字符串标识的对应位置写上‘s’;所述待监控函数运行至变量小于0的所述关联函数处时,所述字符串标识的对应位置写上‘e’;所述待监控函数运行至变量0至10000之间的所述关联函数处时,所述字符串标识的对应位置写上‘1’;所述待监控函数未运行过的所述标识宏处,所述字符串标识的对应位置写上‘0’。在本发明其他实施例中,第一字符、第二字符、第三字符、第四字符也可以设置成其他不同的字符,在此不作限制。
以C工程来说,每个*.c文件的文件名都是唯一的,这样可以给*.c安装文件名排序,这样关联函数BRK(i)里面的i就可以固定下来。每个关联函数BRK(i)对应文件中一个字符,字符s/e/1代表运行过,字符0代表未运行过;由于函数进入点和退出点特殊,用字符s代表进入点,字符e代表退出点。这样运行下来文件记录类似这样s00e00s1111e000。比如,BRK(100001)运行时候发现是进入点,就在字符串中第一个字符的地方写上’s’,如果是BRK(2)就在第三个字符的位置写上’1’,如果是BRK(-3)就在第三个位置写上‘e’;最后形成类似sle0000...这样的字符串。
所述步骤S3具体为:遍历所述字符串标识;发现所述第一字符时,如果后面没有找到所述第二字符或者又出现另一个所述第一字符,则说明发生了崩溃;如果发现所述第一字符后又出现另一个所述第一字符,则所述前一个所述第一字符所在的待监控函数发生了崩溃。更具体地,发现字符为’s’时候往后找,如果后面没有找到’e’或者后面又出现另一个‘s’,说明crash发生在’s’这个待监控函数内部。比如s00s11e这个字符串标识,我们发现第一个s后面跟着另一个s而不是e,说明在前一个s所在的函数里面发生了crash。比如,s111s100e..,发现第一个’s’后面又出现了’s’,而没有找到对应的’e’,则crash发生在第一个’s’所在的待监控函数里面,即BRK(100001)这个语句的待监控函数里面,更进一步是发生在第4个点后面,BRK(4)语句后面。因为第四个点是1,说明BRK(4)正常运行到了。
需要说明的是,在步骤S3中,所述字符串标识重复出现所述第一字符时,清空前面的第一个所述第一字符至对应的所述第二字符之间的所有字符。例如,在编码时候,当在进入点s的时候,发现之前运行过,就先把s到后面e之间的标记全清空。比如第二次运行BRK(100001)时候,发现第一个位置已经是’s’了,就把s1e0000…字符串的第一个s到后面的e之间标识清空,变成0000000…,然后再把第一个位置标识成s,变成s000000…。这样是因为,crash是可能某一个函数运行第n次时候才发生的。字符串标识需要反应最后一次清空,不能让上一次正常运行的标识影响最后一次的分析。如此,需要的空间开销很小。不像printf记录到文件如果某个函数被频繁调用,则这个函数里面打印的log就会有很多重复的记录,而本发明即使关联函数BRK(i)被运行了1000次,对应到文件的那个字符串标识中的那个索引(index)也是就是1,0,s,e中的某一个字符,只占用一个字符空间。
本发明实施例的定位代码运行崩溃的方法不需要特定的语言,任何语言都可以实现这样供能。但是在嵌入式设备上运行时候c语言比较适合。
本实施例中,根据关联函数的逻辑生成字符串标识,进而分析崩溃的发生以及其发生位置,具有通用性,与操作***或者硬件无关,实现不依赖与特定平台的***函数,可以在不同的操作***上无缝集成。
其次,即使那些导致crash的不能被捕获的signal发生时,也能够记录crash堆栈的上下文,从而快速定位问题。
再者,需要的空间开销很小。一个打印点只占用一个字符,一般中小型软件估计1000个字符(1kb左右)就差不多够用了。另外同一个打印点运行n(n>=1)次,还是只占用1个字节,具体显示’1’,’0’,’s’,’e’中的某一个字符。
实施例二:
如图3所示,为本发明第二实施例提供的一种定位代码运行崩溃的装置的结构图,该装置包括:设置单元1、与设置单元1连接的执行单元2、与执行单元2连接的分析单元3,其中:
设置单元1,用于设置与定位标识关联的关联函数;
具体地,崩溃(crash)一定是发生在某个函数里面。具体地,在待监控函数中设置多个定位标识,并设置关联函数的变量与各定位标识相关联,如待监控函数的进入点、退出点以及进入点与退出点之间的中间点。
执行单元2,用于在待监控函数运行时执行所述关联函数的逻辑,并获取对应的字符串标识;
具体地,待监控函数运行至任一定位标识处时,获取与该定位标识相关联的变量的值,再根据该变量执行关联函数的逻辑,获取字符串标识中对应位置的字符。
分析单元3,用于根据所述字符串标识分析是否发生崩溃以及崩溃的位置;
具体地,正常运行的函数进入点一定对应一个退出点。如果字符串标识中指示待监控函数进入点的字符后面没有指示待监控函数退出点的字符或者后面又有一个指示待监控函数进入点的字符,则说明发生了崩溃。如果字符串标识中指示待监控函数进入点的字符后面又有一个指示待监控函数进入点的字符,则崩溃发生在前一个待监控函数内部。在运行开始阶段先分析上一次运行记录下来的字符串标识,遍历一遍,发现crash了可以上报服务器,这样就即使正式发出去了版本也能远程监测到crash问题点。
本实施例中,根据关联函数的逻辑生成字符串标识,进而分析崩溃的发生以及其发生位置,具有通用性,可以在不同的操作***上无缝集成。
在本实施例的一个优选方案中,参见图4,设置单元1包括:宏定义单元10、与宏定义单元10连接的宏添加单元11以及与宏添加单元11连接的宏替换单元12,其中:
宏定义单元10,用于定义标识宏作为所述定位标识;
具体地,在公共头文件中宏定义第一标识宏BRKS_、第二标识宏BRKE_、第三标识宏BRK_为空。为了保证编译不报错,在工程里面某个公共头文件里面定义类似#define BRK_#define BRKS_ #define BRKE_这样的宏定义。
宏添加单元11,用于在所述待监控函数中添加所述标识宏;
具体地,在所述待监控函数的进入点打上所述第一标识宏BRKS_,在所述待监控函数的退出点打上所述第二标识宏BRKE_,在所述待监控函数的进入点与退出点之间打上任意个所述第三标识宏BRK_。在待监控函数的进入点与退出点之间,第三标识宏BRK_设置得越多,定位越精确。
宏替换单元12,用于将所述待监控函数中的所述标识宏替换成所述关联函数。
具体地,将所述第一标识宏BRKS_、所述第二标识宏BRKE_、所述第三标识宏BRK_分别替换成不同变量的所述关联函数。即在发布打包出库之前先通过外部脚本把代码里面的第一标识宏BRKS_/第二标识宏BRKE_/第三标识宏BRK_替换成关联函数BRK(i),i是数字。
更具体地:先把*.c文件按名称唯一排序,按照顺序遍历每个文件,搜索BRK_/BRKS_/BRKE_关键字符串。设置一全局变量n,初始值为0;遇到任所述标识宏则n加1;将所述第一标识宏BRKS_替换成变量为10000+n的所述关联函数,所述第二标识宏BRKE_替换成变量为-n的所述关联函数,所述第三标识宏BRK_替换成变量为n的所述关联函数。即,把BRKS_变成BRK(100000+n),BRK_变成BRK(n),BRKE_变成BRK(-n);这样分析时候方便,遇到>10000的就知道这些点都是待监控函数的进入点,<0的点是待监控函数的退出点,其它属于两者之间的点。
在本实施例的一个优选方案中,执行单元2根据与第一标识宏BRKS_/第二标识宏BRKE_/第三标识宏BRK_相关联的变量执行关联函数的逻辑,并获取对应的字符串标识。具体为:所述待监控函数运行至所述第一标识宏BRKS_处时,执行单元2在所述字符串标识的对应位置写上第一字符;所述待监控函数运行至所述第二标识宏BRKE_处时,执行单元2在所述字符串标识的对应位置写上第二字符;所述待监控函数运行至所述第三标识宏BRK_处时,执行单元2在所述字符串标识的对应位置写上第三字符;所述待监控函数未运行过的所述标识宏处,执行单元2在所述字符串标识的对应位置写上第四字符。
更具体地,代码里面定义函数void BRK(int k){xxx}这样的函数,功能是运行关联函数BRK(i)时候解析当前的点是进入点还是退出点还是两者中间点,然后在字符串的对应的字符上记录。所述待监控函数运行至变量大于10000的所述关联函数处时,执行单元2在所述字符串标识的对应位置写上‘s’;所述待监控函数运行至变量小于0的所述关联函数处时,执行单元2在所述字符串标识的对应位置写上‘e’;所述待监控函数运行至变量0至10000之间的所述关联函数处时,执行单元2在所述字符串标识的对应位置写上‘1’;所述待监控函数未运行过的所述标识宏处,执行单元2在所述字符串标识的对应位置写上‘0’。在本发明其他实施例中,第一字符、第二字符、第三字符、第四字符也可以设置成其他不同的字符,在此不作限制。
以C工程来说,每个*.c文件的文件名都是唯一的,这样可以给*.c安装文件名排序,这样关联函数BRK(i)里面的i就可以固定下来。每个关联函数BRK(i)对应文件中一个字符,字符s/e/1代表运行过,字符0代表未运行过;由于函数进入点和退出点特殊,用字符s代表进入点,字符e代表退出点。这样运行下来文件记录类似这样s00e00s1111e000。比如,BRK(100001)运行时候发现是进入点,就在字符串中第一个字符的地方写上’s’,如果是BRK(2)就在第三个字符的位置写上’1’,如果是BRK(-3)就在第三个位置写上‘e’;最后形成类似s1e0000...这样的字符串。
分析单元3遍历所述字符串标识;发现所述第一字符时,如果后面没有找到所述第二字符或者又出现另一个所述第一字符,则说明发生了崩溃;如果发现所述第一字符后又出现另一个所述第一字符,则所述前一个所述第一字符所在的待监控函数发生了崩溃。
更具体地,分析单元3发现字符为’s’时候往后找,如果后面没有找到’e’或者后面又出现另一个‘s’,说明crash发生在’s’这个待监控函数内部。比如,s111s100e..,分析单元3发现第一个’s’后面又出现了’s’,而没有找到对应的’e’,则crash发生在第一个’s’所在的待监控函数里面,即BRK(100001)这个语句的待监控函数里面,更进一步是发生在第4个点后面,BRK(4)语句后面。因为第四个点是1,说明BRK(4)正常运行到了。
需要说明的是,所述字符串标识重复出现所述第一字符时,分析单元3清空前面的第一个所述第一字符至对应的所述第二字符之间的所有字符。例如,在编码时候,当在进入点s的时候,分析单元3发现之前运行过,就先把s到后面e之间的标记全清空。比如第二次运行BRK(100001)时候,分析单元3发现第一个位置已经是’s’了,就把sle0000…字符串的第一个s到后面的e之间标识清空,变成0000000…,然后再把第一个位置标识成s,变成s000000…。这样是因为,crash是可能某一个函数运行第n次时候才发生的。字符串标识需要反应最后一次清空,不能让上一次正常运行的标识影响最后一次的分析。如此,需要的空间开销很小。不像printf记录到文件如果某个函数被频繁调用,则这个函数里面打印的log就会有很多重复的记录,而本发明即使关联函数BRK(i)被运行了1000次,对应到文件的那个字符串标识中的那个索引(index)也是就是1,0,s,e中的某一个字符,只占用一个字符空间。
本发明实施例的定位代码运行崩溃的方法不需要特定的语言,任何语言都可以实现这样供能。但是在嵌入式设备上运行时候c语言比较适合。
本实施例中,根据关联函数的逻辑生成字符串标识,进而分析崩溃的发生以及其发生位置,具有通用性,与操作***或者硬件无关,实现不依赖与特定平台的***函数,可以在不同的操作***上无缝集成。
其次,即使那些导致crash的不能被捕获的signal发生时,也能够记录crash堆栈的上下文,从而快速定位问题。
再者,需要的空间开销很小。一个打印点只占用一个字符,一般中小型软件估计1000个字符(1kb左右)就差不多够用了。另外同一个打印点运行n(n>=1)次,还是只占用1个字节,具体显示’1’,’0’,’s’,’e’中的某一个字符。
实施例三:
图5示出了本发明第三实施例提供的一种终端的结构图,该终端包括:存储器(memory)51、处理器(processor)52以及通信总线53,该处理器52、存储器51通过通信总线53完成相互之间的交互通信。
存储器51,用于存储各种数据;
具体地,存储器51用于存储各种数据,例如定位代码运行崩溃过程中的数据、接收的数据等,此处对此不作限制,该存储器还包括有多个计算机程序。
处理器52,用于调用存储器51中的各种计算机程序,以执行上述实施例一所提供的一种定位代码运行崩溃的方法,例如:
设置与定位标识关联的关联函数;
在待监控函数运行时执行所述关联函数的逻辑,并获取对应的字符串标识;
根据所述字符串标识分析是否发生崩溃以及崩溃的位置。
本实施例中,根据关联函数的逻辑生成字符串标识,进而分析崩溃的发生以及其发生位置,具有通用性,可以在不同的操作***上无缝集成。
本发明还提供一种存储器,该存储器存储有多个计算机程序,该多个计算机程序被处理器调用执行上述实施例一所述的一种定位代码运行崩溃的方法。
本实施例中,根据关联函数的逻辑生成字符串标识,进而分析崩溃的发生以及其发生位置,具有通用性,与操作***或者硬件无关,实现不依赖与特定平台的***函数,可以在不同的操作***上无缝集成。
其次,即使那些导致crash的不能被捕获的signal发生时,也能够记录crash堆栈的上下文,从而快速定位问题。
再者,需要的空间开销很小。一个打印点只占用一个字符,一般中小型软件估计1000个字符(1kb左右)就差不多够用了。另外同一个打印点运行n(n>=1)次,还是只占用1个字节,具体显示’1’,’0’,’s’,’e’中的某一个字符。
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。
专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。

Claims (7)

1.一种定位代码运行崩溃的方法,其特征在于,包括:
设置与定位标识关联的关联函数,所述设置与定位标识关联的关联函数,具体为:定义标识宏作为所述定位标识;在待监控函数中添加所述标识宏;将所述待监控函数中的所述标识宏替换成所述关联函数;所述定义标识宏作为所述定位标识,具体为:在公共头文件中宏定义第一标识宏、第二标识宏、第三标识宏为空;所述在所述待监控函数中添加所述标识宏,具体为:在所述待监控函数的进入点打上所述第一标识宏,在所述待监控函数的退出点打上所述第二标识宏,在所述待监控函数的进入点与退出点之间打上任意个所述第三标识宏;所述将所述待监控函数中的所述标识宏替换成所述关联函数,具体为:将所述第一标识宏、所述第二标识宏、所述第三标识宏分别替换成不同变量的所述关联函数;
在待监控函数运行时执行所述关联函数的逻辑,并获取对应的字符串标识,所述在待监控函数运行时执行所述关联函数的逻辑,并获取对应的字符串标识,具体为:所述待监控函数运行至所述第一标识宏处时,所述字符串标识的对应位置写上第一字符;所述待监控函数运行至所述第二标识宏处时,所述字符串标识的对应位置写上第二字符;所述待监控函数运行至所述第三标识宏处时,所述字符串标识的对应位置写上第三字符;所述待监控函数未运行过的所述标识宏处,所述字符串标识的对应位置写上第四字符;
根据所述字符串标识分析是否发生崩溃以及崩溃的位置,所述根据所述字符串标识分析是否发生崩溃以及崩溃的位置,还包括:遍历所述字符串标识;发现所述第一字符时,如果后面没有找到所述第二字符或者又出现另一个所述第一字符,则说明发生了崩溃;如果发现所述第一字符后又出现另一个所述第一字符,则前一个所述第一字符所在的待监控函数发生了崩溃。
2.根据权利要求1所述的方法,其特征在于,所述在待监控函数运行时执行所述关联函数的逻辑,并获取对应的字符串标识,还包括:
所述字符串标识重复出现所述第一字符时,清空前面的第一个所述第一字符至对应的所述第二字符之间的所有字符。
3.根据权利要求1所述的方法,其特征在于,所述将所述第一标识宏、所述第二标识宏、所述第三标识宏分别替换成不同变量的所述关联函数,具体为:
设置一全局变量n;
遇到任所述标识宏则n加1;
将所述第一标识宏替换成变量为10000+n的所述关联函数,所述第二标识宏替换成变量为-n的所述关联函数,所述第三标识宏替换成变量为n的所述关联函数。
4.根据权利要求3所述的方法,其特征在于,所述在待监控函数运行时执行所述关联函数的逻辑,并获取对应的字符串标识,具体为:
所述待监控函数运行至变量大于10000的所述关联函数处时,所述字符串标识的对应位置写上‘s’;
所述待监控函数运行至变量小于0的所述关联函数处时,所述字符串标识的对应位置写上‘e’;
所述待监控函数运行至变量0至10000之间的所述关联函数处时,所述字符串标识的对应位置写上‘1’;
所述待监控函数未运行过的所述标识宏处,所述字符串标识的对应位置写上‘0’。
5.一种定位代码运行崩溃的装置,其特征在于,包括:
设置单元,用于设置与定位标识关联的关联函数,所述设置与定位标识关联的关联函数,具体为:定义标识宏作为所述定位标识;在待监控函数中添加所述标识宏;将所述待监控函数中的所述标识宏替换成所述关联函数;所述定义标识宏作为所述定位标识,具体为:在公共头文件中宏定义第一标识宏、第二标识宏、第三标识宏为空;所述在所述待监控函数中添加所述标识宏,具体为:在所述待监控函数的进入点打上所述第一标识宏,在所述待监控函数的退出点打上所述第二标识宏,在所述待监控函数的进入点与退出点之间打上任意个所述第三标识宏;所述将所述待监控函数中的所述标识宏替换成所述关联函数,具体为:将所述第一标识宏、所述第二标识宏、所述第三标识宏分别替换成不同变量的所述关联函数;
执行单元,与所述设置单元连接,用于在待监控函数运行时执行所述关联函数的逻辑,并获取对应的字符串标识,所述在待监控函数运行时执行所述关联函数的逻辑,并获取对应的字符串标识,具体为:所述待监控函数运行至所述第一标识宏处时,所述字符串标识的对应位置写上第一字符;所述待监控函数运行至所述第二标识宏处时,所述字符串标识的对应位置写上第二字符;所述待监控函数运行至所述第三标识宏处时,所述字符串标识的对应位置写上第三字符;所述待监控函数未运行过的所述标识宏处,所述字符串标识的对应位置写上第四字符;
分析单元,与所述执行单元连接,用于根据所述字符串标识分析是否发生崩溃以及崩溃的位置,所述根据所述字符串标识分析是否发生崩溃以及崩溃的位置,还包括:遍历所述字符串标识;发现所述第一字符时,如果后面没有找到所述第二字符或者又出现另一个所述第一字符,则说明发生了崩溃;如果发现所述第一字符后又出现另一个所述第一字符,则前一个所述第一字符所在的待监控函数发生了崩溃。
6.一种存储器,所述存储器存储有计算机程序,其特征在于,所述计算机程序被处理器执行如下步骤:
设置与定位标识关联的关联函数,所述设置与定位标识关联的关联函数,具体为:定义标识宏作为所述定位标识;在待监控函数中添加所述标识宏;将所述待监控函数中的所述标识宏替换成所述关联函数;所述定义标识宏作为所述定位标识,具体为:在公共头文件中宏定义第一标识宏、第二标识宏、第三标识宏为空;所述在所述待监控函数中添加所述标识宏,具体为:在所述待监控函数的进入点打上所述第一标识宏,在所述待监控函数的退出点打上所述第二标识宏,在所述待监控函数的进入点与退出点之间打上任意个所述第三标识宏;所述将所述待监控函数中的所述标识宏替换成所述关联函数,具体为:将所述第一标识宏、所述第二标识宏、所述第三标识宏分别替换成不同变量的所述关联函数;
在待监控函数运行时执行所述关联函数的逻辑,并获取对应的字符串标识,所述在待监控函数运行时执行所述关联函数的逻辑,并获取对应的字符串标识,具体为:所述待监控函数运行至所述第一标识宏处时,所述字符串标识的对应位置写上第一字符;所述待监控函数运行至所述第二标识宏处时,所述字符串标识的对应位置写上第二字符;所述待监控函数运行至所述第三标识宏处时,所述字符串标识的对应位置写上第三字符;所述待监控函数未运行过的所述标识宏处,所述字符串标识的对应位置写上第四字符;
根据所述字符串标识分析是否发生崩溃以及崩溃的位置,所述根据所述字符串标识分析是否发生崩溃以及崩溃的位置,还包括:遍历所述字符串标识;发现所述第一字符时,如果后面没有找到所述第二字符或者又出现另一个所述第一字符,则说明发生了崩溃;如果发现所述第一字符后又出现另一个所述第一字符,则前一个所述第一字符所在的待监控函数发生了崩溃。
7.一种终端,包括存储器、处理器及存储在所述存储器中并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现如权利要求1至4任意一项所述的定位代码运行崩溃的方法的步骤。
CN201811085437.4A 2018-09-17 2018-09-17 定位代码运行崩溃的方法及装置、终端、存储器 Active CN110908819B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201811085437.4A CN110908819B (zh) 2018-09-17 2018-09-17 定位代码运行崩溃的方法及装置、终端、存储器

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201811085437.4A CN110908819B (zh) 2018-09-17 2018-09-17 定位代码运行崩溃的方法及装置、终端、存储器

Publications (2)

Publication Number Publication Date
CN110908819A CN110908819A (zh) 2020-03-24
CN110908819B true CN110908819B (zh) 2023-07-04

Family

ID=69812705

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201811085437.4A Active CN110908819B (zh) 2018-09-17 2018-09-17 定位代码运行崩溃的方法及装置、终端、存储器

Country Status (1)

Country Link
CN (1) CN110908819B (zh)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113419886B (zh) * 2021-06-21 2022-05-03 网易(杭州)网络有限公司 处理程序崩溃的方法、设备和计算机可读存储介质

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1728106A (zh) * 2004-07-26 2006-02-01 中兴通讯股份有限公司 一种应用程序故障的定位方法
CN103034575A (zh) * 2012-11-29 2013-04-10 北京奇虎科技有限公司 崩溃分析方法和装置
KR20140050333A (ko) * 2012-10-19 2014-04-29 에스케이플래닛 주식회사 크래시 로그 리포트 제어를 위한 시스템 및 방법
CN103914379A (zh) * 2014-03-25 2014-07-09 北京邮电大学 故障自动注入与故障检测的方法及其***
CN106294071A (zh) * 2016-08-11 2017-01-04 宁波舜宇光电信息有限公司 一种软件崩溃信息收集方法及其***
CN106294134A (zh) * 2016-07-29 2017-01-04 腾讯科技(深圳)有限公司 代码的崩溃定位方法及装置

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1728106A (zh) * 2004-07-26 2006-02-01 中兴通讯股份有限公司 一种应用程序故障的定位方法
KR20140050333A (ko) * 2012-10-19 2014-04-29 에스케이플래닛 주식회사 크래시 로그 리포트 제어를 위한 시스템 및 방법
CN103034575A (zh) * 2012-11-29 2013-04-10 北京奇虎科技有限公司 崩溃分析方法和装置
CN103914379A (zh) * 2014-03-25 2014-07-09 北京邮电大学 故障自动注入与故障检测的方法及其***
CN106294134A (zh) * 2016-07-29 2017-01-04 腾讯科技(深圳)有限公司 代码的崩溃定位方法及装置
CN106294071A (zh) * 2016-08-11 2017-01-04 宁波舜宇光电信息有限公司 一种软件崩溃信息收集方法及其***

Also Published As

Publication number Publication date
CN110908819A (zh) 2020-03-24

Similar Documents

Publication Publication Date Title
US7210123B2 (en) Software evaluation system having source code and function unit identification information in stored administration information
US9652366B2 (en) Code change analysis to optimize testing lifecycle
CN107171825B (zh) 一种终端的重复日志过滤方法
CN107800757B (zh) 用户行为记录方法及装置
CN104598809A (zh) 程序的监控方法及其防御方法以及相关装置
CN111930472B (zh) 一种代码调试方法、装置、电子设备及存储介质
CN113067743A (zh) 流规则提取方法、装置、***及存储介质
CN111124789B (zh) 一种芯片仿真调试***及调试方法
CN111884876A (zh) 一种网络协议的协议类型检测方法、装置、设备及介质
CN112765032A (zh) 程序调试方法、装置、设备及存储介质
CN110908819B (zh) 定位代码运行崩溃的方法及装置、终端、存储器
CN110287700B (zh) 一种iOS应用安全分析方法及装置
CN115620799A (zh) 基于固件仿真的故障现场回溯方法、设备及可读存储介质
CN110414218B (zh) 内核检测方法、装置、电子设备及存储介质
EP3514680B1 (en) Identification of changes in functional behavior and runtime behavior of a system during maintenance cycles
CN109976683B (zh) 数据的打印方法、装置、设备和存储介质
Lo et al. Efficient mining of recurrent rules from a sequence database
CN113360379A (zh) 程序测试方法和程序测试装置
CN108459952B (zh) 程序异常的处理方法及***
CN112748930B (zh) 编译检测方法、装置、设备及存储介质
KR102256894B1 (ko) 크래시 리포트 그룹핑 방법, 서버 및 컴퓨터 프로그램
CN111667214B (zh) 基于二维码的货物信息获取方法、装置及电子设备
CN110096281B (zh) 代码解析方法、解析服务器、存储介质及装置
CN114741700A (zh) 基于符号化污点分析的公共组件库漏洞可利用性分析方法及装置
CN114281628A (zh) 一种***故障检测方法、装置、电子设备及存储介质

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
CB02 Change of applicant information
CB02 Change of applicant information

Address after: 200438 9 / F, 10 / F, 11 / F, 12 / F, 38 Lane 1688, Guoquan North Road, Yangpu District, Shanghai

Applicant after: QIANXUN SPATIAL INTELLIGENCE Inc.

Address before: Room j165, 1st floor, building 64, 1436 Jungong Road, Yangpu District, Shanghai, 200433

Applicant before: QIANXUN SPATIAL INTELLIGENCE Inc.

GR01 Patent grant
GR01 Patent grant