CN117453545A - 断点调试方法、装置、设备和存储介质 - Google Patents

断点调试方法、装置、设备和存储介质 Download PDF

Info

Publication number
CN117453545A
CN117453545A CN202311402697.0A CN202311402697A CN117453545A CN 117453545 A CN117453545 A CN 117453545A CN 202311402697 A CN202311402697 A CN 202311402697A CN 117453545 A CN117453545 A CN 117453545A
Authority
CN
China
Prior art keywords
function
debugging
function call
breakpoint
program
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.)
Pending
Application number
CN202311402697.0A
Other languages
English (en)
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.)
Beijing 58 Information Technology Co Ltd
Original Assignee
Beijing 58 Information 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 Beijing 58 Information Technology Co Ltd filed Critical Beijing 58 Information Technology Co Ltd
Priority to CN202311402697.0A priority Critical patent/CN117453545A/zh
Publication of CN117453545A publication Critical patent/CN117453545A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Prevention of errors by analysis, debugging or testing of software
    • G06F11/362Debugging of software
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4488Object-oriented
    • G06F9/449Object-oriented method invocation or resolution
    • 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)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明实施例提供一种断点调试方法、装置、设备和存储介质,该方法包括:获取待调试程序运行时所调用的多个函数对应的多个函数调用信息;根据多个函数调用信息,确定多个函数之间的函数调用关系;根据函数调用关系,确定待调试程序对应的调试起点和调试终点;从多个函数调用信息中确定与调试终点和调试终点匹配的目标函数对应的目标函数调用信息;根据目标函数调用信息,对待调试程序进行程序断点调试。本方案中,将待调试程序运行时所调用的多个函数对应的多个函数调用信息作为调试依据,根据多个函数调用信息所确定的多个函数之间的函数调用关系,灵活的设置调试起点和调试终点,并获取对应的目标函数调用信息对待调试程序的断点调试。

Description

