CN104252402B - 一种程序调试方法及装置 - Google Patents
一种程序调试方法及装置 Download PDFInfo
- Publication number
- CN104252402B CN104252402B CN201410452848.8A CN201410452848A CN104252402B CN 104252402 B CN104252402 B CN 104252402B CN 201410452848 A CN201410452848 A CN 201410452848A CN 104252402 B CN104252402 B CN 104252402B
- Authority
- CN
- China
- Prior art keywords
- function
- program
- address
- dynamically recording
- address information
- 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
Links
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本发明实施例公开了一种程序调试方法,包括:在程序中的函数的入口处进行插桩,用以获得该程序执行到该函数的入口时该函数的地址信息,记录该函数的地址信息于动态记录表中,保存动态记录表于预定存储区域;在该程序中的函数的出口处进行插桩,用以从动态记录表中删除该函数的地址信息,保存动态记录表于预定存储区域;根据预定存储区域中的动态记录表生成程序运行信息。相应地,本发明实施例还公开了一种装置。采用本发明,可以获取程序在异常退出之前的运行信息,可以根据该运行信息缩小异常所在的范围,快速定位问题,提升开发效率。
Description
技术领域
本发明涉及计算机领域,尤其涉及一种程序调试方法及装置。
背景技术
在嵌入式系统上开发软件,开发人员最大一部分时间都是花在调试过程中。软件调试可分为静态调试与动态调试两种,其中,静态调试可以通过输出寄存器的内容和在程序源码中插入打印语句来实现;动态调试可以通常利用程序语言提供的调试功能或专门的调试工具来分析程序的动态行为,一般程序语言和工具提供的调试功能有检查主存和寄存器;设置断点,即当执行到特定语句或改变特定变量的值时,程序停止执行,以便分析程序此时的状态。通过以上所列的调试方式可以解决大部分程序调试问题,可以提高开发者的开发效率。
但是,对于软件中依赖硬件、随机性出现的死机,且死机时堆栈被破坏的问题可能就显得无能为力了,特别是针对需要长时间拷机才会出现的问题,用以上调试方式可能会费时费力并且得不到想要的结果。
发明内容
本发明实施例所要解决的技术问题是提供一种程序调试方法及装置,可以获取程序在异常退出之前的运行信息,可以根据该运行信息快速定位问题,提升开发效率。
为解决上述问题,本发明的技术方案为:
第一方面,本发明实施例提供了一种程序调试方法,包括:
在程序中的函数的入口处进行插桩,用以获得程序执行到函数的入口时函数的地址信息,记录该函数的地址信息于动态记录表中,保存动态记录表于预定存储区域;
在程序中的函数的出口处进行插桩,用以从动态记录表中删除该函数的地址信息,保存动态记录表于预定存储区域;
根据预定存储区域中的动态记录表生成程序运行信息。
具体的,函数的地址信息包括函数的地址;根据预定存储区域中的动态记录表生成程序运行信息包括:
根据动态记录表和程序的符号表来得到导致程序在运行过程中出现异常的相关函数;符号表包括程序中全部函数和全部函数的地址。
具体的,函数的地址信息包括函数的地址和函数被调用处的地址;根据预定存储区域中的动态记录表生成程序运行信息还包括:
根据动态记录表中记录的函数的地址和函数被调用处的地址来得到程序的调用路径。
具体的,当程序为多线程的程序时,记录函数的地址信息于动态记录表中具体包括:
记录函数所属的线程的信息于动态记录表中;
记录函数的地址和函数被调用处的地址于动态记录表中;
从动态记录表中删除函数的地址信息具体包括:
将函数的地址从动态记录表中删除;
判断函数所属的线程是否结束;如果函数所属的线程结束,则将函数所属的线程的信息从动态记录表中删除。
具体的,动态记录表为链表的形式;函数的地址信息为链表中的节点;
记录函数的地址信息于动态记录表中具体为将函数的地址信息添加到链表中;
从动态记录表中删除函数的地址信息具体为将函数的地址信息从链表中删除。
具体的,当程序为单线程程序时,据动态记录表和程序的符号表来得到导致程序在运行过程中出现异常的相关函数具体包括:
根据符号表得到动态记录表中最后被添加的函数的地址信息对应的函数;则定位最后被添加的函数的地址信息对应的函数为相关函数。
具体的,当程序为多线程程序时,动态记录表还包括函数所属的线程的信息;
根据动态记录表和程序的符号表来得到导致程序在运行过程中出现异常的相关函数具体包括:
根据符号表得到动态记录表中各个线程的最后被添加的函数的地址信息对应的函数;则定位各个线程的最后被添加的函数的地址信息对应的函数为相关函数。
具体的,在根据预定存储区域中的动态记录表和程序的符号表来定位导致程序在运行过程中出现异常的相关函数之前,还包括:通过反汇编程序的可执行文件来获取程序的符号表。
具体的,链表具体可为复合型链表,复合型链表为线程链表和多个地址链表结合而形成,其中:同一线程中的函数的地址信息存储于同一个地址链表中,各个地址链表的表头存储各自对应的线程的信息,各个地址链表的表头形成线程链表。
第二方面,本发明实施例提供了一种程序调试装置,包括:
第一插桩模块,用于在程序中的函数的入口处进行插桩,用以获得程序执行到函数的入口时函数的地址信息,记录该函数的地址信息于动态记录表中,保存动态记录表于预定存储区域;
第二插桩模块,用于在程序中的函数的出口处进行插桩,用以从动态记录表中删除该函数的地址信息,保存动态记录表于预定存储区域;
运行信息生成模块,用于根据预定存储区域中的动态记录表生成程序运行信息。
具体的,函数的地址信息包括函数的地址;运行信息生成模块包括:异常定位模块,用于根据动态记录表和程序的符号表来得到导致程序在运行过程中出现异常的相关函数;符号表包括程序中全部函数和全部函数的地址。
具体的,函数的地址信息包括函数的地址和函数被调用处的地址;运行信息生成模块还包括:调用路径生成模块,用于根据动态记录表中记录的函数的地址和函数被调用处的地址来得到程序的调用路径。
具体的,当程序为多线程的程序时,第一插桩模块执行记录函数的地址信息于动态记录表中的步骤具体包括:
记录函数所属的线程的信息于动态记录表中;
记录函数的地址和函数被调用处的地址于动态记录表中;
第二插桩模块执行从动态记录表中删除函数的地址信息的步骤具体包括:
将函数的地址从动态记录表中删除;
判断函数所属的线程是否结束;如果函数所属的线程结束,则将函数所属的线程的信息从动态记录表中删除。
具体的,动态记录表为链表的形式,函数的地址信息为链表中的节点;
第一插桩模块执行记录函数的地址信息于动态记录表中的步骤具体为将函数的地址信息添加到链表中;
第二插桩模块执行从动态记录表中删除函数的地址信息的步骤具体为将函数的地址信息从链表中删除。
具体的,异常定位模块包括第一定位模块,用于当程序为单线程程序时,根据符号表得到动态记录表中最后被添加的函数的地址信息对应的函数;则定位最后被添加的函数的地址信息对应的函数为相关函数。
具体的,异常定位模块还包括第二定位模块,用于当程序为多线程程序时,函数的地址信息还包括函数所属的线程的信息;根据符号表得到动态记录表中各个线程的最后被添加的函数的地址信息对应的函数;则定位各个线程的最后被添加的函数的地址信息对应的函数为相关函数。
具体的,还包括:符号表获取模块,用于在异常定位模块执行根据预定存储区域中的动态记录表和程序的符号表来定位导致程序在运行过程中出现异常的相关函数的步骤之前,还包括:通过反汇编程序的可执行文件来获取符号表。
具体的,第一定位模块包括:
第一信息处理模块,用于根据符号表得到动态记录表中最后被添加的函数的地址信息对应的函数;
第一分析模块,用于定位最后被添加的函数的地址信息对应的函数为相关函数。
具体的,第二定位模块包括:
第二信息处理模块,用于根据符号表得到动态记录表中各个线程的最后被添加的函数的地址信息对应的函数;
第二分析模块,用于定位各个线程的最后被添加的函数的地址信息对应的函数为相关函数。
通过实施本发明实施例,通过在程序中的函数的入口处进行插桩,用以记录该程序执行到函数的入口时函数的地址信息于动态记录表中,并通过在该程序中的函数的出口处进行插桩,用以从动态记录表中删除所述程序执行到所述函数的出口时所述函数的地址信息,根据动态记录表得到程序运行信息,可以获取程序在异常退出之前的运行信息,可以根据该运行信息缩小异常所在的范围,快速定位问题,提升开发效率。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例的程序调试方法的流程图;
图2是本发明实施例的动态记录表的示意图;
图3是本发明实施例的程序中的多线程堆栈调用示意图;
图4是本发明实施例的程序中的函数插桩之后的流程图;
图5是本发明的一种实施例的程序调试装置的结构示意图;
图6是本发明实施例的运行信息生成模块的结构示意图;
图7是本发明实施例的异常定位模块的结构示意图;
图8是本发明实施例的第一定位模块的结构示意图;
图9是本发明实施例的第二定位模块的结构示意图;
图10是本发明的另一种实施例的程序调试装置的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
需要说明的是,在本发明实施例中使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本发明。在本发明实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
参见图1,是本发明实施例的程序调试方法的流程图。如图所示本实施例中的程序调试方法的流程可以包括:
步骤S101:在程序中的函数的入口处进行插桩,用以获得程序执行到函数的入口时函数的地址信息,记录函数的地址信息于动态记录表中,保存动态记录表于预定存储区域。
具体的,选择程序中的函数的入口处作为插桩位置,并且在该插桩位置插入自定义的测试功能,以使得该程序在运行进入该函数的入口时,可执行该自定义的测试功能,获取该程序在进入该函数时的运行状态;该自定义的测试功能可主要用来监测程序执行到程序中的函数的入口时该函数的地址信息,并及时记录该函数的地址信息,保存该函数的地址信息于预定的存储区域,该预定的存储区域可使得即使在程序运行异常退出后,也不丢失已保存的信息。
可理解的,同一线程中的函数是顺序执行的,函数的调用包括函数进入和函数退出两个动作,如果程序执行时,该函数只有进入动作而没有退出动作,即可表明程序运行在该函数中出现异常;上述函数入口处插入的自定义的测试功能可记录程序进入该函数时该函数的地址信息,可使得记录的该函数的地址信息作为后续调试分析的依据。
具体的,当程序为多线程的程序时,上述函数入口处插入的自定义的测试功能还可以:记录函数所属的线程的信息于动态记录表中;记录函数的地址和函数被调用处的地址于动态记录表中。可理解的,对于多线程程序,函数的执行是跨线程的。上述函数入口处插入的自定义的测试功能可以将该函数所属的线程的信息记录于动态记录表中,其方式可以是将该函数所属的线程标识记录于该函数的地址信息中,其方式还可以是在动态记录表中按照该函数所属的线程信息来分类存储该函数的地址信息。
需要说明的,上述函数入口处插入的自定义的测试功能可以由单个插桩函数实现,也可以由多个插桩函数实现,这里不作限制;本步骤中采用的插桩既可以是源代码插桩,也可以是目标代码插桩。
步骤S103:在程序中的函数的出口处进行插桩,用以从动态记录表中删除函数的地址信息,保存动态记录表于预定存储区域。
具体的,选择程序中的函数的出口处作为插桩位置,并且在该插桩位置插入自定义的测试功能,以使得该程序在执行到该函数的出口时,可执行该自定义的测试功能,获取该程序在退出该函数时的运行状态;该自定义的测试功能可主要用来监测程序退出函数时该函数的地址信息,并及时将该函数的地址信息从动态记录表中删除,保存更新后的动态记录表于预定的存储区域,该预定的存储区域可使得即使在程序运行异常退出后,也不丢失内容。
可理解的,同一线程中的函数是顺序执行的,函数的调用包括函数进入和函数退出两个动作,如果程序执行时,程序执只有进入该函数的动作而没有退出该函数的动作,即可表明程序运行在该函数中出现异常;上述函数出口处插入的自定义的测试功能可在程序退出该函数时将该函数的地址信息从动态记录表中删除,如果在程序出现异常结束运行时,动态记录表中有该函数的地址信息,则可以初步判定该函数可能为导致程序出现异常的相关函数。
具体的,当程序为多线程的程序时,上述函数出口处插入的自定义的测试功能还可以:将函数的地址从动态记录表中删除;判断函数所属的线程是否结束;如果函数所属的线程结束,则将函数所属的线程的信息从动态记录表中删除。可理解的,对于多线程程序,函数的执行是跨线程的。上述函数出口处插入的自定义的测试功能可以在程序退出该函数时将该函数的地址信息从动态记录表中删除,并可判断该函数所属的线程是否结束,如果该函数所属的线程结束,则将该线程的信息从动态记录表中删除。
需要说明的,上述函数出口处插入的自定义的测试功能可以由单个插桩函数实现,也可以由多个插桩函数实现,这里不作限制;本步骤中采用的插桩既可以是源代码插桩,也可以是目标代码插桩。
步骤S105:根据预定存储区域中的动态记录表生成程序运行信息。
具体的,预定存储区域的动态记录表中记录了程序运行过程中函数的调用情况。程序结束运行时,动态记录表中记录的函数的地址信息为导致函数出现异常的嫌疑函数的地址信息。
具体的,前述函数的地址信息可包括函数的地址;步骤S105可包括:根据动态记录表和程序的符号表来得到导致程序在运行过程中出现异常的相关函数;其中,程序的符号表包括程序中全部函数和全部函数的地址。在此之前,可通过反汇编程序的可执行文件来获取程序的符号表,例如,在生成程序的可执行文件时利用GCC编译器(GNU CompilerCollection)的“-rdynamic”选项来通知链接器将程序中全部函数的符号添加到符号表中,之后,利用“Objdump”等工具将该可执行文件反汇编来得到符号表。根据程序的符号表中的函数列表和其对应的函数地址可获得动态记录表中的函数的地址信息对应的具体函数,可初步判定动态记录中的地址信息对应的函数为导致程序异常的相关函数。
具体的,前述函数的地址信息还可包括函数被调用处的地址;步骤S105还可包括:根据动态记录表中记录的函数的地址和函数被调用处的地址来得到程序的调用路径。根据动态记录表中记录的函数的地址和函数被调用处的地址,结合程序中各函数分配的栈段,可以得出程序的调用路径,可更具体的定位导致程序出现异常的位置。
进一步的,前述动态记录表可以为链表的形式;前述函数的地址信息可为链表中的节点;步骤S101中所述的记录函数的地址信息于动态记录表中可具体为将函数的地址信息添加到链表中;步骤S103中所述的从动态记录表中删除函数的地址信息可具体为将函数的地址信息从链表中删除。
更进一步的,上述链表可具体为复合型链表,该复合型链表为线程链表和多个地址链表结合而形成,其中:同一线程中的函数的地址信息存储于同一个地址链表中,各个地址链表的表头存储各自对应的线程的信息,各个地址链表的表头形成线程链表。
优选的,动态记录表可以采用十字链表来存储程序中的函数的地址信息,十字链表的操作效率高。该十字链表可以是图4所示的十字链表。如图4所示的十字链表,“链表头”作为整个链表的入口,其中,“NEXT”指针指向线程链表的第一个节点,当无函数调用时,“NEXT”指针为空;“链表头1”对应具体的“线程1”,“链表头2”对应具体的“线程2”,以此类推。同一线程内函数的调用是按顺序进行的,对于多线程程序,按照线程的信息将函数的调用进行分类处理。每新增一个线程时,就可在线程链表中创建一个线程节点;当该线程结束运行时,将该线程对应的节点从线程链表中删除;其中,“函数地址链表头”对应该线程中第一个被调用的函数,如果没有函数调用时,“函数地址链表头”为空。“地址链表头”类型的节点对应程序中被调用的函数的地址信息。如果线程内新增函数调用时,会创建该类型的节点,并将该函数的地址和该函数被调用处的地址记录在相对应的链表头中;如果该函数没有子函数被调用,则该函数对应的链表头不指向下一个链表头。
又例如,如果程序出现异常结束运行时,预定存储区域的动态记录表如图2所示,则可将“线程1”最后被添加的函数C,“线程2”最后被添加的函数Z以及“线程N”最后被添加的“函数G”作为导致程序出现异常的相关函数,缩小了定位问题的范围。
示例仅仅是本发明实施例的一种方式,实际使用中还可以不同,不应构成限定。
更进一步的,当程序为单线程程序时,步骤S105所述的根据动态记录表和程序的符号表来得到导致程序在运行过程中出现异常的相关函数可具体包括:根据程序的符号表得到动态记录表中最后被添加的函数的地址信息对应的函数;则可定位动态记录表中最后被添加的函数的地址信息对应的函数为导致程序出现异常的相关函数。
更进一步的,当程序为多线程程序时,动态记录表还包括函数所属的线程的信息;步骤S105所述的根据所述动态记录表和所述程序的符号表来得到导致所述程序在运行过程中出现异常的相关函数可具体包括:根据程序的符号表得到动态记录表中各个线程的最后被添加的函数的地址信息对应的函数;则定位各个线程的最后被添加的函数的地址信息对应的函数为导致程序出现异常的相关函数。具体的,多线程程序执行时,函数调用关系可以如图3所示,每一个线程有一个栈区,其中,程序的执行从线程A切换到线程B,从线程B切换到线程C;线程A的函数调用出现嵌套,函数f1调用函数f2;线程B的函数调用出现嵌套,函数g1调用函数g2;线程C的函数调用也出现嵌套,函数h1调用函数h2。对于图3所示的程序的函数调用关系,当程序进入到线程C的函数h2中时,动态记录表的记录状态为:函数f1、函数f2、函数g1、函数g2、函数h1、函数h2的地址信息;当程序退出线程C的函数h2时,动态记录表的记录状态为:函数f1、函数f2、函数g1、函数g2、函数h1的地址信息;以此类推,可以得出程序在函数调用的各个阶段时动态记录表的记录状态。
可理解的,对于多线程程序,在程序出现异常结束运行后,动态记录表中如果存在有多个线程的函数的地址信息,则可初步判定每个线程最后一个被添加的函数的地址信息对应的函数为导致程序出现异常的相关函数。
需要说明的,本发明实施例中所述的函数入口处插入的自定义的测试功能和函数出口处插入的自定义的测试功能在采用目标代码插桩方式时,可以相互结合形成独立于平台的动态库。例如,运行程序时,利用GCC编译器(GNU Compiler Collection)的“-finstrument-functions”特性来链接前述自定义的测试功能模块即可实现独立于平台的调试方法。示例仅仅是本发明实施例的一种方式,实际使用中还可以不同,不应构成限定。
参见图4,是本发明实施例的程序中的函数插桩之后的流程图。需要说明的,本流程主要用于说明本发明实施例中的插桩功能在程序中的插桩位置,以及程序中的函数在插桩之后执行流程;图4中的虚线框所示的步骤为插桩功能,并不是程序的执行步骤,虚线框所示的步骤与程序的执行互不影响,彼此完整独立。如图4所示,步骤S201,步骤S205,步骤S213,步骤S215以及步骤S223为程序的执行流程,步骤S203,步骤S207,步骤S209,步骤S211,步骤S217步骤S219以及步骤S221为插桩功能,用以获取程序执行时的信息。其中:
步骤S201:准备。
具体的,程序准备进入函数,具体实现中可以是为函数分配运行空间等操作。
步骤S203:获取函数被调用处的地址。
具体的,本步骤可以为前述函数入口处插入的自定义的测试功能的一部分,可以插入在程序准备进入函数之后,主要可用于获取程序中的函数被调用处的地址。
步骤S205:进入函数。
具体的,程序执行到函数入口处。
步骤S207:获取函数的地址。
具体的,本步骤可为前述函数入口处插入的自定义的测试功能的一部分,可以插入在程序刚进入函数时,主要可用于获取函数的地址。
步骤S209:记录函数的地址信息于动态记录表中。
具体的,本步骤可为前述函数入口处插入的自定义的测试功能的一部分,主要用于将步骤S207中获取的函数的地址信息,该地址信息可以包括函数的地址和函数被调用处的地址。
步骤S211:保存动态记录表于预定存储区域。
具体的,本步骤可为前述函数入口处插入的自定义的测试功能的一部分,主要用于将动态记录表保存在预定区域,该区域可以在程序出现异常结束运行时实现该区域内数据不丢失。
步骤S213:执行函数内部流程。
步骤S215:退出函数。
具体的,程序执行到函数出口处。
步骤S217:获取函数的地址。
具体的,本步骤可为前述函数出口处插入的自定义的测试功能的一部分,可以插入在程序退出函数时,主要可用于获取函数的地址。
步骤S219:将函数的地址信息从动态记录表中删除。
具体的,本步骤可为前述函数出口处插入的自定义的测试功能的一部分,主要可用于删除动态记录表中与步骤S217获取的函数地址相同的函数地址以及该函数地址对应的函数被调用处的地址。
步骤S221:保存动态记录表于预定存储区域。
具体的,本步骤可为前述函数出口处插入的自定义的测试功能的一部分,主要用于将动态记录表保存在预定区域,该区域可以在程序出现异常结束运行时实现该区域内数据不丢失。
步骤S223:结束。
需要说明的,图4的上述各步骤所示的函数插桩后的执行流程可适用于程序中的全部函数,图中所示的插桩位置也可适用于程序中的全部函数。
可理解的,通过上述虚线框所示的插桩功能,可实现在函数的入口处和函数的出口处监测程序的运行情况;如果程序结束运行时,动态记录表中存有函数的地址信息,可说明程序只有进入该函数的动作而没有退出该函数的动作,即可表明程序运行在该函数中出现异常。
上述详细阐述了本发明实施例的方法,下面为了便于更好地实施本发明实施例的上述方案,相应地,下面还提供用于配合实施上述方案的相关设备。
参见图5,是本发明的一种实施例的程序调试的装置的结构示意图。如图5所示的程序调试装置50可至少包括:第一插桩模块501、第二插桩模块503以及运行信息生成模块505。其中:
第一插桩模块501,用于在程序中的函数的入口处进行插桩,用以获得程序执行到该函数的入口时该函数的地址信息,记录该函数的地址信息于动态记录表中,保存动态记录表于预定存储区域;
第二插桩模块503,用于在程序中的函数的出口处进行插桩,用以从动态记录表中删除该函数的地址信息,保存动态记录表于预定存储区域;
运行信息生成模块505,用于根据预定存储区域中的动态记录表生成程序运行信息。
进一步的,当程序为多线程的程序时,第一插桩模块501记录函数的地址信息于动态记录表中可具体包括:
记录函数所属的线程的信息于动态记录表中;
记录函数的地址和函数被调用处的地址于动态记录表中;
第二插桩模块503从动态记录表中删除函数的地址信息的步骤可具体包括:
将函数的地址从动态记录表中删除;
判断函数所属的线程是否结束;如果函数所属的线程结束,则将函数所属的线程的信息从动态记录表中删除。
更进一步的,动态记录表可为链表的形式,函数的地址信息可为链表中的节点;第一插桩模块501记录函数的地址信息于动态记录表中可具体为将函数的地址信息添加到链表中;第二插桩模块503从动态记录表中删除函数的地址信息可具体为将函数的地址信息从链表中删除。
更进一步的,具体实现中,运行信息生成模块505可以如图6所示包括:异常定位模块5051和调用路径生成模块5053。其中:
异常定位模块5051,用于根据动态记录表和程序的符号表来得到导致程序在运行过程中出现异常的相关函数;符号表包括程序中全部函数和全部函数的地址。
调用路径生成模块5053,用于根据动态记录表中记录的函数的地址和函数被调用处的地址来得到程序的调用路径。
更进一步的,异常定位模块5051可如图7所示包括:第一定位模块50511和第二定位模块50513。其中:
第一定位模块50511,用于当程序为单线程程序时,根据符号表得到动态记录表中最后被添加的函数的地址信息对应的函数;则定位该最后被添加的函数的地址信息对应的函数为导致程序出现异常的相关函数。
第二定位模块50513,用于当程序为多线程程序时,函数的地址信息还包括函数所属的线程的信息;根据符号表得到动态记录表中各个线程的最后被添加的函数的地址信息对应的函数;则定位各个线程的最后被添加的函数的地址信息对应的函数为导致程序出现异常的相关函数。
更进一步的,第一定位模块50511可以如图8所示包括:第一信息处理模块505111和第一分析模块505113。其中:
第一信息处理模块505111,用于根据符号表得到动态记录表中最后被添加的函数的地址信息对应的函数;
第一分析模块505113,用于定位最后被添加的函数的地址信息对应的函数为导致程序出现异常的相关函数。
更进一步的,第二定位模块50513可如图9所示包括:第二信息处理模块505131和第二分析模块505133。其中:
第二信息处理模块505131,用于根据符号表得到动态记录表中各个线程的最后被添加的函数的地址信息对应的函数;
第二分析模块505133,用于定位各个线程的最后被添加的函数的地址信息对应的函数为导致程序出现异常的相关函数。
参见图10,是本发明的另一种实施例的程序调试装置的结构示意图。进一步的,更详细的示出了程序调试装置50的结构,如图10所示的程序调试装置50可包括:第一插桩模块501、第二插桩模块503以及运行信息生成模块505外,还可包括符号表获取模块507。其中:
运行信息生成模块505包括异常定位模块5051;
符号表获取模块507,用于在异常定位模块5051执行根据预定存储区域中的动态记录表和程序的符号表来定位导致程序在运行过程中出现异常的相关函数的步骤之前,还包括:通过反汇编程序的可执行文件来获取程序的符号表。
综上所述,通过实施本发明实施例,在程序中的函数的入口处进行插桩,用以记录该程序执行到函数的入口时函数的地址信息于动态记录表中,并在该程序中的函数的出口处进行插桩,用以从动态记录表中删除所述程序执行到所述函数的出口时所述函数的地址信息,根据动态记录表得到程序运行信息,可以获取程序在异常退出之前的运行信息,可以根据该运行信息缩小异常所在的范围,快速定位问题,提升开发效率。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(Random AccessMemory,RAM)等。
以上所揭露的仅为本发明一种较佳实施例而已,当然不能以此来限定本发明之权利范围,本领域普通技术人员可以理解实现上述实施例的全部或部分流程,并依本发明权利要求所作的等同变化,仍属于发明所涵盖的范围。
Claims (17)
1.一种程序调试方法,其特征在于,包括:
在程序中的函数的入口处进行插桩,用以获得所述程序执行到所述函数的入口时所述函数的地址信息,记录所述函数的地址信息于动态记录表中,保存所述动态记录表于预定存储区域;其中,所述动态记录表为链表的形式,所述函数的地址信息为所述链表中的节点;
在所述程序中的函数的出口处进行插桩,用以从所述动态记录表中删除所述函数的地址信息,保存所述动态记录表于所述预定存储区域;
根据所述预定存储区域中的动态记录表生成程序运行信息。
2.如权利要求1所述的方法,其特征在于,所述函数的地址信息包括所述函数的地址;所述根据所述预定存储区域中的动态记录表生成程序运行信息包括:
根据所述动态记录表和所述程序的符号表来得到导致所述程序在运行过程中出现异常的相关函数;所述符号表包括所述程序中全部函数和所述全部函数的地址。
3.如权利要求1所述的方法,其特征在于,所述函数的地址信息包括所述函数的地址和所述函数被调用处的地址;所述根据所述预定存储区域中的动态记录表生成程序运行信息还包括:
根据所述动态记录表中记录的函数的地址和所述函数被调用处的地址来得到所述程序的调用路径。
4.如权利要求1所述的方法,其特征在于,包括:当所述程序为多线程的程序时,
所述记录所述函数的地址信息于动态记录表中具体包括:
记录所述函数所属的线程的信息于动态记录表中;
记录所述函数的地址和所述函数被调用处的地址于动态记录表中;
所述从所述动态记录表中删除所述函数的地址信息具体包括:
将所述函数的地址从所述动态记录表中删除;
判断所述函数所属的线程是否结束;如果所述函数所属的线程结束,则将所述函数所属的线程的信息从所述动态记录表中删除。
5.如权利要求2所述的方法,其特征在于,还包括:当所述程序为单线程程序时,所述根据所述动态记录表和所述程序的符号表来得到导致所述程序在运行过程中出现异常的相关函数具体包括:
根据所述符号表得到所述动态记录表中最后被添加的函数的地址信息对应的函数;则定位所述最后被添加的函数的地址信息对应的函数为所述相关函数。
6.如权利要求2所述的方法,其特征在于,还包括:当所述程序为多线程程序时,所述动态记录表还包括所述函数所属的线程的信息;
所述根据所述动态记录表和所述程序的符号表来得到导致所述程序在运行过程中出现异常的相关函数具体包括:
根据所述符号表得到所述动态记录表中各个线程的最后被添加的函数的地址信息对应的函数;则定位所述各个线程的最后被添加的函数的地址信息对应的函数为所述相关函数。
7.如权利要求2所述的方法,其特征在于,在所述根据所述预定存储区域中的动态记录表和所述程序的符号表来定位导致所述程序在运行过程中出现异常的相关函数之前,还包括:通过反汇编所述程序的可执行文件来获取所述符号表。
8.如权利要求1所述的方法,其特征在于,所述链表具体为复合型链表,所述复合型链表为线程链表和多个地址链表结合而形成,其中:同一线程中的函数的地址信息存储于同一个地址链表中,各个地址链表的表头存储各自对应的线程的信息,所述各个地址链表的表头形成线程链表。
9.一种程序调试的装置,其特征在于,包括:
第一插桩模块,用于在程序中的函数的入口处进行插桩,用以获得所述程序执行到所述函数的入口时所述函数的地址信息,记录所述函数的地址信息于动态记录表中,保存所述动态记录表于预定存储区域;其中,所述动态记录表为链表的形式,所述函数的地址信息为所述链表中的节点;
第二插桩模块,用于在所述程序中的函数的出口处进行插桩,用以从所述动态记录表中删除所述函数的地址信息,保存所述动态记录表于所述预定存储区域;
运行信息生成模块,用于根据所述预定存储区域中的动态记录表生成程序运行信息。
10.如权利要求9所述的装置,其特征在于,所述函数的地址信息包括所述函数的地址;所述运行信息生成模块包括:异常定位模块,用于根据所述动态记录表和所述程序的符号表来得到导致所述程序在运行过程中出现异常的相关函数;所述符号表包括所述程序中全部函数和所述全部函数的地址。
11.如权利要求9所述的装置,其特征在于,所述函数的地址信息包括所述函数的地址和所述函数被调用处的地址;所述运行信息生成模块还包括:调用路径生成模块,用于根据所述动态记录表中记录的函数的地址和所述函数被调用处的地址来得到所述程序的调用路径。
12.如权利要求9所述的装置,其特征在于,当所述程序为多线程的程序时,
所述第一插桩模块执行所述记录所述函数的地址信息于动态记录表中的步骤具体包括:
记录所述函数所属的线程的信息于动态记录表中;
记录所述函数的地址和所述函数被调用处的地址于动态记录表中;
所述第二插桩模块执行所述从所述动态记录表中删除所述函数的地址信息的步骤具体包括:
将所述函数的地址从所述动态记录表中删除;
判断所述函数所属的线程是否结束;如果所述函数所属的线程结束,则将所述函数所属的线程的信息从所述动态记录表中删除。
13.如权利要求10所述的装置,其特征在于,所述异常定位模块包括第一定位模块,用于当所述程序为单线程程序时,根据所述符号表得到所述动态记录表中最后被添加的函数的地址信息对应的函数;则定位所述最后被添加的函数的地址信息对应的函数为所述相关函数。
14.如权利要求10所述的装置,其特征在于,所述异常定位模块还包括第二定位模块,用于当所述程序为多线程程序时,所述函数的地址信息还包括所述函数所属的线程的信息;根据所述符号表得到所述动态记录表中各个线程的最后被添加的函数的地址信息对应的函数;则定位所述各个线程的最后被添加的函数的地址信息对应的函数为所述相关函数。
15.如权利要求10所述的装置,其特征在于,还包括:符号表获取模块,用于在所述异常定位模块执行所述根据所述预定存储区域中的动态记录表和所述程序的符号表来定位导致所述程序在运行过程中出现异常的相关函数的步骤之前,还包括:通过反汇编所述程序的可执行文件来获取所述符号表。
16.如权利要求13所述的装置,其特征在于,所述第一定位模块包括:
第一信息处理模块,用于根据所述符号表得到所述动态记录表中最后被添加的函数的地址信息对应的函数;
第一分析模块,用于定位所述最后被添加的函数的地址信息对应的函数为所述相关函数。
17.如权利要求14所述的装置,其特征在于,所述第二定位模块包括:
第二信息处理模块,用于根据所述符号表得到所述动态记录表中各个线程的最后被添加的函数的地址信息对应的函数;
第二分析模块,用于定位所述各个线程的最后被添加的函数的地址信息对应的函数为所述相关函数。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410452848.8A CN104252402B (zh) | 2014-09-05 | 2014-09-05 | 一种程序调试方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410452848.8A CN104252402B (zh) | 2014-09-05 | 2014-09-05 | 一种程序调试方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104252402A CN104252402A (zh) | 2014-12-31 |
CN104252402B true CN104252402B (zh) | 2018-04-27 |
Family
ID=52187332
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410452848.8A Active CN104252402B (zh) | 2014-09-05 | 2014-09-05 | 一种程序调试方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104252402B (zh) |
Families Citing this family (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107818034B (zh) * | 2016-09-14 | 2021-02-12 | 华为技术有限公司 | 监测计算机设备中的进程的运行空间的方法以及装置 |
CN109426504B (zh) * | 2017-08-29 | 2021-11-19 | 龙芯中科技术股份有限公司 | 程序的处理方法、装置、电子设备及存储介质 |
CN112740187A (zh) * | 2018-10-09 | 2021-04-30 | 华为技术有限公司 | 调试程序的方法和系统 |
CN110727577B (zh) * | 2019-08-29 | 2023-06-09 | 华东计算技术研究所(中国电子科技集团公司第三十二研究所) | 嵌入式系统软件中概率复现问题的调试方法、系统及介质 |
CN110728584B (zh) * | 2019-10-23 | 2023-03-21 | 泰康保险集团股份有限公司 | 信息处理方法及装置、可读存储介质和电子设备 |
CN113760290A (zh) * | 2020-06-04 | 2021-12-07 | 中兴通讯股份有限公司 | 一种程序控制方法、装置、计算机设备及存储介质 |
CN112241366A (zh) * | 2020-09-23 | 2021-01-19 | 厦门亿联网络技术股份有限公司 | 嵌入式设备测试方法、装置及电子设备 |
CN112363860A (zh) * | 2020-11-11 | 2021-02-12 | 中国建设银行股份有限公司 | 一种批处理作业异常中断检测方法及装置 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1564137A (zh) * | 2004-04-09 | 2005-01-12 | 中兴通讯股份有限公司 | 一种嵌入式系统多任务并发调试的方法 |
CN1949185A (zh) * | 2005-10-13 | 2007-04-18 | 同济大学 | 异构环境下支持多语言多平台的并行调试及性能分析方法 |
CN102622558A (zh) * | 2012-03-01 | 2012-08-01 | 北京邮电大学 | 一种二进制程序漏洞的挖掘装置和方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
GB0604991D0 (en) * | 2006-03-11 | 2006-04-19 | Slam Games Ltd | Instrumentation for real-time performance profiling |
-
2014
- 2014-09-05 CN CN201410452848.8A patent/CN104252402B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1564137A (zh) * | 2004-04-09 | 2005-01-12 | 中兴通讯股份有限公司 | 一种嵌入式系统多任务并发调试的方法 |
CN1949185A (zh) * | 2005-10-13 | 2007-04-18 | 同济大学 | 异构环境下支持多语言多平台的并行调试及性能分析方法 |
CN102622558A (zh) * | 2012-03-01 | 2012-08-01 | 北京邮电大学 | 一种二进制程序漏洞的挖掘装置和方法 |
Also Published As
Publication number | Publication date |
---|---|
CN104252402A (zh) | 2014-12-31 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104252402B (zh) | 一种程序调试方法及装置 | |
CN104424088B (zh) | 软件的测试方法及装置 | |
Nogueira et al. | Test generation from state based use case models | |
CN108595341B (zh) | 测试用例自动生成方法及系统 | |
US8024711B2 (en) | Software analysis tool | |
CN103853652B (zh) | 一种测试案例生成方法及装置 | |
AU2008328515B2 (en) | Multi language software code analysis | |
CN108319711A (zh) | 数据库的事务一致性测试方法、装置、存储介质及设备 | |
CN104375941A (zh) | 可执行程序测试用例集二进制代码覆盖率自动化评估方法 | |
CN105868626B (zh) | 基于控制流粗粒度完整性的监控软件业务行为的方法 | |
CN105224309B (zh) | 一种调取函数的方法和装置 | |
Pomeranz et al. | LOCSTEP: A logic-simulation-based test generation procedure | |
CN107545182A (zh) | 一种ios应用中绕过函数调用链检测的方法及系统 | |
CN103605606A (zh) | 一种可自动转换的嵌入式软件测试用例批量执行方法 | |
CN111679984B (zh) | 一种性能分析方法和装置 | |
CN109542444A (zh) | Java应用的监控方法、装置、服务器和存储介质 | |
Kameya et al. | RP-growth: top-k mining of relevant patterns with minimum support raising | |
Mannel et al. | Removing Implicit Places Using Regions for Process Discovery. | |
Lee et al. | A compiler optimization to reduce soft errors in register files | |
US11392699B2 (en) | Device, method, and system for synthesizing variants of semantically equivalent computer source code using computer source code components to protect against cyberattacks | |
CN103632099B (zh) | 未导出的Native API函数获取方法及装置 | |
Michaels et al. | Combinatorial-based event sequences for reduction of android test suites | |
CN102033804A (zh) | 辅助内存分析的方法和系统 | |
Reddy | Passivity and independence | |
CN110517718A (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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |