CN105446886A - 一种计算机程序调试方法和装置 - Google Patents
一种计算机程序调试方法和装置 Download PDFInfo
- Publication number
- CN105446886A CN105446886A CN201610004830.0A CN201610004830A CN105446886A CN 105446886 A CN105446886 A CN 105446886A CN 201610004830 A CN201610004830 A CN 201610004830A CN 105446886 A CN105446886 A CN 105446886A
- Authority
- CN
- China
- Prior art keywords
- executable program
- steering order
- instruction
- debugging
- package
- 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
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3664—Environments for testing or debugging software
Abstract
本发明的实施例提供一种计算机程序调试方法和装置,涉及计算机程序设计领域,用于在不修改程序的情况下对程序进行调试。该方法包括:加载可执行程序和调试参数;通过Hook机制对加载可执行程序的加载函数调用进行截获,获取可执行程序的package_name;解析调试参数生成记录链表,记录链表包括至少一个hook_package;当确定可执行程序的package_name属于记录链表时,对可执行程序进行调试。本发明的实施例用于计算机程序的调试。
Description
技术领域
本发明涉及计算机程序设计领域,尤其一种计算机程序调试方法和装置。
背景技术
随着Android系统市场占有率的增加,越来越多的开发者基于Android系统开发应用程序(英文全称:Application,简称:APP)。每款APP在开发完毕后,并不能立即上线,因为该APP在实际系统上使用时,可能会出现一些错误(英文名称:bug),比如在APP的某个用户界面(英文全称:UserInterface,简称:UI)在用户点击时无法响应,跳转时跳转失败或者逻辑错误等。因此对于APP一般在开发完成后,需要先进行调试,当确保APP可以运行正常后才会正式发布。
已有技术中的一种调试方式为:断点和单步执行调试,具体的,在程序的某些位置设置断点,调试时程序运行至该位置就会停止,然后对程序一步一步往下执行,若程序中有bug,则可以直接找到bug的位置。但是通过断点和单步执行的调试方式对程序进行调试时,首先需要集成开发环境(英文全程:IntegratedDevelopmentEnvironment,简称IDE)调试工具支持,而且必须配合计算机端的调试工具才能够进行;其次,断点和单步执行的调试对偶现问题很难进行调试。为了进一步调试程序中偶现问题,已有技术中提出的另一种调试方式为:加入日志(英文名称:log)调试,具体的,在编译程序时加入log,通过查看程序运行过程中生成的log查找程序中的bug。通过加入log试调虽然可以对程序中的偶现问题进行调试,但是在遇到偶现问题时常常存在log信息不足,需要重新加入log,重新编译程序版本进行异常的复现,而且很多情况下调试时没有程序的源码,无法重新编译程序版本。所以,如何在不修改程序的情况下对程序进行调试是本领域技术人员亟待解决的一个技术问题。
发明内容
本发明的实施例提供一种计算机程序调试方法和装置,用于在不修改程序的情况下对程序进行调试。
为达到上述目的,本发明的实施例采用如下技术方案:
第一方面,提供一种计算机程序调试方法,包括:
加载可执行程序和调试参数;
通过Hook机制对加载所述可执行程序的加载函数调用进行截获,获取所述可执行程序的package_name;
解析调试参数生成记录链表,所述记录链表包括至少一个hook_package;
当确定所述可执行程序的package_name属于所述记录链表时,对所述可执行程序进行调试。
第二方面,提供一种计算机程序调试装置,其特征在于,包括:
加载单元,加载可执行程序和调试参数;
获取单元,通过Hook机制对加载所述可执行程序的加载函数调用进行截获,获取所述可执行程序的package_name;
处理单元,解析调试参数生成记录链表,所述记录链表包括至少一个hook_package;
调试单元,用于当确定所述可执行程序的package_name属于所述记录链表时,对所述可执行程序进行调试。
本发明的实施例提供的计算机程序调试方法和装置,首先加载可执行程序和调试参数,然后通过Hook机制对加载可执行程序的加载函数调用进行截获并获取可执行程序的package_name,再解析调试参数生成记录链表,最后在确定可执行程序的package_name属于记录链表时,对可执行程序进行调试,因此在程序中出现偶现问题时,只需对可执行文件中的调试参数进行调整,即可对程序中的偶现问题进行调试,而无需修改程序,所以本发明的实施例能够在不修改程序的情况下对程序进行调试。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明的实施例提供的调试方法的步骤流程图;
图2为本发明的实施例提供的另一种调试方法的步骤流程图;
图3为本发明的实施例提供的调试装置的示意性结构图;
图4为本发明的实施例提供的另一种调试装置的示意性结构图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明的实施例提供一种计算机程序调试方法,本实施例中以调试装置作为该调试方法的执行主体进行说明。具体的,参照图1所示,该方法包括如下步骤:
S101、加载可执行程序和调试参数。
示例性的,可以通过类加载器(英文全称:dexclassloader)函数对可执行程序进行加载。
其中,可执行程序(英文名称:executablefile)是指可以由操作系统进行加载执行的程序。在不同的操作系统环境下,可执行文件的形式不同,在Android系统中,可执行文件的形式为.dex文件或.odex文件。
此外,上述实施例中的调试参数可以是配置文件,也可以是独立的字符串参数。以下实施例中以调试参数为配置文件为例进行说明,但本发明实施例中的调试参数并不限定于配置文件。其中,配置文件用于控制启动可执行程序时要预先Hook的包和类。具体的,配置文件的格式如下:
Hook_PackageHook_classHook_method
S102、通过Hook机制对加载可执行程序的加载函数调用进行截获,获取可执行程序的package_name(中文名称:包名)。
加载可执行程序后,在系统底层,加载操作会触发相应的函数调用,该函数中包含可执行程序,即调试装置在系统底层通过Hook机制对加载可执行程序的函数调用进行截获,并从该函数中获得可执行程序的package_name。其中,package_name是一个可执行程序的包名,Android系统中为了区别不同的应用程序,为每一个应用程序分配了的一个不同标识,package_name即为Android系统为一个每个应用程序的分配的标示。
S103、解析调试参数生成记录链表,记录链表包括至少一个hook_package(中文名称:钩包)。
示例性的,调试参数为如下配置文件:
Com.android.contactscom.android.contacts.PeopleActivityonCreate
Com.android.contactscom.android.contacts.PeopleActivityonResume
Com.android.contactscom.android.contacts.DetailActivityonStop
Com.android.dialercom.android.contacts.DialeronStop
解析调试参数时,配置文件的每一行可以生成一条Hook_recoder记录,则整个配置文件会生成一个记录链表。
S104、判断可执行程序的package_name是否属于记录链表。
具体的,可以通过遍历记录链表,将记录链表中的各个hook_package分别与可执行程序的package_name进行比对,若在记录链表中发现与可执行程序相同的package_name,则确定可执行程序的package_name属于记录链表,若在记录链表中未发现与可执行程序相同的package_name,则确定可执行程序的package_name不属于记录链表。
当步骤S104中确定可执行程序的package_name属于所述记录链表时,执行步骤S105。当步骤S104中确定可执行程序的package_name不属于所述记录链表时,执行步骤S106、S107、S108。
S105、对可执行程序进行调试。
还需要说明的是,所述方法还包括当调试完成后继续执行步骤S106、S107、S108。
S106、运行生命周期主函数(英文:ActivityThreadMain)。
S107、实例化要启动的生命周期类。
S108、调用该生命周期类的状态函数。
示例性的,该生命周期类的状态函数可以为:onCreate、onResume、onStop、onDestroy等。
本发明的实施例提供的计算机程序调试方法,首先加载可执行程序和调试参数,然后通过Hook机制对加载可执行程序的加载函数调用进行截获并获取可执行程序的package_name,再解析调试参数生成记录链表,最后在确定可执行程序的package_name属于记录链表时,对可执行程序进行调试,因此在程序中出现偶现问题时,只需对可执行文件中的调试参数进行调整,即可对程序中的偶现问题进行调试,而无需修改程序,所以本发明的实施例能够在不修改程序的情况下对程序进行调试。
进一步的,参照图2所示,上述步骤105中对可执行程序进行调试,包括:
S201、启动工作者线程。
S202、读取控制指令。
其中,控制指令由对程序进行调试的人员输入,工作者线程可以通过getProp接口读取用对程序进行调试的人员发送的控制指令,也可以通过其他跨进程通讯的方式读取对程序进行调试的人员发送的控制指令,本发明实施例中对读取控制指令的方式不做限定,以能够读取控制指令为准。
S203、根据控制指令输出可执行程序的调试信息。
此外,在工作者线程启动后,每间隔预设时间对控制指令进行一次读取,若对控制指令进行读取时未读取到控制指令,则预设时间间隔后再次进行控制指令的读取,直到读取到控制指令,读取到控制指令后,开始读控制指令进行解析,并根据解析结果输出可执行程序的调试信息。
可选的,控制指令为:dumpvar指令;
步骤S203中根据控制指令输出可执行程序的调试信息,包括:
根据dumpvar指令输出可执行程序中指定类的变量状态信息。
示例性的,可以通过反射机制获取可执行程序中指定类的变量状态信息。具体的,当配置配置文件中指定的类进行构造时,通过弱引用的方式将该实例放入到弱引用列表中,当读取到dumpvar指令时,从弱引用查询该类是否在本进程中进行了构造,如果进行了构造,则利用反射机制获取该类中成员变量的具体数值。
进一步可选的,控制指令为:dumpstack指令;
步骤S203中根据控制指令输出可执行程序的调试信息,包括:
根据dumpstack指令输出可执行程序的进程的各个线程运行快照信息。
示例性的,可以通过函数调用获取可执行程序的进程的各个线程运行快照信息。具体的,若读取到dumpstack指令,则可以通过调用getAllStackTraces函数获取每个线程的当前执行状态信息
进一步可选的,控制指令为:dumpmethod方法;
步骤S203中根据控制指令输出可执行程序的调试信息,包括:
根据dumpmethod方法输出可执行程序中指定函数的运行堆栈信息。
示例性的,可以通过函数调用获取可执行程序中指定函数的运行堆栈信息。具体的,当读取到dumpmethod指令时,针对dumpmethod指令对可执行程序中指定函数进行Hook操作,在后继调用可执行程序的dumpmethod后通过printStackTrace函数获取可执行程序的dumpmethod调用的堆栈信息。
参照图3所示,本发明实施例提供一种计算机程序调试装置30,包括:
加载单元31,用于加载可执行程序和调试参数。
获取单元32,用于通过Hook机制对加载所述可执行程序的加载函数调用进行截获,获取所述可执行程序的package_name。
处理单元33,用于解析调试参数生成记录链表,所述记录链表包括至少一个hook_package。
调试单元34,用于当确定所述可执行程序的package_name属于所述记录链表时,对所述可执行程序进行调试。
本发明的实施例提供的计算机程序调试装置,首先加载单元加载可执行程序和调试参数,然后获取单元通过Hook机制对加载可执行程序的加载函数调用进行截获并获取可执行程序的package_name,处理单元再解析调试参数生成记录链表,最后调试单元在确定可执行程序的package_name属于记录链表时,对可执行程序进行调试,因此在程序中出现偶现问题时,只需对可执行文件中的调试参数进行调整,即可对程序中的偶现问题进行调试,而无需修改程序,所以本发明的实施例能够在不修改程序的情况下对程序进行调试。
可选的,参照图4所示,调试单元34包括:
启动子单元341,用于启动工作者线程;
读取子单元342,用于读取控制指令;
输出子单元343,用于根据控制指令输出可执行程序的调试信息。
可选的,读取子单元342接收的控制指令为:dumpvar指令;
输出子单元343用于根据dumpvar指令输出可执行程序中指定类的变量状态信息。
可选的,读取子单元342接收的控制指令为:dumpstack指令;
所述输出子单元343用于根据dumpstack指令输出可执行程序的进程的各个线程运行快照信息。
可选的,读取子单元342接收的控制指令为:dumpmethod指令;
输出子单元343用于根据dumpmethod指令输出hook_package对应的程序中指定函数的运行堆栈信息。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。
Claims (10)
1.一种计算机程序调试方法,其特征在于,包括:
加载可执行程序和调试参数;
通过Hook机制对加载所述可执行程序的加载函数调用进行截获,获取所述可执行程序的package_name;
解析调试参数生成记录链表,所述记录链表包括至少一个hook_package;
当确定所述可执行程序的package_name属于所述记录链表时,对所述可执行程序进行调试。
2.根据权利要求1所述的方法,其特征在于,所述对所述可执行程序进行调试,包括:
启动工作者线程;
读取控制指令;
根据所述控制指令输出所述可执行程序的调试信息。
3.根据权利要求2所述的方法,其特征在于,所述控制指令为:dumpvar指令;
所述根据所述控制指令输出所述可执行程序的调试信息,包括:
根据所述dumpvar指令输出所述可执行程序中指定类的变量状态信息。
4.根据权利要求2所述的方法,其特征在于,所述控制指令为:dumpstack指令;
所述根据所述控制指令输出所述可执行程序的调试信息,包括:
根据所述dumpstack指令输出所述可执行程序的进程的各个线程运行快照信息。
5.根据权利要求2所述的方法,其特征在于,所述控制指令为:dumpmethod指令;
所述根据所述控制指令输出所述可执行程序的调试信息,包括:
根据所述dumpmethod指令输出所述可执行程序中指定函数的运行堆栈信息。
6.一种计算机程序调试装置,其特征在于,包括:
加载单元,用于加载可执行程序和调试参数;
获取单元,用于通过Hook机制对加载所述可执行程序的加载函数调用进行截获,获取所述可执行程序的package_name;
处理单元,用于解析调试参数生成记录链表,所述记录链表包括至少一个hook_package;
调试单元,用于当确定所述可执行程序的package_name属于所述记录链表时,对所述可执行程序进行调试。
7.根据权利要求6所述的装置,其特征在于,所述调试单元包括:
启动子单元,用于启动工作者线程;
读取子单元,用于读取控制指令;
输出子单元,用于根据所述控制指令输出所述可执行程序的调试信息。
8.根据权利要求7所述的装置,其特征在于,所述读取子单元接收的控制指令为:dumpvar指令;
所述输出子单元用于根据所述dumpvar指令输出所述可执行程序中指定类的变量状态信息。
9.根据权利要求7所述的装置,其特征在于,所述读取子单元接收的控制指令为:dumpstack指令;
所述输出子单元用于根据所述dumpstack指令输出所述可执行程序的进程的各个线程运行快照信息。
10.根据权利要求7所述的装置,其特征在于,所述读取子单元接收的控制指令为:dumpmethod指令;
所述输出子单元用于根据所述dumpmethod指令输出所述可执行程序中指定函数的运行堆栈信息。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610004830.0A CN105446886B (zh) | 2016-01-04 | 2016-01-04 | 一种计算机程序调试方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610004830.0A CN105446886B (zh) | 2016-01-04 | 2016-01-04 | 一种计算机程序调试方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105446886A true CN105446886A (zh) | 2016-03-30 |
CN105446886B CN105446886B (zh) | 2019-01-29 |
Family
ID=55557115
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610004830.0A Active CN105446886B (zh) | 2016-01-04 | 2016-01-04 | 一种计算机程序调试方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105446886B (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106126415A (zh) * | 2016-06-15 | 2016-11-16 | 百度在线网络技术(北京)有限公司 | 一种在安卓系统中的应用调试方法和应用调试装置 |
CN106681811A (zh) * | 2016-12-08 | 2017-05-17 | 腾讯科技(深圳)有限公司 | 基于线程池的多线程调度方法及装置 |
CN107632901A (zh) * | 2017-09-25 | 2018-01-26 | 青岛海信移动通信技术股份有限公司 | 一种应用程序运行异常的自修复方法及装置 |
CN109977633A (zh) * | 2019-03-28 | 2019-07-05 | 武汉斗鱼鱼乐网络科技有限公司 | 一种程序保护方法及相关装置 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1851655A (zh) * | 2005-11-07 | 2006-10-25 | 华为技术有限公司 | 通过由测试集组成的测试环境来实现产品自动测试的方法 |
US20100153786A1 (en) * | 2008-12-11 | 2010-06-17 | Nec Electronics Corporation | Processor, multiprocessor, and debugging method |
-
2016
- 2016-01-04 CN CN201610004830.0A patent/CN105446886B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1851655A (zh) * | 2005-11-07 | 2006-10-25 | 华为技术有限公司 | 通过由测试集组成的测试环境来实现产品自动测试的方法 |
US20100153786A1 (en) * | 2008-12-11 | 2010-06-17 | Nec Electronics Corporation | Processor, multiprocessor, and debugging method |
Non-Patent Citations (1)
Title |
---|
周圣韬: "Android Hook神器:XPosed入门与登陆劫持演示", 《HTTP://WWW.CSDN.NET/ARTICLE/2015-08-14/2825462》 * |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106126415A (zh) * | 2016-06-15 | 2016-11-16 | 百度在线网络技术(北京)有限公司 | 一种在安卓系统中的应用调试方法和应用调试装置 |
CN106126415B (zh) * | 2016-06-15 | 2018-12-04 | 百度在线网络技术(北京)有限公司 | 一种在安卓系统中的应用调试方法和应用调试装置 |
CN106681811A (zh) * | 2016-12-08 | 2017-05-17 | 腾讯科技(深圳)有限公司 | 基于线程池的多线程调度方法及装置 |
CN106681811B (zh) * | 2016-12-08 | 2021-09-14 | 腾讯科技(深圳)有限公司 | 基于线程池的多线程调度方法及装置 |
CN107632901A (zh) * | 2017-09-25 | 2018-01-26 | 青岛海信移动通信技术股份有限公司 | 一种应用程序运行异常的自修复方法及装置 |
CN109977633A (zh) * | 2019-03-28 | 2019-07-05 | 武汉斗鱼鱼乐网络科技有限公司 | 一种程序保护方法及相关装置 |
Also Published As
Publication number | Publication date |
---|---|
CN105446886B (zh) | 2019-01-29 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US20110191752A1 (en) | Method and System for Debugging of Software on Target Devices | |
US9329977B2 (en) | Framework for a software error inject tool | |
US20150212923A1 (en) | Nontransitory processor readable recording medium having fault injection program recorded therein and fault injection method | |
US20130086424A1 (en) | Debugging analysis in running multi-user systems | |
CN111382048B (zh) | 真机测试平台上移动设备的管理方法和装置 | |
KR20080050118A (ko) | 임베디드용 소프트웨어의 오류 검출 방법 | |
US11748245B2 (en) | Object-oriented regression-candidate filter | |
CN105446886A (zh) | 一种计算机程序调试方法和装置 | |
CN111026601A (zh) | Java应用系统的监控方法、装置、电子设备及存储介质 | |
WO2015117434A1 (zh) | 补丁的制作方法及装置、补丁的激活方法及装置 | |
CN104375938A (zh) | 安卓应用程序的动态行为监测方法及系统 | |
TWI684916B (zh) | 函式選取方法和伺服器 | |
US9639343B2 (en) | Method for altering execution of a program, debugger, and computer-readable medium | |
CN108021791B (zh) | 数据保护方法及装置 | |
CN104391717A (zh) | 一种调试时代码动态更新方法 | |
US20080127118A1 (en) | Method and system for dynamic patching of software | |
EP3295312A1 (en) | Method and apparatus for generating, capturing, storing, and loading debug information for failed tests scripts | |
WO2021244088A1 (zh) | 程序控制方法、装置、计算机设备及存储介质 | |
CN113127329B (zh) | 脚本调试方法、装置及计算机存储介质 | |
US11429379B2 (en) | Software checkpoint-restoration between distinctly compiled executables | |
KR20130020135A (ko) | 통합 개발 환경에서의 코드 동시 개발자 리스트 제공 시스템 및 방법 | |
CN115756424A (zh) | 一种生成mvp代码的方法、装置及设备 | |
CN115168175A (zh) | 程序错误解决方法、装置、电子设备和存储介质 | |
JPH11110256A (ja) | プログラムデバッグ装置、プログラムデバッグ方法及びその方法を記録したコンピュータ読取り可能な記録媒体 | |
JP2008210059A (ja) | 情報処理装置、デバッグ支援方法及びプログラム |
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 |