断点调试方法、装置、设备和存储介质
技术领域
本发明涉及计算机技术领域,尤其涉及一种断点调试方法、装置、设备和存储介质。
背景技术
断点调试,是软件程序调试的一种方法。断点调试通过在特定程序代码行上设置断点的方式,使得程序的执行中断在设置有断点的代码位置,从而,可以对当前程序的执行状态进行分析,实现调试的目的。
相关技术中,可以通过例如Xcode等调试器在集成开发环境(IntegratedDevelopment Environment,简称IDE)中对被调试程序进行断点调试。但是,调试器在使用过程中,往往要求运行有被调试程序的调试设备与调试器通信连接,以同步被调试程序的运行信息,不支持离线程序调试。另外,调试器配置的断点调试工具,往往仅支持对待调试应用程序中的特定组件进行断点调试,比如:以源代码方式引入的组件等。针对以静态库、动态库等方式引入的组件,调试器往往无法干预组件对应程序的执行,无法对其进行断点调试,也无法对系统库中的方法(也即函数)进行断点调试。
发明内容
本发明实施例提供一种断点调试方法、装置、设备和存储介质,用以扩展断点调试的适用场景,提升软件程序调试的效率。
第一方面,本发明实施例提供一种断点调试方法,所述方法包括:
获取待调试程序运行时所调用的多个函数对应的多个函数调用信息;
根据所述多个函数调用信息,确定所述多个函数之间的函数调用关系;
根据所述函数调用关系,确定所述待调试程序对应的调试起点和调试终点;
从所述多个函数调用信息中确定与所述调试终点和所述调试终点匹配的目标函数对应的目标函数调用信息;
根据所述目标函数调用信息,对所述待调试程序进行程序断点调试。
第二方面,本发明实施例提供一种断点调试装置,所述装置包括:
获取模块,用于获取待调试程序运行时所调用的多个函数对应的多个函数调用信息;
处理模块,用于根据所述多个函数调用信息,确定所述多个函数之间的函数调用关系;根据所述函数调用关系,确定所述待调试程序对应的调试起点和调试终点;从所述多个函数调用信息中确定与所述调试终点和所述调试终点匹配的目标函数对应的目标函数调用信息;
调试模块,用于根据所述目标函数调用信息,对所述待调试程序进行程序断点调试。
第三方面,本发明实施例提供一种电子设备,包括:存储器、处理器、通信接口;其中,所述存储器上存储有可执行代码,当所述可执行代码被所述处理器执行时,使所述处理器至少可以实现如第一方面所述的断点调试方法。
第四方面,本发明实施例提供了一种非暂时性机器可读存储介质,所述非暂时性机器可读存储介质上存储有可执行代码,当所述可执行代码被电子设备的处理器执行时,使所述处理器至少可以实现如第一方面所述的断点调试方法。
在本发明实施例提供的方案中,在进行断点调试时,首先,获取待调试程序运行时所调用的多个函数对应的多个函数调用信息。然后,根据多个函数调用信息,确定多个函数之间的函数调用关系。之后,根据函数调用关系,确定待调试程序对应的调试起点和调试终点。最后,从多个函数调用信息中确定与调试终点和调试终点匹配的目标函数对应的目标函数调用信息,以根据目标函数调用信息,对待调试程序进行程序断点调试。
本方案中,通过获取待调试程序运行时所调用的多个函数对应的多个函数调用信息,为待调试应用程序的断点调试提供调试依据,即使涉及系统库、静态库和动态库,同样可以在调试时获取待调试程序运行时的函数调用信息。通过根据多个函数调用信息确定的多个函数之间的函数调用关系,可以使得在进行程序调试时,灵活的设置的每次调试的调试起点和调试终点,即断点调试的起点和终点。之后,基于预先获取的多个函数调用信息,可以从中获取与调试起点和调试终点对应的目标函数调用信息,目标函数调用信息用于分析待调试程序的运行状态,也即用于断点调试。由于在本方案的实施过程中,既不要求待调试程序在线调试,也不需要获取待调试程序的源代码,从而本方案可以扩展断点调试的应用场景,既能够进行离线的断点调试,又能够中断任意库中的任一个函数(也即方法)的调用,进行断点调试。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的一种断点调试方法的流程图;
图2为本发明实施例提供的另一种断点调试方法的流程图;
图3为本发明实施例提供的一种调试进度条的示意图;
图4为本发明实施例提供的又一种断点调试方法的流程图;
图5为本发明实施例提供的一种断点调试装置的结构示意图;
图6为与图5所示实施例提供的断点调试装置对应的电子设备的结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
需要说明的是,本发明实施例中所涉及的用户信息(包括但不限于用户设备信息、用户个人信息等)和数据(包括但不限于用于分析的数据、存储的数据、展示的数据等),均为经用户授权或者经过各方充分授权的信息和数据,并且相关数据的收集、使用和处理需要遵守相关国家和地区的相关法律法规和标准,并提供有相应的操作入口,供用户选择授权或者拒绝。
另外,下述各方法实施例中的步骤时序仅为一种举例,而非严格限定。
为便于理解,以下先对本发明实施例涉及的相关概念进行说明。
断点调试,是软件程序调试的一种方法。断点调试通过在特定程序代码行上设置断点的方式,使得程序的执行中断在设置有断点的代码位置,从而,可以对当前程序的执行状态进行分析,实现调试的目的。
运行时,即runtime,是指一个程序在运行或者在被执行的状态。在编程语言中,可以构建runtime库,以提供相应的函数和数据结构,作为在程序运行时对代码进行解析、创建对象和消息传递等操作的技术框架。
系统库(Framework),是由操作系统提供的库,包含于操作系统中,可以直接被应用程序引用,无需额外下载和链接。系统库是预先编写完成的库,用于提供各种预先配置好的功能,比如:用户界面、数据存储、网络请求等。
静态库(Static Library),是应用程序编译时被链接到应用程序中的库。静态库在应用程序构建时被合并到应用的可执行文件中。在应用程序运行时,应用程序本身的可执行文件中对应的静态库无法更新。
动态库(Dynamic Library),是应用程序运行时被加载到内存中的库。一个动态库可以被多个应用程序共享。不同于静态库,动态库不会被合并到应用程序的可执行文件中,而是在应用程序运行时按需加载。
可以理解的是,应用程序通常包含有多个用于实现不同功能的组件,这些组件可能是以系统库的方式引入,也可能是以静态库或动态库的方式引入。对应用程序进行软件程序调试,实际上就是对各组件对应程序代码的调试。
断点调试是软件程序调试的方式之一。相关技术中,可以借助相应的调试工具进行断点调试。例如,可以通过Xcode在集成开发环境(Integrated DevelopmentEnvironment,简称IDE)中对被调试程序进行断点调试;或者通过Flipper开发相应的调试插件对被调试程序进行断点调试。然而,在实际应用过程中,调试工具通常具有一定的弊端。
举例来说,例如Flipper无法干预程序的执行,比如:当用户点击一个按钮触发进入一个新页面时,进入新页面后会执行相应的代码,反应给用户就是加载新页面并展示列表信息,Flipper无法干预这一过程,也无法进行断点调试。
又例如Xcode在使用过程中,往往要求运行有被调试程序的调试设备与调试器通信连接,以同步被调试程序的运行信息,不支持程序离线调试。但是,实际上有较多的应用场景是不能使用Xcode,需要进行程序离线调试的。比如:当非开发人员参与调试时,由于非开发人员不具备Xcode使用经验或没有Xcode,则需要使用更简单或更通用的方式来进行程序调试。又比如:对于一些简单的程序问题,相较于启动Xcode而言,使用更轻量级的工具或方法进行调试效率可能会更高。再比如:在自动化测试和持续集成环境中,需要使用脚本或其他工具进行程序调试,而不是依赖Xcode手动进行。
再例如Xcode配置的断点调试工具,往往仅支持对待调试应用程序中的特定组件进行断点调试,比如:以源代码方式引入的组件等。但是,无论是系统库、静态库还是动态库,都可能包含闭源或是源代码不可见的部分。这会导致在使用Xcode进行程序调试时,无法在不可见的源代码中设置断点,不能进行断点调试。
针对以非源码方式引入的组件,展开来说,在调试过程中,其代码的执行情况类似于黑盒,因此无法设置断点,也不能进行断点调试。具体地,对于系统库来说,由于其实现和行为是由操作系统决定的,因此,应用程序开发者可能无法直接对其代码进行修改,也不能在其代码中设置断点;对于静态库来说,由于其在应用程序编译时已经被链接到了应用程序中并生成了可执行文件,因此,无法进入静态库的代码并在其中设置断点,难以了解静态库内部的执行细节;对于动态库来说,由于其在应用程序运行时被加载到内存中,因此,也无法直接进入动态库的代码并在其中设置断点,难以了解静态库内部的执行细节。
另外,从系统库、静态库和动态库自身的特征上来看,虽然三者的功能和使用方式有所不同,但在程序调试方面具有一些其他共同的难点。比如:为了减少应用程序对应的二进制文件(即可执行文件)的大小,通常会对发布的库(包括:系统库、静态库和动态库)进行符号剥离(Symbol Stripping),这会导致在调试过程中无法准确查看库内部的符号信息,使得调试变得困难。
为了解决上述至少一个技术问题,本发明实施例提供了一种断点调试方法、装置、设备即存储介质。其中,断点调试方法可以包括:获取待调试程序运行时所调用的多个函数对应的多个函数调用信息;根据多个函数调用信息,确定多个函数之间的函数调用关系;根据函数调用关系,确定待调试程序对应的调试起点和调试终点;从多个函数调用信息中确定与调试终点和调试终点匹配的目标函数对应的目标函数调用信息;根据目标函数调用信息,对待调试程序进行程序断点调试。
本发明实施例提供的技术方案,通过获取待调试程序运行时所调用的多个函数对应的多个函数调用信息,为待调试应用程序的断点调试提供调试依据。通过根据多个函数调用信息确定的多个函数之间的函数调用关系,可以使得在进行程序调试时,灵活的设置的每次调试的调试起点和调试终点,即断点调试的起点和终点。基于预先获取的多个函数调用信息,可以从中获取与调试起点和调试终点对应的目标函数调用信息,目标函数调用信息用于分析待调试程序的运行状态,也即用于断点调试。在本方案的实施过程中,既不要求待调试程序在线调试,也不需要获取待调试程序的源代码,从而本方案可以扩展断点调试的应用场景,既能够进行离线的断点调试,又能够中断任意库中的任一个函数(也即方法)的调用,进行断点调试。
以下具体说明本发明实施例提供的断点调试方法。
本发明实施例提供的断点调试方法可以由一电子设备来执行,该电子设备可以是诸如PC机、笔记本电脑、智能手机等终端设备,也可以是服务器。该服务器可以是包含一独立主机的物理服务器,或者也可以为虚拟服务器,或者也可以为云端服务器或服务器集群。
图1为本发明实施例提供的一种断点调试方法的流程图,如图1所示,可以包括如下步骤:
101、获取待调试程序运行时所调用的多个函数对应的多个函数调用信息。
102、根据多个函数调用信息,确定多个函数之间的函数调用关系。
103、根据函数调用关系,确定待调试程序对应的调试起点和调试终点。
104、从多个函数调用信息中确定与调试终点和调试终点匹配的目标函数对应的目标函数调用信息。
105、根据目标函数调用信息,对待调试程序进行程序断点调试。
本实施例中,待调试程序运行时所调用的多个函数对应的多个函数调用信息,被用作待调试程序进行断点调试的调试依据。具体实施过程中,可选地,可通过部署相应的监听器(比如:监听程序)的方式,获取待检测程序在运行时所调用的多个函数对应的多个函数调用信息。
其中,函数调用信息用于辅助调试人员在调试时分析代码的执行、变量的状态、函数的调用顺序等情况。
其中,多个函数调用信息中的任一个函数调用信息均包括如下信息中的至少一项:对应的函数的调用对象、函数变量值、函数调用返回值、函数调用执行时间等。
具体地,函数的调用对象和函数变量值,用于辅助调试人员掌握在特定时间点待调试程序的运行状态。函数调用返回值记录了对应函数被调用时传递的返回值,用于辅助调试人员理解函数之间的数据流。函数调用执行时间记录了对应函数的执行时间,用于辅助调试人员识别性能问题。
可选地,函数调用信息中还包括:异常信息。其中,异常信息记录了程序运行时发生的函数调用异常情况,比如:错误类型、堆栈轨迹等,用于辅助调试人员解决程序运行异常问题。
在一可选实施中,在获取多个函数调用信息之后,可以将多个函数调用信息存储在运行时数据缓存池中,以便在对待调试程序进行断点调试时,灵活取用。也就是说,存储在运行时数据缓存池中的函数调用信息即为待调试程序运行时的现场数据,反映了待调试程序运行时的运行特征,可在调试阶段从运行时数据缓存池中取出,供调试人员分析。
可以理解的是,待调试程序运行时所调用的多个函数之间存在一定的调用顺序和层级关系,比如:函数A先调用函数B,之后函数B再调用函数C和函数D等。本实施例中,将待调试程序运行时所调用的多个函数之间调用顺序和层级关系称为函数调用关系。通俗来说,函数调用关系具体描述了:多个函数中,哪个方法调用了哪个方法。
具体实施过程中,可以根据多个函数调用信息各自包含的对应的函数的调用对象、函数变量值、函数调用返回值等信息,可以确定多个函数之间的函数调用关系。
由于多个函数之间的函数调用关系,反映了待调试程序运行时多个函数被调用的先后顺序。因此,在确定多个函数之间的函数调用关系之后,可以根据函数调用关系,灵活的设置断点调试的调试起点和调试终点。
可以理解的是,断点调试的目的是通过获取并观察待调试程序部分代码运行时反映的状态信息,对待调试程序的部分代码进行调试。其中,部分代码即断点调试的调试起点和调试终点对应范围内的代码。
本实施例中,在进行断点调试时,并未直接在待调试程序的程序代码中设置调试起点和调试终点,而是根据函数调用关系,确定调试起点对应的函数,以及调试终点对应的函数。之后,根据函数调用关系、调用起点和调用终点,确定多个函数中位于调用起点和调用终端之间的目标函数。具体地,将调试起点对应函数、调试终点对应函数,以及这两函数之间的其他函数统称为目标函数。
最后,从获取的多个函数调用信息中确定与目标函数对应的目标函数调用信息,以使调试人员根据目标函数调用信息,对待调试程序进行程序断点调试。
举例来说,假设待调试程序运行时调用了5个函数(此处的5个函数仅作示例性说明,实际上程序运行所调用的函数数量不止5个),这5个函数对应5个函数调用信息所反映的函数调用关系为:函数1调用函数2,函数2调用函数3,函数3调用函数4,函数4调用函数5。
由于函数调用关系已经反映函数1至函数5之间的函数调用情况,所以函数1至函数5的函数调用情况对于调试人员而言相当于是已知的,无论函数1至函数5是系统库、静态库还是动态库中的函数,都能够被设置为调试起点或调试终点,以进行断点调试。
从而,基于函数调用关系,调试人员可以灵活的设置断点调试的调试起点和调试终点,比如:以函数1为调试起点,函数3为调试终点;或者以函数2为调试起点,函数5为调试终点等等。
若以函数1为调试起点,函数3为调试终点,则目标函数为函数1、函数2和函数3,目标函数调用信息为函数1的函数调用信息、函数2的函数调用信息和函数3的函数调用信息。类似地,若以函数2为调试起点,函数5为调试终点,则目标函数为函数2、函数3、函数4和函数5,目标函数调用信息为函数2的函数调用信息、函数3的函数调用信息、函数4的函数调用信息和函数5的函数调用信息。
本方案中,通过获取待调试程序运行时所调用的多个函数对应的多个函数调用信息,为待调试应用程序的断点调试提供调试依据。在进行断点调试时,根据多个函数调用信息确定的多个函数之间的函数调用关系,从而能够灵活的设置的每次调试的调试起点和调试终点,即确定每次调试的调试起点和调试终点分别对应的函数,进一步地,可以从多个函数调用信息中获取与调试起点和调试终点匹配的目标函数对应的目标函数调用信息进行断点调试。由于本方案在进行断点调试时并未直接在待调试程序的程序代码中设置调试起点和调试终点,而是根据函数调用关系,确定调试起点对应的目标函数以及调试终点对应的函数,因此,即使无法获取系统库、静态库和动态库的源代码,也可以在调试时获取待调试程序运行时与系统库、静态库和动态库相关的函数调用信息,并设置对应的函数为调试起点或调试终点,进行断点调试。从而本方案可以扩展断点调试的应用场景,既能够进行离线的断点调试,又能够中断任意库中的任一个函数的调用,进行断点调试。
图2为本发明实施例提供的另一种断点调试方法的流程图,如图2所示,可以包括如下步骤:
201、获取待调试程序运行时所调用的多个函数对应的多个函数调用信息。
202、根据多个函数调用信息,确定多个函数之间的函数调用关系。
203、根据函数调用关系,生成多个函数对应的函数调用链。
204、在函数调用链中的第一函数对应的第一位置设置第一断点,以作为调试起点;在函数调用链中的第二函数对应的第二位置设置第二断点,以作为调试终点,其中,待调试程序在运行时对第一函数的调用早于对第二函数的调用。
205、从多个函数调用信息中确定与调试终点和调试终点匹配的目标函数对应的目标函数调用信息。
206、根据目标函数调用信息,对待调试程序进行程序断点调试。
本实施例中,步骤201、202、205和206的具体实施过程可参考前述实施例,本实施中不再进行赘述。
为了便于调试人员灵活设置断点调试的调试起点和调试终点,本实施例中,在确定多个函数之间的函数调用关系之后,进一步地,还根据函数调用关系,生成了多个函数对应的函数调用链。基于函数调用链,能够更加直观、清晰的表示多个函数之间的函数调用关系,从而方便调试人员设置调试起点和调试终点。
具体实施过程中,针对函数调用链中的任意两个函数,分别称为第一函数和第二函数。其中,待调试序在运行时对第一函数的调用早于对第二函数的调用。调试人员可以在函数调用链中的第一函数对应的第一位置设置第一断点,以作为调试起点;在函数调用链中的第二函数对应的第二位置设置第二断点,以作为调试终点。
为进一步方便调试人员设置断点调试的调试起点和调试终点,可选地,还可以对函数调用链进行相应的可视化处理,提供可视化、可操控的调试界面,结合图3进行举例说明。
图3为本发明实施例提供的一种调试进度条的示意图。如图3所示,根据函数调用链,生成并展示的调试进度条包含有:多个标识点、调试进度条的起始端点和调试进度条的结束端点。
其中,多个标识点与多个函数一一对应,即每个标识点对应一个函数。每个函数对应的标识点在进度条中的显示位置与多个函数之间的函数调用顺序匹配。调试进度条的起始端点和结束端点可被拖动,以用于确定断点调试的调试起点和调试终点。
实际应用中,在进行断点调试之前,初始化生成的调试进度条中,调试进度条的起始端点位于调试进度条上首个标识点对应位置,调试进度条的结束端点位于调试进度条上最后一个标识点对应位置。
在设置断点调试的调试起点时,响应于调试进度条的起始端点被拖动至第一函数对应的标识点位置,在函数调用链中的第一函数对应的第一位置设置第一断点,以作为调试起点。在设置断点调试的调试起点时,响应于调试进度条的结束端点被拖动至第二函数对应的标识点位置,在函数调用链中的第二函数对应的第二位置设置第二断点,以作为调试终点。
实际应用中,Objective-C中函数的调用是通过runtime实现的,runtime进行函数调用的本质是消息发送,具体地,通过消息发送函数objc_msgSend()进行消息发送。
作为一种可选地设置断点的方式,在函数调用链中的第一函数对应的第一位置设置第一断点,包括:确定第一函数对应的第一消息发送函数,在第一消息发送函数中设置第一断点。类似地,在函数调用链中的第二函数对应的第二位置设置第二断点,包括:确定第二函数对应的第二消息发送函数,在第二消息发送函数中设置第二断点。其中,第一消息发送函数和第二消息发送函数中的“第一”和“第二”是为了区分不同的函数对应的消息发送函数objc_msgSend()。
可选地,还可以在可视化界面上配置相应地调试录制按钮,响应于调试人员对调试录制按钮的点击操作,获取待调试程序响应于调试人员对某个页面或组件的操作运行时所调用的多个函数分别对应的函数调用信息。
本实施例中,基于函数调用关系确定函数调用链,利用函数调用链或者函数调用链对应的调试进度条,调试人员可以将断点调试的调试起点和调试终点设置在任一个函数对应的位置,任意调试系统库、静态库、动态库中的函数。由于已经获取到了待调试程序运行时所调用的多个函数的函数调用信息,因此,支持离线独立调试,且不限制调试目标。
如前文所述,Objective-C中函数的调用是通过runtime实现的,runtime进行函数调用的本质是消息发送,具体地,通过消息发送函数objc_msgSend()进行消息发送。也就是说,任意一个函数对应的函数调用,都对应需要消息发送函数。基于此,本发明实施例提供了又一种断点调试方法,如图4所示。
图4为本发明实施例提供的又一种断点调试方法的流程图,如图4所示,可以包括如下步骤:
401、通过hook函数确定待调试程序运行时所调用的多个消息发送函数对应的多个函数调用信息。
402、根据多个函数调用信息,确定多个函数之间的函数调用关系。
403、根据函数调用关系,确定待调试程序对应的调试起点和调试终点。
404、从多个函数调用信息中确定与调试终点和调试终点匹配的目标函数对应的目标函数调用信息。
405、根据目标函数调用信息,对待调试程序进行程序断点调试。
本实施例中,待调试程序运行时所调用的多个函数为多个消息发送函数。其中,每个消息发送函数objc_msgSend(receiver,selector,arg1,arg2,……)中,第一个参数receiver是消息接收者,第二个参数时方法名(也即函数名),剩余参数是函数相关参数。
通过hook函数可以获取消息发送函数中的各项参数,以将获取到的消息发送函数中的各项参数作为消息发送函数对应的函数调用信息。基于函数调用信息,可以确定多个消息发送函数之间的函数调用关系,生成函数调用链。
在对待调试程序进行断点调试时,可以在函数调用链中的第一消息发送函数中设置第一断点,以作为调试起点;在函数调用链中的第二消息发送函数中设置第二断点,以作为调试终点。其中,待调试程序在运行时对第一消息发送函数的调用早于对第二消息发送函数的调用。
可选地,也可以基于函数调用链进一步地生成调试进度条。其中,调试进度条包含有:多个标识点、调试进度条的起始端点和调试进度条的结束端点。
其中,多个标识点与多个消息发送函数一一对应,即每个标识点对应一个消息发送函数。每个消息发送函数对应的标识点在进度条中的显示位置与多个消息发送函数之间的函数调用顺序匹配。调试进度条的起始端点和结束端点可被拖动,以用于确定断点调试的调试起点和调试终点。
在对待调试程序进行断点调试时,响应于调试进度条的起始端点被拖动至第一消息发送函数对应的标识点位置,在函数调用链中的第一消息发送函数中设置第一断点,以作为调试起点;响应于调试进度条的结束端点被拖动至第二消息发送函数对应的标识点位置,在函数调用链中的第二消息发送函数中设置第二断点,以作为调试终点。
之后,确定调试起点对应的第一消息发送函数、调试终点对应的第二消息发送函数,以及第一消息发送函数与第二消息发送函数之间的其他函数为目标函数。
最后,从获取的多个函数调用信息中确定与目标函数对应的目标函数调用信息,以使调试人员根据目标函数调用信息,对待调试程序进行程序断点调试。
需要说明的是,图4仅是以待调试程序运行时所调用的多个函数是消息发送函数为例,进行举例说明,其具体实施过程可参考前述实施例。另外,实际应用中,待调试程序运行时所调用的多个函数也可能是其他类型的函数,本实施例并不对函数的类型进行限制。
本方案中,通过hook函数可以获取待调试程序运行时所调用的多个消息发送函数对应的多个函数调用信息,待调试应用程序的断点调试提供调试依据。在对待调试程序进行调试时,通过在调试起点和调试终点分别对应的消息发送函数中设置断点的方式,实现对待调试程序的断点调试。在断点调试过程中,既不要求待调试程序在线调试,也不需要获取待调试程序的源代码,因此,可以扩展断点调试的应用场景,既能够进行离线的断点调试,又能够中断任意库中的任一个函数(也即方法)的调用,进行断点调试。
以下将详细描述本发明的一个或多个实施例的断点调试装置。本领域技术人员可以理解,这些装置均可使用市售的硬件组件通过本方案所教导的步骤进行配置来构成。
图5为本发明实施例提供的一种断点调试装置的结构示意图,如图5所示,该装置包括:获取模块11、处理模块12、调试模块13。
获取模块11,用于获取待调试程序运行时所调用的多个函数对应的多个函数调用信息。
处理模块12,用于根据所述多个函数调用信息,确定所述多个函数之间的函数调用关系;根据所述函数调用关系,确定所述待调试程序对应的调试起点和调试终点;从所述多个函数调用信息中确定与所述调试终点和所述调试终点匹配的目标函数对应的目标函数调用信息。
调试模块13,用于根据所述目标函数调用信息,对所述待调试程序进行程序断点调试。
可选地,所述处理模块12,具体用于根据所述多个函数调用信息,确定所述多个函数之间的函数调用关系;根据所述函数调用关系,确定所述待调试程序对应的调试起点和调试终点;从所述多个函数调用信息中确定与所述调试终点和所述调试终点匹配的目标函数对应的目标函数调用信息。
可选地,所述处理模块12,具体用于确定所述第一函数对应的第一消息发送函数;在所述第一消息发送函数中设置第一断点。所述处理模块12,还具体用于确定所述第二函数对应的第二消息发送函数;在所述第二消息发送函数中设置第二断点。
可选地,所述处理模块12,还用于根据所述函数调用链,生成并展示调试进度条,所述调试进度条上包含有多个标识点,所述多个标识点与所述多个函数一一对应;响应于所述调试进度条的起始端点被拖动至所述第一函数对应的标识点位置,在所述函数调用链中的第一函数对应的第一位置设置第一断点,以作为所述调试起点;响应于所述调试进度条的结束端点被拖动至所述第二函数对应的标识点位置,在所述函数调用链中的第二函数对应的第二位置设置第二断点,以作为所述调试终点。
可选地,所述多个函数为多个消息发送函数,所述获取模块11,具体用于通过hook函数确定所述待调试程序运行时所调用的多个消息发送函数对应的多个函数调用信息。
可选地,所述处理模块12,还具体用于根据所述函数调用关系、所述调用起点和所述调用终点,确定所述多个函数中位于所述调用起点和所述调用终端之间的目标函数;从所述多个函数调用信息中确定所述目标函数对应的目标函数调用信息。
可选地,所述多个函数调用信息中的任一个函数调用信息包括:对应的函数的调用对象、函数变量值、函数调用返回值、函数调用执行时间。
图5所示装置可以执行前述实施例中介绍的步骤,详细的执行过程和技术效果参见前述实施例中的描述,在此不再赘述。
在一个可能的设计中,上述图5所示断点调试装置的结构可实现为一电子设备,如图6所示,该电子设备可以包括:存储器21、处理器22、通信接口23。其中,存储器21上存储有可执行代码,当所述可执行代码被处理器22执行时,使处理器22至少可以实现如前述实施例中提供的断点调试方法。
另外,本发明实施例提供了一种非暂时性机器可读存储介质,所述非暂时性机器可读存储介质上存储有可执行代码,当所述可执行代码被电子设备的处理器执行时,使所述处理器至少可以实现如前述实施例中提供的断点调试方法。
以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助加必需的通用硬件平台的方式来实现,当然也可以通过硬件和软件结合的方式来实现。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以计算机产品的形式体现出来,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

