CN112988570B - 一种调试程序的方法、电子设备及存储介质 - Google Patents
一种调试程序的方法、电子设备及存储介质 Download PDFInfo
- Publication number
- CN112988570B CN112988570B CN202110172531.9A CN202110172531A CN112988570B CN 112988570 B CN112988570 B CN 112988570B CN 202110172531 A CN202110172531 A CN 202110172531A CN 112988570 B CN112988570 B CN 112988570B
- Authority
- CN
- China
- Prior art keywords
- function
- program
- address
- dynamic
- offset table
- 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
Images
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/362—Software debugging
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)
- Debugging And Monitoring (AREA)
Abstract
本公开提供了一种调试程序的方法、电子设备及存储介质。该方法包括:获取所述程序的可执行文件中的全局偏移表以及与所述程序相关联的多个动态函数;在所述全局偏移表中确定所述多个动态函数中的第一动态函数的第一地址;获取用于替换所述第一动态函数的第二动态函数的第二地址;更新所述全局偏移表以将所述全局偏移表中的所述第一地址替换为所述第二地址;以及基于所述更新的全局偏移表执行所述可执行文件。
Description
技术领域
本公开涉及数字信息技术领域,尤其涉及一种调试程序的方法、电子设备及存储介质。
背景技术
程序在运行过程中可能需要对某些函数进行调整。通常的做法是先将程序下线,再对程序进行函数的调整后再重新上线。但是,对于一些需要持续运行的程序,程序下线成本非常高昂。
如何在保持程序运行的同时动态地实现旧函数的下线和新函数的上线是一个亟待解决的问题。
类似的问题还存在于程序调试。程序调试是指编写好的程序设计在投入实际运行之前,用手工或编译程序等方法将程序设计的源代码送入计算机中进行仿真测试,以确定程序设计中的错误或低效的问题代码,针对问题进行修正优化更新,进而能够保证程序正常高效运行。
例如仿真测试时可以调用profile函数在程序运行过程中按照一定时间间隔发送监测信号来采集程序的运行信息(如采样时的函数调用栈、栈顶函数等),以此计算各项运行指标(如函数的调用次数、占总执行时间的百分比等)来确定程序中各个代码段的运行效率。
在调用profile函数发送监测信号采集程序运行信息时会中断程序运行,然而程序运行过程中会通过调用动态函数实现各种函数功能,在调用一些动态函数如fork函数、vfork函数等系统函数时,这些系统函数在运行过程中一旦被监测信号中断,整个程序运行就有可能报错,导致对程序的监测调试无法正常执行。
因此,需要在不中断程序调试的前提下,对相关动态函数做出调整以确保profile函数的正常运行。
发明内容
有鉴于此,本公开提出了一种调试程序的方法、电子设备及存储介质。
本公开第一方面,提供了一种调试程序的方法,所述方法包括:获取所述程序的可执行文件中的全局偏移表以及与所述程序相关联的多个动态函数;在所述全局偏移表中确定所述多个动态函数中的第一动态函数的第一地址;获取用于替换所述第一动态函数的第二动态函数的第二地址;更新所述全局偏移表以将所述全局偏移表中的所述第一地址替换为所述第二地址;以及基于所述更新的全局偏移表执行所述可执行文件。
本公开第二方面,提供了一种电子设备,包括:存储器,用于存储一组指令;以及至少一个处理器,配置为执行该组指令以进行第一方面所述的方法。
本公开的第三方面,提供了一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储电子装置的一组指令,该组指令用于使所述电子装置执行第一方面所述的方法。
从上面所述可以看出,本公开提供的调试程序的方法、电子设备及存储介质,通过获取用于替换第一动态函数的第二动态函数的第二地址,更新全局偏移表以将全局偏移表中第一动态函数的第一地址替换为所述第二地址,在程序运行时基于更新后的全局偏移表来执行程序的可执行文件,可以根据全局偏移表中的第二地址调用第二动态函数,采用这样的方式能够在保证程序运行的同时动态地实现旧函数的下线和新函数的上线,进一步的还能够保证程序中监测函数的正常运行。
附图说明
为了更清楚地说明本公开或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本公开,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1A示出了根据本公开实施例的一种电子设备的结构示意图。
图1B示出了根据本公开实施例的示例性编译器的示意图。
图2示出了根据本公开实施例的示例性仿真工具的示意图。
图3A示出了根据本公开实施例的目标程序示例性可执行文件的示意图。
图3B示出了根据本公开实施例的全局偏移表更新后的示例性可执行文件的示意图。
图3C示出了根据本公开实施例的目标程序的示例性动态函数的示意图。
图4示出了根据本公开实施例的一种调试程序示例性方法的流程示意图。
具体实施方式
为使本公开的目的、技术方案和优点更加清楚明白,以下结合具体实施例,并参照附图,对本公开进一步详细说明。
需要说明的是,除非另外定义,本公开使用的技术术语或者科学术语应当为本公开所属领域内具有一般技能的人士所理解的通常意义。本公开中使用的“第一”、“第二”以及类似的词语并不表示任何顺序、数量或者重要性,而只是用来区分不同的组成部分。“包括”或者“包含”等类似的词语意指出现该词前面的元件或者物件涵盖出现在该词后面列举的元件或者物件及其等同,而不排除其他元件或者物件。“连接”或者“相连”等类似的词语并非限定于物理的或者机械的连接,而是可以包括电性的连接,不管是直接的还是间接的。“上”、“下”、“左”、“右”等仅用于表示相对位置关系,当被描述对象的绝对位置改变后,则该相对位置关系也可能相应地改变。
程序在运行过程中可能需要对某些函数进行调整。通常的做法是先将程序下线,再对程序进行函数的调整后再重新上线。但是,对于一些需要持续运行的程序,程序下线成本非常高昂。
如何在保持程序运行的同时动态地实现旧函数的下线和新函数的上线是一个亟待解决的问题。
类似的问题还存在于程序调试中。程序调试是指编写好的程序设计在投入实际运行之前,用手工或编译程序等方法将程序设计的源代码送入计算机中进行仿真测试,以确定程序设计中的错误或低效的问题代码,针对问题进行修正优化更新,进而能够保证程序正常高效运行。profile函数可以用来获取程序的代码的运行的状态信息(例如,运行效率)以实现对程序运行的监控分析。具体的调用profile函数按照一定时间间隔发送监测信号来获取采集程序运行信息(如采样时的函数调用栈、栈顶函数等),以此计算程序的各项运行指标(如函数的调用次数、占总执行时间的百分比等)来确定程序中各个代码段的运行效率。在调用profile函数发送监测信号以获取采集程序运行信息时会中断程序运行,然而程序运行过程中会采用动态函数调用以实现各种函数功能,在调用一些动态函数如fork函数、vfork函数等这些系统函数时,这些系统函数在运行过程中一旦被监测信号中断,整个程序就有可能报错,导致对程序的监测调试无法正常执行。
因此,需要在不中断程序调试的前提下,对相关动态函数做出调整以确保profile函数的正常运行。
为便于理解本发明的技术方案,以下对本发明所涉及的一些概念和术语进行说明。
程序调试时需要利用编译器对程序设计的源代码进行编译,以基于程序设计的源代码来生成目标程序。目标程序可以是可执行文件(Executable andLinkable Format,ELF),用于进一步的执行以实现仿真或运行。下面以仿真为例进行说明。仿真可以由仿真器通过执行上述可执行文件来进行。
为保证可执行文件代码的模块化、运行性能与可维护性,仿真器在执行加载可执行文件代码时采用动态链接技术。动态链接指的是软件运行所依赖的功能被存储在软件以外的动态链接库中,动态链接库暴露出字符串形式的函数接口,在运行期间,软件、动态链接器与动态链接库都被载入到软件的进程空间中。可执行文件运行时在调用某个动态链接库中的某个动态函数前,动态链接器会根据该动态函数的字符串名称解析得到动态链接库中该动态函数的具体位置,并跳转到该动态函数的位置处执行代码,从而开始函数调用。由于函数名解析定位以及调用的整个过程是在软件运行期间发生的,而不是在软件编译链接生成可执行程序的过程中发生的,因此此项技术被称为动态链接。
以下结合ELF文件的内容对动态链接技术的函数调用过程进行说明:在ELF文件中存在多个节(section),与动态链接密切相关的节包括全局偏移表(GOT,Global OffsetTable)、过程链接表(PLT,Procedure Linkage Table)等,其中全局偏移表GOT包括多个表项。表项中可以包括相应的动态函数在内存中的地址。更具体的,程序调用动态函数时实际上会调用PLT中的代码,PLT中的代码会跳转到GOT表中存储的地址处。GOT表的每个地址对应于一个表项。也就是说,程序可以根据PLT找到自己需要调用的函数在GOT表中的表项。而GOT表在表项中存储的地址是程序所需要调用的动态函数的地址。因此,定位了GOT表中的表项就可以找到动态函数的地址,并完成对动态函数的调用。
由于在动态链接时相应的地址是未知的,因此其初始值实际上此地址填写的是指向PLT中的另一段代码,这段代码配合动态链接器负责在程序运行时解析对应的动态链接库函数地址,并最终修改GOT表中相应的地址为此地址,然后再跳转到此地址去执行动态函数。这样,当以后程序再次调用该动态函数时,即可根据GOT表直接跳转到该动态函数处执行代码,而不用再进行解析查找了。
仿真器采用上述的动态链接技术根据全局偏移表中存储的动态函数地址调用相应的动态函数。本领域技术人员可以理解的是动态链接库中的多个动态函数中包括系统函数(如fork函数、vfork函数以及clone函数等)。在根据所述系统函数的函数地址调用执行系统函数的过程中,若接收到外部监测函数,系统函数的运行过程会被中断。而系统函数的运行过程一旦中断,整个仿真程序就会报错,对程序的监测调试无法正常执行。
鉴于此,本公开实施例提供了一种调试程序的方法,所述方法包括:获取所述程序的可执行文件中的全局偏移表以及与所述程序相关联的多个动态函数;在所述全局偏移表中确定所述多个动态函数中的第一动态函数的第一地址;获取用于替换所述第一动态函数的第二动态函数的第二地址;更新所述全局偏移表以将所述全局偏移表中的第一地址替换为所述第二地址;以及基于所述更新的全局偏移表执行所述可执行文件。本公开实施例提供的调试程序的方法,通过获取用于替换第一动态函数的第二动态函数的第二地址,更新全局偏移表以将全局偏移表中的第一地址替换为所述第二地址,在程序运行时基于更新后的全局偏移表来执行程序的可执行文件,采用这样的方式在根据所述全局偏移表中的函数地址来调用函数时所调用的是用于替换第一动态函数的第二动态函数,能够在保证程序运行的同时动态地实现旧函数的下线和新函数的上线,进一步的能够避免因直接调用第一函数造成的整个程序报错,从而保证程序中监测函数的正常运行。
图1A示出了根据本公开实施例的一种电子设备100的结构示意图。电子设备100例如可以是计算机主机。该电子设备100可以包括:处理器102、存储器104、网络接口106、外围接口108和总线110。其中处理器102、存储器104、网络接口106和外围接口108通过总线110实现彼此之间在设备内部的通信连接。
处理器102可以是中央处理器(Central Processing Unit,CPU)、图像处理器、神经网络处理器(NPU)、微控制器(MCU)、可编程逻辑器件、数字信号处理器(DSP)、应用专用集成电路(Application Specific Integrated Circuit,ASIC)或者一个或多个集成电路。处理器102可以用于执行与本公开描述的技术相关的功能。在一些实施例中,处理器102还可以包括集成为单一逻辑组件的多个处理器。如图1A所示,处理器102可以包括多个处理器102a、102b和102c。
存储器104可以配置为存储数据(例如,指令集、计算机代码、中间数据等)。例如,如图1A所示,存储的数据可以包括程序指令(例如,用于实现本公开的技术方案的程序指令)以及待处理的数据(例如,存储器104可以存储在编译过程产生的临时代码)。处理器102也可以访问存储的程序指令和数据,并且执行程序指令以对要处理的数据进行操作。存储器104可以包括易失性存储装置或非易失性存储装置。在一些实施例中,存储器104可以包括随机访问存储器(RAM)、只读存储器(ROM)、光盘、磁盘、硬盘、固态硬盘(SSD)、闪存、存储棒等。
网络接口106可以配置为经由网络向电子设备100提供与其他外部设备的通信。该网络可以是能够传输和接收数据的任何有线或无线的网络。例如,该网络可以是有线网络、本地无线网络(例如,蓝牙、WiFi、近场通信(NFC)等)、蜂窝网络、因特网、或上述的组合。可以理解的是,网络的类型不限于上述具体示例。在一些实施例中,网络接口106可以包括任意数量的网络接口控制器(NIC)、射频模块、接收发器、调制解调器、路由器、网关、适配器、蜂窝网络芯片等的任意组合。
外围接口108可以配置为将电子设备100与一个或多个外围装置连接,以实现信息输入及输出。例如,外围装置可以包括键盘、鼠标、触摸板、触摸屏、麦克风、各类传感器等输入设备以及显示器、扬声器、振动器、指示灯等输出设备。
总线110可以被配置为在电子设备100的各个组件(例如处理器102、存储器104、网络接口106和外围接口108)之间传输信息,诸如内部总线(例如,处理器-存储器总线)、外部总线(USB端口、PCI-E总线)等。
需要说明的是,尽管上述设备仅示出了处理器102、存储器104、网络接口106、外围接口108和总线110,但是在具体实施过程中,该设备还可以包括实现正常运行所必需的其他组件。此外,本领域的技术人员可以理解的是,上述设备中也可以仅包含实现本公开实施例方案所必需的组件,而不必包含图中所示的全部组件。
图1B示出了根据本公开实施例的示例性编译器120的示意图。
编译器120可以基于待编译的计算机代码来生成目标代码的计算机程序。待编译的计算机代码又可以称为源代码。通常,编写源代码的源语言是高级编程语言。高级编程语言可以例如是C++、Java等软件编程语言或VHDL、Verilog、SystemVerilog等硬件描述语言。目标代码则可以是例如汇编代码、机器码等。
编译器120例如可以存储在图1A所示的存储器104中,并且由处理器102执行。
如图1B所示,编译器120可以包括前端122、中端124以及后端126。
前端122可以用于根据具体的源语言来分析源代码的词法、语法、语义。
在源代码的词法、语法、语义分析完成后,中端124可以将源代码转换为中间表示(或中间代码),并可以优化该中间表示。例如,中端124可以移除无用的代码、移除不可访问的代码、清除未使用的变量等。优化后的中间表示则可以被传递给后端126进行进一步处理。
后端126可以根据目标处理器(例如,图1A的处理器102)的架构来进一步优化中间表示,并生成目标代码。通常,目标代码是机器码。
可以理解的是,编译器的结构不限于图1B的示例。例如,前端122和中端124可以被合称为编译器的前端,或者,中端124和后端126可以被合称为编译器的后端。
图2示出了根据本公开实施例的示例性仿真工具200的示意图。仿真工具200可以是运行在电子设备100上的计算机程序。例如,仿真工具可以是芯华章科技股份有限公司出品的GalaxSim仿真工具。
如图2所示,仿真工具200可以包括编译器120和仿真器210。
编译器120可以将程序设计202编译为目标程序204。其中,程序设计202的源代码可以是由例如C++、Java、Python等软件编程语言编写的设计代码,经过编译后得到目标程序204。程序设计202还可以是由VHDL、Verilog、SystemVerilog等硬件描述语言编写的逻辑系统设计,逻辑系统设计经过编译器120编译得到相应的目标程序204可以是逻辑系统设计的仿真程序。
仿真器210可以加载执行目标程序204进行仿真测试,具体的仿真器210可以获取并执行目标程序204的可执行文件。其中,仿真器210可以根据目标程序204可执行文件调用相关联的功能函数实现实现相应功能,例如仿真器210可以调用fork函数创建一个新的进程。对于逻辑系统设计的仿真程序,仿真器210可以根据仿真程序仿真逻辑系统设计的运行。仿真器210可以将仿真结果206输出。例如,仿真工具200可以将仿真结果(例如,仿真波形图)经由图1A的外围接口108输出到输出设备上(例如,显示在显示器上)。
图3A示出了根据本公开实施例的目标程序示例性可执行文件300的示意图。
如图3A所示,可执行文件300可以包括全局偏移表310。全局偏移表310可以用于存储与目标程序204相关联的多个动态函数的地址。具体的,全局偏移表310可以包括记载动态函数地址的多个表项。
以全局偏移表310为例,全局偏移表310可以包括表项312、表项314与表项316。这三个表项分别与动态函数318、动态函数320、动态函数322相对应。一个表项可以包括字符串形式的函数名以及相应的动态函数的地址,例如,表项312中可以包括动态函数318的函数名(如“Function1”)以及动态函数318的地址3122。
在初始状态时,一个待调用的动态函数的地址是未知的。仿真器210可以根据可执行文件300来确定该动态函数的地址。在一些实施例中,可执行文件300可以包括解析函数。该解析函数可以用于解析动态函数在内存中的地址。仿真器210则可以利用该解析函数来确定该动态函数的地址,并将该地址填入全局偏移表310的相应表项中。
例如,动态函数318可以是式样化输出函数printf()。在全局偏移表310中的相应表项312中,函数名“Function1”可以相应地为“printf”。在初始状态下,表项312中的地址3122的值未知。仿真器210可以利用解析函数确定该式样化输出函数printf()在内存中的地址,例如为0xf7e8350。进一步的,仿真器210可以将该式样化输出函数printf()的地址填入表项312中。相应地,表项312中地址3122的值更新为“0xf7e8350”。
例如,动态函数320可以是系统函数fork()。在全局偏移表310中的相应表项314中,函数名“Function2”可以相应地为“fork”。在初始状态下,表项314中地址3124的值未知。仿真器210可以利用解析函数确定该系统函数fork()在内存中的地址,例如为0xf7e86f0。进一步的,仿真器210可以将该系统函数fork()的地址填入表项314。相应地,表项314中地址3124的值更新为“0xf7e86f0”。
可以理解的是,动态函数可以是其他与目标程序204有关的任何功能函数,而不仅仅局限于以上所述的printf()函数、fork()函数。
为了调用一个动态函数,仿真器210可以在全局偏移表310的多个表项中确定与该待调用的动态函数相对应的表项。如上所述,可执行文件300可以包括过程链接表(PLT)。仿真器210可以根据该过程链接表来确定与该动态函数相应的表项。例如,仿真器210需要调用动态函数320,可以根据过程链接表确定与动态函数320相关的地址信息存储在全局偏移表的哪个位置。具体地,根据访问动态函数320的请求,仿真器210可以根据过程链接表确定一个偏移地址。通过向全局偏移表的首地址(也就是全局偏移表的地址)施加该偏移地址,仿真器210可以定位存储动态函数320的地址的表项(例如,表项314)。进一步的,仿真器210可以跟据表项314中所存储的地址3124来调用动态函数320。例如,动态函数320可以是系统函数fork(),动态函数320的地址3124相应的可以是0xf7e86f0。仿真器210则可以根据地址0xf7e86f0来调用系统函数fork()。
可以理解的是,在一些实施例中,存在PLT没有被打开的情况。在这种情况下,整个全局偏移表可以在库被载入时由动态链接负责填写,而函数在被调用时可以直接跳转到全局偏移表的表项中的地址,并不需要经过PLT。
当所调用的动态函数存在问题(例如执行错误,或者需要更新功能),需要将该动态函数替换为新的动态函数。仿真器210可以更新全局偏移表310中的动态函数地址以调用新的动态函数。由于仿真器210是通过过程链接表确定动态函数的地址所在的表项,而该表项在全局偏移表中的位置是固定的,所以仅需要更新表项内存储的动态函数的地址就可以引导仿真器210按照更新后的动态函数的地址去调用新的动态函数。
图3B示出了根据本公开实施例的全局偏移表310更新后的示例性可执行文件300的示意图。在一些实施例中,仿真器210可以获取用于替换动态函数318的动态函数324的地址,并且将全局偏移表310中动态函数318的地址替换为动态函数324的地址。可以理解的是,动态函数318可以是需要被替换的函数(例如,引发程序错误的函数、功能需要升级的函数等),而动态函数324可以是替代函数(例如,修正程序错误的函数、升级函数等)。
如图3B所示,在更新后的全局偏移表310中,表项312中存储的地址被更新为地址3128,而地址3128指向动态函数324。在一些实施例中,仿真器210可以利用解析函数来确定动态函数324的地址3128,并进一步将该地址3128更新到表项312中。
这样,原本指向图3A的动态函数318的地址3122在表项312中被替代为地址3128,从而使得目标程序204在执行时可以调用新的动态函数324。
以下具体描述一些示例。
在一些实施例中,图3A的动态函数318可以是系统函数fork(),而用于替换动态函数318的动态函数324可以是系统函数vfork()。该系统函数fork()的地址相应的可以是0xf7e86fa,而该系统函数vfork()的地址可以是0xf7e86e2。动态函数(例如,vfork()或fork())的地址可以由仿真器210利用解析函数确定。可以理解,动态函数的地址也可以人工确定。如上所述,仿真器210则可以将表项312中之前所存储的系统函数fork()的地址0xf7e86fa更新为系统函数vfork()的地址0xf7e86e2。
这样,仿真器210基于全局偏移表310执行所述可执行文件300时,可以根据全局偏移表310中的地址3128调用动态函数324,从而避免直接调用存在问题的动态函数318。这样,仿真器210可以在目标程序204持续运行不下线的情况下将动态函数318替换为动态函数324。
在一些实施例中,为确定程序设计中的低效代码,需要确定目标程序204的运行效率,因此仿真器210可以监测目标程序204的可执行文件300的代码的运行效率。在一些实施例中,可执行文件300可以包括监测函数(例如,profile函数),用于检测目标程序204的运行并确定目标程序204的运行效率。
监测函数在运行过程中按照一定时间间隔发送中断信号,该中断信号可以暂时中断目标程序204的运行,从而使得监测函数可以获取目标程序204在中断时刻的运行信息(如程序中断时的函数调用栈、栈顶函数等),以此计算目标程序204的各项运行指标(如函数的调用次数、占总执行时间的百分比等),并相应地确定目标程序204中各个代码段的运行效率。在中断信号的影响下,部分系统函数(如fork()函数、vfork()函数、clone()函数等)也会被监测函数发出的中断信号所中断。而系统函数一旦被中断就会报错,系统函数的报错会进一步导致目标函数204报错,监测函数无法正常运行。
在一个示例中,在图3A中,地址3122所指向的动态函数318可以是一个系统函数。也就是说,动态函数318可以是例如fork()、vfork()、clone()等。为了解决上述监测函数导致系统函数报错的问题,可以将地址3122修改为图3B中的地址3128,而地址3128可以指向新的动态函数324(例如可以是包装函数fork_wrapper())。
图3C示出了根据本公开实施例的目标程序的示例性动态函数324的示意图。如图3C所示,动态函数324可以包括第一指令3222、第二指令3224与第三指令3226。第一指令3222可以是例如“stop profile signal”,用于停止中断信号(profile signal)。第二指令3224可以是例如“call fork()”,用于调用图3A的函数318(在这个示例中是fork())。第三指令可以是例如“resume profilesignal”,用于恢复中断信号。
这样,当仿真器210执行可执行文件300时,可以根据更新后的全局偏移表310中的地址3128去调用动态函数324(例如,fork_wrapper())。在仿真器210执行动态函数324的过程中,仿真器210先根据第一指令3222停止中断信号,从而避免了中断信号导致系统函数fork()中断并报错。仿真器210然后执行第二指令3224,该第二指令3224调用了动态函数318(例如,系统函数fork()),从而使得系统函数fork()得到执行。在系统函数fork()执行完毕之后,仿真器210执行第三指令3226,重新恢复了中断信号,使得监测函数的运行得以继续。
这样,通过修改全局偏移表310中特定表项的地址,使得仿真器210可以在执行系统函数(例如,fork())之前停止中断信号,而在系统函数执行完毕之后恢复中断信号,从而在保证目标程序204正常运行的情况也得以实现程序运行的监测功能。
在又一个示例中,可以在目标程序204持续运行不下线的情况下对部分函数进行替换。例如,在一个示例中,在图3A中,地址3122所指向的的函数318是一个待替换的函数(例如,Function1())。为了不影响目标程序204的运行,可以在目标程序204运行的同时,对全局偏移表310中表项312中的地址3122进行修改。例如,修改表项312中的地址3122为图3B中的地址3128。该地址3128指向动态函数324,也就是用于替代函数Function1()的函数Function1’()。这样,当目标程序204需要再次调用与表项312关联的动态函数时,表项312会使得仿真器210去执行新的动态函数324,从而实现的动态的升级。
图4示出了根据本公开实施例的一种调试程序示例性方法400的流程示意图。
该调试程序的方法400可以由图1A所示的电子设备100执行。例如,由在电子设备100上运行的仿真器210执行。所述方法400可以包括以下步骤。
在步骤402,仿真器210可以获取所述程序(例如,图2中的目标程序204)的可执行文件(例如,图3A中的可执行文件300)中的全局偏移表(例如,图3A中的全局偏移表310)以及与所述程序相关联的多个动态函数(例如,图3A中的动态函数318、动态函数320、动态函数322)。其中,所述程序可以是逻辑系统设计的仿真程序,用于仿真所述逻辑系统设计的运行。
其中,所述可执行文件可以包括所述全局偏移表。所述全局偏移表可以包括多个表项(例如,图3A中的表项312、表项314、表项316)。多个表项用于分别存储与所述程序相关联的多个动态函数的地址(例如,图3A中的地址3122、地址3124、地址3126)。
在一些实施例中,仿真器210可以利用解析函数确定动态函数的地址。
在步骤404,仿真器210可以在所述全局偏移表中确定所述多个动态函数中的第一动态函数(例如,图3A中的动态函数318)的第一地址(例如,图3A中的地址3122)。
在一些实施例中,所述可执行文件还可以包括过程链接表。仿真器210可以获取所述过程链接表。仿真器210可以根据所述过程链接表在多个动态函数中确定待调用的第一动态函数。进一步的,仿真器210可以在所述全局偏移表中确定与所述第一动态函数相关联的第一表项并确定所述第一表项中存储的所述第一地址。
在步骤406,仿真器210可以获取用于替换所述第一动态函数的第二动态函数(例如,图3B中的动态函数324)的第二地址(例如,图3B中的地址3128)。其中,所述第二动态函数的第二地址可以由仿真器210利用解析函数确定。在一些实施例中,第二动态函数的第二地址可以由用户人工确定,并向仿真器210提供。
在步骤408,仿真器210可以更新所述全局偏移表以将所述全局偏移表中的所述第一地址替换为所述第二地址。替换例如可以人工修改所述全局偏移表或由仿真器210根据指令自动完成。
在步骤410,仿真器210可以基于所述更新的全局偏移表执行所述可执行文件。进一步的,仿真器210可以根据所述更新的全局偏移表中的所述第二地址调用所述第二动态函数。
在一些实施例中,所述可执行文件还可以包括监测函数,所述监测函数用于确定所述程序的运行效率,被配置为在所述程序运行时向所述程序提供中断信号。所述第一动态函数可以为所述程序的系统函数。所述第二函数可以包括用于停止所述中断信号的第一指令(例如,图3C中的指令3222)、用于根据所述第一地址调用所述第一动态函数的第二指令(例如,图3C中的指令3224)以及用于恢复所述中断信号的第三指令(例如,图3C中的指令3226)。所述仿真器210在调用所述第二动态函数时,可以执行所述第一指令,以停止所述中断信号;之后,仿真器210可以执行所述第二指令,根据所述第一地址调用所述第一动态函数;在所述第一动态函数执行完毕后,所述仿真器210可以执行所述第三指令,以恢复所述中断信号。
本公开实施例提供的调试程序的方法、电子设备,通过获取用于替换第一动态函数的第二动态函数的第二地址,更新全局偏移表以将全局偏移表中第一动态函数的第一地址替换为所述第二地址,在程序运行时基于更新后的全局偏移表来执行程序的可执行文件,可以根据全局偏移表中的第二地址调用第二动态函数,采用这样的方式能够在保证程序运行的同时动态地实现旧函数的下线和新函数的上线,进一步的还能够保证程序中监测函数的正常运行。
需要说明的是,本公开的方法可以由单个设备执行,例如一台计算机或服务器等。本实施例的方法也可以应用于分布式场景下,由多台设备相互配合来完成。在这种分布式场景的情况下,这多台设备中的一台设备可以只执行本公开的方法中的某一个或多个步骤,这多台设备相互之间会进行交互以完成所述的方法。
需要说明的是,上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
基于同一发明构思,与上述任意实施例方法相对应的,本公开还提供了一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令用于使所述计算机执行如上任一实施例所述的调试程序的方法。
本实施例的计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。
上述实施例的存储介质存储的计算机指令用于使所述计算机执行如上任一实施例所述的调试程序的方法,并且具有相应的方法实施例的有益效果,在此不再赘述。
所属领域的普通技术人员应当理解:以上任何实施例的讨论仅为示例性的,并非旨在暗示本公开的范围(包括权利要求)被限于这些例子;在本公开的思路下,以上实施例或者不同实施例中的技术特征之间也可以进行组合,步骤可以以任意顺序实现,并存在如上所述的本公开的不同方面的许多其它变化,为了简明它们没有在细节中提供。
另外,为简化说明和讨论,并且为了不会使本公开难以理解,在所提供的附图中可以示出或可以不示出与集成电路(IC)芯片和其它部件的公知的电源/接地连接。此外,可以以框图的形式示出装置,以便避免使本公开难以理解,并且这也考虑了以下事实,即关于这些框图装置的实施方式的细节是高度取决于将要实施本公开的平台的(即,这些细节应当完全处于本领域技术人员的理解范围内)。在阐述了具体细节(例如,电路)以描述本公开的示例性实施例的情况下,对本领域技术人员来说显而易见的是,可以在没有这些具体细节的情况下或者这些具体细节有变化的情况下实施本公开。因此,这些描述应被认为是说明性的而不是限制性的。
尽管已经结合了本公开的具体实施例对本公开进行了描述,但是根据前面的描述,这些实施例的很多替换、修改和变型对本领域普通技术人员来说将是显而易见的。例如,其它存储器架构(例如,动态RAM(DRAM))可以使用所讨论的实施例。
本公开旨在涵盖落入所附权利要求的宽泛范围之内的所有这样的替换、修改和变型。因此,凡在本公开的精神和原则之内,所做的任何省略、修改、等同替换、改进等,均应包含在本公开的保护范围之内。
Claims (9)
1.一种调试程序的方法,所述方法包括:
获取所述程序的可执行文件中的全局偏移表以及与所述程序相关联的多个动态函数;
在所述全局偏移表中确定所述多个动态函数中的第一动态函数的第一地址;
获取用于替换所述第一动态函数的第二动态函数的第二地址;
更新所述全局偏移表以将所述全局偏移表中的所述第一地址替换为所述第二地址;以及
基于所述更新的全局偏移表执行所述可执行文件;
其中,所述程序包括用于监测所述程序的运行的监测函数,所述监测函数配置为在所述程序运行时向所述程序提供中断信号;
所述第一动态函数为所述程序的系统函数,并且所述第二动态函数包括用于停止所述中断信号的第一指令、用于根据所述第一地址调用所述第一动态函数的第二指令以及用于恢复所述中断信号的第三指令。
2.如权利要求1所述的方法,其中,基于所述更新的全局偏移表执行所述可执行文件进一步包括:
根据所述第二地址调用所述第二动态函数。
3.如权利要求1所述的方法,其中,所述程序是逻辑系统设计的仿真程序,用于仿真所述逻辑系统设计的运行。
4.如权利要求1所述的方法,其中,所述根据所述第二地址调用所述第二动态函数进一步包括:
执行所述第一指令,以停止所述中断信号;
执行所述第二指令,以调用所述第一动态函数;以及
所述第一动态函数执行完成后,执行所述第三指令,以恢复所述中断信号。
5.如权利要求1所述的方法,其中,所述全局偏移表包括多个表项,并且在所述全局偏移表中确定所述多个动态函数中的第一动态函数的第一地址进一步包括:
获取所述可执行文件的过程链接表;
根据所述过程链接表在所述全局偏移表中确定与所述第一动态函数关联的第一表项,其中,所述第一表项包括所述第一动态函数的第一地址。
6.如权利要求1所述的方法,其中,所述程序包括用于解析所述第一动态函数的所述第一地址的解析函数;
所述方法还包括利用所述解析函数解析确定所述第一地址,将所述第一地址填入所述全局偏移表。
7.如权利要求1所述的方法,其中,所述监测函数用于确定所述程序的运行效率。
8.一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如权利要求1至7任意一项所述的方法。
9.一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令用于使所述计算机执行权利要求1至7任一所述方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110172531.9A CN112988570B (zh) | 2021-02-08 | 2021-02-08 | 一种调试程序的方法、电子设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110172531.9A CN112988570B (zh) | 2021-02-08 | 2021-02-08 | 一种调试程序的方法、电子设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112988570A CN112988570A (zh) | 2021-06-18 |
CN112988570B true CN112988570B (zh) | 2023-03-10 |
Family
ID=76347608
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110172531.9A Active CN112988570B (zh) | 2021-02-08 | 2021-02-08 | 一种调试程序的方法、电子设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112988570B (zh) |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111290952A (zh) * | 2020-01-22 | 2020-06-16 | 北京深之度科技有限公司 | 一种动态链接库函数的跟踪方法及装置 |
CN111782302A (zh) * | 2020-07-13 | 2020-10-16 | 腾讯科技(深圳)有限公司 | 进程更新方法和装置、存储介质及电子设备 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110275722B (zh) * | 2019-06-21 | 2023-08-08 | 北京百度网讯科技有限公司 | 用于升级应用的方法、装置、设备和存储介质 |
-
2021
- 2021-02-08 CN CN202110172531.9A patent/CN112988570B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111290952A (zh) * | 2020-01-22 | 2020-06-16 | 北京深之度科技有限公司 | 一种动态链接库函数的跟踪方法及装置 |
CN111782302A (zh) * | 2020-07-13 | 2020-10-16 | 腾讯科技(深圳)有限公司 | 进程更新方法和装置、存储介质及电子设备 |
Also Published As
Publication number | Publication date |
---|---|
CN112988570A (zh) | 2021-06-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110321275B (zh) | 程序监控方法、装置、计算设备以及存储介质 | |
KR100868762B1 (ko) | 임베디드용 소프트웨어의 오류 검출 방법 | |
US20070011669A1 (en) | Software migration | |
US20090307667A1 (en) | Assisting debug memory tracing using an instruction array that tracks the addresses of instructions modifying user specified objects | |
US20150278073A1 (en) | Logging code generation and distribution | |
US20220197777A1 (en) | System and methods for live debugging of transformed binaries | |
WO2015008115A1 (en) | Method and computer program product for disassembling a mixed machine code | |
US8943480B2 (en) | Setting breakpoints in optimized instructions | |
CN105094910A (zh) | 一种驱动函数用户态调试系统和方法 | |
CN111563032A (zh) | App调试方法、装置、计算机设备及存储介质 | |
CN102722438B (zh) | 一种内核调试的方法和设备 | |
US9117017B2 (en) | Debugger with previous version feature | |
US20120110383A1 (en) | Method and apparatus for off-line analyzing crashed programs | |
CN112988570B (zh) | 一种调试程序的方法、电子设备及存储介质 | |
US9111034B2 (en) | Testing of run-time instrumentation | |
US11720474B2 (en) | System and methods for post mortem debugging of transformed binaries | |
CN114546823B (zh) | 用于重现逻辑系统设计的调试场景的方法及相关设备 | |
CN112506806B (zh) | 用于调试程序的方法、电子设备及存储介质 | |
CN112559336B (zh) | 自适应调试异构计算芯片的方法、装置、系统及主板芯片 | |
Yin et al. | Debugopt: Debugging fully optimized natively compiled programs using multistage instrumentation | |
CN109358855A (zh) | 一种用于编程的前端模拟数据敏捷开发方法及电子设备 | |
CN117172168B (zh) | 在仿真中实现回调的方法、电子设备和存储介质 | |
CN111258910B (zh) | 静态链接库功能验证方法、装置、电子设备及存储介质 | |
CN102262545A (zh) | 程序安装方法及装置 | |
CN114781294A (zh) | 一种risc-v cpu验证中的签名比较方法及装置 |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |