CN105446886B - 一种计算机程序调试方法和装置 - Google Patents

一种计算机程序调试方法和装置 Download PDF

Info

Publication number
CN105446886B
CN105446886B CN201610004830.0A CN201610004830A CN105446886B CN 105446886 B CN105446886 B CN 105446886B CN 201610004830 A CN201610004830 A CN 201610004830A CN 105446886 B CN105446886 B CN 105446886B
Authority
CN
China
Prior art keywords
executable program
instruction
package
program
control instruction
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
CN201610004830.0A
Other languages
English (en)
Other versions
CN105446886A (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.)
Hisense Mobile Communications Technology Co Ltd
Original Assignee
Hisense Mobile Communications Technology Co Ltd
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 Hisense Mobile Communications Technology Co Ltd filed Critical Hisense Mobile Communications Technology Co Ltd
Priority to CN201610004830.0A priority Critical patent/CN105446886B/zh
Publication of CN105446886A publication Critical patent/CN105446886A/zh
Application granted granted Critical
Publication of CN105446886B publication Critical patent/CN105446886B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3664Environments for testing or debugging software

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)

Abstract

本发明的实施例提供一种计算机程序调试方法和装置,涉及计算机程序设计领域,用于在不修改程序的情况下对程序进行调试。该方法包括:加载可执行程序和调试参数;通过Hook机制对加载可执行程序的加载函数调用进行截获,获取可执行程序的package_name;解析调试参数生成记录链表,记录链表包括至少一个hook_package;当确定可执行程序的package_name属于记录链表时,对可执行程序进行调试。本发明的实施例用于计算机程序的调试。

Description