Claims (10)

1.一种断点调试方法,其特征在于,包括:
获取待调试程序运行时所调用的多个函数对应的多个函数调用信息;
根据所述多个函数调用信息,确定所述多个函数之间的函数调用关系;
根据所述函数调用关系,确定所述待调试程序对应的调试起点和调试终点;
从所述多个函数调用信息中确定与所述调试终点和所述调试终点匹配的目标函数对应的目标函数调用信息;
根据所述目标函数调用信息,对所述待调试程序进行程序断点调试。
2.根据权利要求1所述的方法,其特征在于,所述根据所述函数调用关系,确定待调试程序对应的调试起点和调试终点,包括:
根据所述函数调用关系,生成所述多个函数对应的函数调用链;
在所述函数调用链中的第一函数对应的第一位置设置第一断点,以作为所述调试起点;
在所述函数调用链中的第二函数对应的第二位置设置第二断点,以作为所述调试终点;其中,所述待调试程序在运行时对所述第一函数的调用早于对所述第二函数的调用。
3.根据权利要求2所述的方法,其特征在于,所述在所述函数调用链中的第一函数对应的第一位置设置第一断点,包括:
确定所述第一函数对应的第一消息发送函数;
在所述第一消息发送函数中设置第一断点;
所述在所述函数调用链中的第二函数对应的第二位置设置第二断点,包括:
确定所述第二函数对应的第二消息发送函数;
在所述第二消息发送函数中设置第二断点。
4.根据权利要求2所述的方法,其特征在于,根据所述函数调用关系生成函数调用链之后,所述方法还包括:
根据所述函数调用链,生成并展示调试进度条,所述调试进度条上包含有多个标识点,所述多个标识点与所述多个函数一一对应;
所述在所述函数调用链中的第一函数对应的第一位置设置第一断点,以作为所述调试起点,包括:
响应于所述调试进度条的起始端点被拖动至所述第一函数对应的标识点位置,在所述函数调用链中的第一函数对应的第一位置设置第一断点,以作为所述调试起点;
所述在所述函数调用链中的第二函数对应的第二位置设置第二断点,以作为所述调试终点,包括:
响应于所述调试进度条的结束端点被拖动至所述第二函数对应的标识点位置,在所述函数调用链中的第二函数对应的第二位置设置第二断点,以作为所述调试终点。
5.根据权利要求1所述的方法,其特征在于,所述多个函数为多个消息发送函数,所述获取待调试程序运行时所调用的多个函数对应的多个函数调用信息,包括:
通过hook函数确定所述待调试程序运行时所调用的多个消息发送函数对应的多个函数调用信息。
6.根据权利要求1所述的方法,其特征在于,所述从所述多个函数调用信息中确定与所述调试终点和所述调试终点匹配的目标函数对应的目标函数调用信息,包括:
根据所述函数调用关系、所述调用起点和所述调用终点,确定所述多个函数中位于所述调用起点和所述调用终端之间的目标函数;
从所述多个函数调用信息中确定所述目标函数对应的目标函数调用信息。
7.根据权利要求1至6中任一项所述的方法,其特征在于,所述多个函数调用信息中的任一个函数调用信息包括:对应的函数的调用对象、函数变量值、函数调用返回值、函数调用执行时间。
8.一种断点调试装置,其特征在于,包括:
获取模块,用于获取待调试程序运行时所调用的多个函数对应的多个函数调用信息;
处理模块,用于根据所述多个函数调用信息,确定所述多个函数之间的函数调用关系;根据所述函数调用关系,确定所述待调试程序对应的调试起点和调试终点;从所述多个函数调用信息中确定与所述调试终点和所述调试终点匹配的目标函数对应的目标函数调用信息;
调试模块,用于根据所述目标函数调用信息,对所述待调试程序进行程序断点调试。
9.一种电子设备,其特征在于,包括:存储器、处理器、通信接口;其中,所述存储器上存储有可执行代码,当所述可执行代码被所述处理器执行时,使所述处理器执行如权利要求1至7中任一项所述的断点调试方法。
10.一种非暂时性机器可读存储介质,其特征在于,所述非暂时性机器可读存储介质上存储有可执行代码,当所述可执行代码被电子设备的处理器执行时,使所述处理器执行如权利要求1至7中任一项所述的断点调试方法。
CN202311402697.0A 2023-10-26 2023-10-26 断点调试方法、装置、设备和存储介质 Pending CN117453545A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202311402697.0A CN117453545A (zh) 2023-10-26 2023-10-26 断点调试方法、装置、设备和存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202311402697.0A CN117453545A (zh) 2023-10-26 2023-10-26 断点调试方法、装置、设备和存储介质