一种计算机程序调试方法和装置
技术领域
本发明涉及计算机程序设计领域,尤其一种计算机程序调试方法和装置。
背景技术
随着Android***市场占有率的增加,越来越多的开发者基于Android***开发应用程序(英文全称:Application,简称:APP)。每款APP在开发完毕后,并不能立即上线,因为该APP在实际***上使用时,可能会出现一些错误(英文名称:bug),比如在APP的某个用户界面(英文全称:User Interface,简称:UI)在用户点击时无法响应,跳转时跳转失败或者逻辑错误等。因此对于APP一般在开发完成后,需要先进行调试,当确保APP可以运行正常后才会正式发布。
已有技术中的一种调试方式为:断点和单步执行调试,具体的,在程序的某些位置设置断点,调试时程序运行至该位置就会停止,然后对程序一步一步往下执行,若程序中有bug,则可以直接找到bug的位置。但是通过断点和单步执行的调试方式对程序进行调试时,首先需要集成开发环境(英文全程:Integrated Development Environment,简称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)函数对可执行程序进行加载。
其中,可执行程序(英文名称:executable file)是指可以由操作***进行加载执行的程序。在不同的操作***环境下,可执行文件的形式不同,在Android***中,可执行文件的形式为.dex文件或.odex文件。
此外,上述实施例中的调试参数可以是配置文件,也可以是独立的字符串参数。以下实施例中以调试参数为配置文件为例进行说明,但本发明实施例中的调试参数并不限定于配置文件。其中,配置文件用于控制启动可执行程序时要预先Hook的包和类。具体的,配置文件的格式如下:
Hook_Package Hook_class Hook_method
S102、通过Hook机制对加载可执行程序的加载函数调用进行截获,获取可执行程序的package_name(中文名称:包名)。
加载可执行程序后,在***底层,加载操作会触发相应的函数调用,该函数中包含可执行程序,即调试装置在***底层通过Hook机制对加载可执行程序的函数调用进行截获,并从该函数中获得可执行程序的package_name。其中,package_name是一个可执行程序的包名,Android***中为了区别不同的应用程序,为每一个应用程序分配了的一个不同标识,package_name即为Android***为一个每个应用程序的分配的标示。
S103、解析调试参数生成记录链表,记录链表包括至少一个hook_package(中文名称:钩包)。
示例性的,调试参数为如下配置文件:
Com.android.contacts com.android.contacts.PeopleActivity onCreate
Com.android.contacts com.android.contacts.PeopleActivity onResume
Com.android.contacts com.android.contacts.DetailActivity onStop
Com.android.dialer com.android.contacts.Dialer onStop
解析调试参数时,配置文件的每一行可以生成一条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、运行生命周期主函数(英文:Activity Thread Main)。
S107、实例化要启动的生命周期类。
S108、调用该生命周期类的状态函数。
示例性的,该生命周期类的状态函数可以为:onCreate、onResume、onStop、onDestroy等。
本发明的实施例提供的计算机程序调试方法,首先加载可执行程序和调试参数,然后通过Hook机制对加载可执行程序的加载函数调用进行截获并获取可执行程序的package_name,再解析调试参数生成记录链表,最后在确定可执行程序的package_name属于记录链表时,对可执行程序进行调试,因此在程序中出现偶现问题时,只需对可执行文件中的调试参数进行调整,即可对程序中的偶现问题进行调试,而无需修改程序,所以本发明的实施例能够在不修改程序的情况下对程序进行调试。
进一步的,参照图2所示,上述步骤105中对可执行程序进行调试,包括:
S201、启动工作者线程。
S202、读取控制指令。
其中,控制指令由对程序进行调试的人员输入,工作者线程可以通过getProp接口读取用对程序进行调试的人员发送的控制指令,也可以通过其他跨进程通讯的方式读取对程序进行调试的人员发送的控制指令,本发明实施例中对读取控制指令的方式不做限定,以能够读取控制指令为准。
S203、根据控制指令输出可执行程序的调试信息。
此外,在工作者线程启动后,每间隔预设时间对控制指令进行一次读取,若对控制指令进行读取时未读取到控制指令,则预设时间间隔后再次进行控制指令的读取,直到读取到控制指令,读取到控制指令后,开始读控制指令进行解析,并根据解析结果输出可执行程序的调试信息。
可选的,控制指令为:dump var指令;
步骤S203中根据控制指令输出可执行程序的调试信息,包括:
根据dump var指令输出可执行程序中指定类的变量状态信息。
示例性的,可以通过反射机制获取可执行程序中指定类的变量状态信息。具体的,当配置配置文件中指定的类进行构造时,通过弱引用的方式将该实例放入到弱引用列表中,当读取到dump var指令时,从弱引用查询该类是否在本进程中进行了构造,如果进行了构造,则利用反射机制获取该类中成员变量的具体数值。
进一步可选的,控制指令为:dump stack指令;
步骤S203中根据控制指令输出可执行程序的调试信息,包括:
根据dump stack指令输出可执行程序的进程的各个线程运行快照信息。
示例性的,可以通过函数调用获取可执行程序的进程的各个线程运行快照信息。具体的,若读取到dump stack指令,则可以通过调用getAllStackTraces函数获取每个线程的当前执行状态信息
进一步可选的,控制指令为:dump method方法;
步骤S203中根据控制指令输出可执行程序的调试信息,包括:
根据dump method方法输出可执行程序中指定函数的运行堆栈信息。
示例性的,可以通过函数调用获取可执行程序中指定函数的运行堆栈信息。具体的,当读取到dump method指令时,针对dump method指令对可执行程序中指定函数进行Hook操作,在后继调用可执行程序的dump method后通过printStackTrace函数获取可执行程序的dump method调用的堆栈信息。
参照图3所示,本发明实施例提供一种计算机程序调试装置30,包括:
加载单元31,用于加载可执行程序和调试参数。
获取单元32,用于通过Hook机制对加载所述可执行程序的加载函数调用进行截获,获取所述可执行程序的package_name。
处理单元33,用于解析调试参数生成记录链表,所述记录链表包括至少一个hook_package。
调试单元34,用于当确定所述可执行程序的package_name属于所述记录链表时,对所述可执行程序进行调试。
本发明的实施例提供的计算机程序调试装置,首先加载单元加载可执行程序和调试参数,然后获取单元通过Hook机制对加载可执行程序的加载函数调用进行截获并获取可执行程序的package_name,处理单元再解析调试参数生成记录链表,最后调试单元在确定可执行程序的package_name属于记录链表时,对可执行程序进行调试,因此在程序中出现偶现问题时,只需对可执行文件中的调试参数进行调整,即可对程序中的偶现问题进行调试,而无需修改程序,所以本发明的实施例能够在不修改程序的情况下对程序进行调试。
可选的,参照图4所示,调试单元34包括:
启动子单元341,用于启动工作者线程;
读取子单元342,用于读取控制指令;
输出子单元343,用于根据控制指令输出可执行程序的调试信息。
可选的,读取子单元342接收的控制指令为:dump var指令;
输出子单元343用于根据dump var指令输出可执行程序中指定类的变量状态信息。
可选的,读取子单元342接收的控制指令为:dump stack指令;
所述输出子单元343用于根据dump stack指令输出可执行程序的进程的各个线程运行快照信息。
可选的,读取子单元342接收的控制指令为:dump method指令;
输出子单元343用于根据dump method指令输出hook_package对应的程序中指定函数的运行堆栈信息。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。

Claims (10)

1.一种计算机程序调试方法,其特征在于,包括:
加载可执行程序和调试参数;
通过Hook机制对加载所述可执行程序的加载函数调用进行截获,获取所述可执行程序的package_name;
解析调试参数生成记录链表,所述记录链表包括至少一个hook_package,所述hook_package为一个待截获的package_name;
当确定所述可执行程序的package_name属于所述记录链表时,对所述可执行程序进行调试。
2.根据权利要求1所述的方法,其特征在于,所述对所述可执行程序进行调试,包括:
启动工作者线程;
读取控制指令;
根据所述控制指令输出所述可执行程序的调试信息。
3.根据权利要求2所述的方法,其特征在于,所述控制指令为:dump var指令;
所述根据所述控制指令输出所述可执行程序的调试信息,包括:
根据所述dump var指令输出所述可执行程序中指定类的变量状态信息。
4.根据权利要求2所述的方法,其特征在于,所述控制指令为:dump stack指令;
所述根据所述控制指令输出所述可执行程序的调试信息,包括:
根据所述dump stack指令输出所述可执行程序的进程的各个线程运行快照信息。
5.根据权利要求2所述的方法,其特征在于,所述控制指令为:dump method指令;
所述根据所述控制指令输出所述可执行程序的调试信息,包括:
根据所述dump method指令输出所述可执行程序中指定函数的运行堆栈信息。
6.一种计算机程序调试装置,其特征在于,包括:
加载单元,用于加载可执行程序和调试参数;
获取单元,用于通过Hook机制对加载所述可执行程序的加载函数调用进行截获,获取所述可执行程序的package_name;
处理单元,用于解析调试参数生成记录链表,所述记录链表包括至少一个hook_package,所述hook_package为一个待截获的package_name;
调试单元,用于当确定所述可执行程序的package_name属于所述记录链表时,对所述可执行程序进行调试。
7.根据权利要求6所述的装置,其特征在于,所述调试单元包括:
启动子单元,用于启动工作者线程;
读取子单元,用于读取控制指令;
输出子单元,用于根据所述控制指令输出所述可执行程序的调试信息。
8.根据权利要求7所述的装置,其特征在于,所述读取子单元接收的控制指令为:dumpvar指令;
所述输出子单元用于根据所述dump var指令输出所述可执行程序中指定类的变量状态信息。
9.根据权利要求7所述的装置,其特征在于,所述读取子单元接收的控制指令为:dumpstack指令;
所述输出子单元用于根据所述dump stack指令输出所述可执行程序的进程的各个线程运行快照信息。
10.根据权利要求7所述的装置,其特征在于,所述读取子单元接收的控制指令为:dumpmethod指令;
所述输出子单元用于根据所述dump method指令输出所述可执行程序中指定函数的运行堆栈信息。
CN201610004830.0A 2016-01-04 2016-01-04 一种计算机程序调试方法和装置 Active CN105446886B (zh)

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 CN105446886A (zh) 2016-03-30
CN105446886B true 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)

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106126415B (zh) * 2016-06-15 2018-12-04 百度在线网络技术(北京)有限公司 一种在安卓***中的应用调试方法和应用调试装置
CN106681811B (zh) * 2016-12-08 2021-09-14 腾讯科技(深圳)有限公司 基于线程池的多线程调度方法及装置
CN107632901A (zh) * 2017-09-25 2018-01-26 青岛海信移动通信技术股份有限公司 一种应用程序运行异常的自修复方法及装置
CN109977633B (zh) * 2019-03-28 2023-04-07 武汉斗鱼鱼乐网络科技有限公司 一种程序保护方法及相关装置

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1851655A (zh) * 2005-11-07 2006-10-25 华为技术有限公司 通过由测试集组成的测试环境来实现产品自动测试的方法

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2010140240A (ja) * 2008-12-11 2010-06-24 Renesas Electronics Corp プロセッサ、マルチプロセッサ、及び、デバッグ方法

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1851655A (zh) * 2005-11-07 2006-10-25 华为技术有限公司 通过由测试集组成的测试环境来实现产品自动测试的方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
Android Hook神器:XPosed入门与登陆劫持演示;周圣韬;《http://www.csdn.net/article/2015-08-14/2825462》;20150814;第1-9页

Also Published As

Publication number Publication date
CN105446886A (zh) 2016-03-30

Similar Documents

Publication Publication Date Title
CN102053836B (zh) 一种Android应用开发的版本管理工具的实现方法
CN105446886B (zh) 一种计算机程序调试方法和装置
US9355017B2 (en) Automated error checking system for a software application and method therefor
US10067858B2 (en) Cloud-based software testing
US8839202B2 (en) Test environment managed within tests
CN106294102B (zh) 应用程序的测试方法、客户端、服务器及***
CN108073400A (zh) 软件自动化构建方法、服务器及存储介质
US9069902B2 (en) Software test automation
US9632754B2 (en) Auto generation and linkage of source code to test cases
US20150212923A1 (en) Nontransitory processor readable recording medium having fault injection program recorded therein and fault injection method
US20140109057A1 (en) Software development kit testing
CN105094783A (zh) 安卓应用稳定性测试的方法及装置
CN110633209A (zh) 一种车载安卓多媒体导航仪自动化测试方法及***
US8448147B2 (en) Heterogenic Coverage Analysis
CN104375938B (zh) 安卓应用程序的动态行为监测方法及***
CN111382048B (zh) 真机测试平台上移动设备的管理方法和装置
WO2012177395A1 (en) N-way runtime interoperative debugging
KR101264615B1 (ko) 게임 서버의 작업 파일 실행 장치 및 방법
CN107329889B (zh) 一种c编译器自动化测试的方法
US20130067439A1 (en) Injecting faults into program for testing
US8533683B2 (en) Stack walking enhancements using sensorpoints
CN109857637A (zh) 一种基于注解的Java语言方法覆盖率和方法输入输出统计方法及装置
CN109558318A (zh) 一种代码管理方法和代码仓库分布式***
US20080127118A1 (en) Method and system for dynamic patching of software
US7287246B2 (en) Debugging optimized flows with breakpoints using stored breakpoint trigger indicators

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