Publications (1)

Publication Number Publication Date
CN117453545A true CN117453545A (zh) 2024-01-26

Family

ID=89595978

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202311402697.0A Pending CN117453545A (zh) 2023-10-26 2023-10-26 断点调试方法、装置、设备和存储介质

Country Status (1)

Country Link
CN (1) CN117453545A (zh)

Similar Documents

Publication Publication Date Title
EP1179777B1 (en) Generation of runtime execution traces of applications and error detection
CN106909510B (zh) 一种获取测试用例的方法以及服务器
CN110554965B (zh) 自动化模糊测试方法及相关设备、计算机可读存储介质
US9898387B2 (en) Development tools for logging and analyzing software bugs
US6634020B1 (en) Uninitialized memory watch
US7266809B2 (en) Software debugger and software development support system for microcomputer operable to execute conditional execution instruction
US7530056B1 (en) Method and system for detecting runtime defects in a program by comparing correct and incorrect runs
CN108319555B (zh) 一种基于嵌入式实时系统的实时调试方法
US20030208746A1 (en) Conditional breakpoint encountered indication
US7178135B2 (en) Scope-based breakpoint selection and operation
US9009678B2 (en) Software debugging with execution match determinations
US20150006961A1 (en) Capturing trace information using annotated trace output
US20080127119A1 (en) Method and system for dynamic debugging of software
US10997055B2 (en) Methods, circuits, apparatus, systems and associated software modules for evaluating code behavior
US20170075789A1 (en) Method and apparatus for generating, capturing, storing, and loading debug information for failed tests scripts
US20190138425A1 (en) Exception prediction before an actual exception during debugging
US7500149B2 (en) Generating finite state machines for software systems with asynchronous callbacks
CN109542444B (zh) Java应用的监控方法、装置、服务器和存储介质
CN113297064A (zh) 代码覆盖率测试方法、系统、设备及存储介质
US9846631B2 (en) Methods, circuits, apparatus, systems and associated software modules for evaluating code behavior
US11249880B1 (en) Debugging and simulating application runtime execution
CN116501378B (zh) 一种逆向工程还原源代码的实现方法、装置和电子设备
CN117453545A (zh) 断点调试方法、装置、设备和存储介质
EP2820547B1 (en) Debugging method and computer program product
CN110554969B (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