CN112506806B - 用于调试程序的方法、电子设备及存储介质 - Google Patents
用于调试程序的方法、电子设备及存储介质 Download PDFInfo
- Publication number
- CN112506806B CN112506806B CN202110139224.0A CN202110139224A CN112506806B CN 112506806 B CN112506806 B CN 112506806B CN 202110139224 A CN202110139224 A CN 202110139224A CN 112506806 B CN112506806 B CN 112506806B
- Authority
- CN
- China
- Prior art keywords
- loop
- program
- statement
- variable
- code
- 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
- G06F11/366—Software debugging using diagnostics
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
技术领域
本公开涉及计算机软件技术领域,尤其涉及一种用于调试程序的方法、电子设备及存储介质。
背景技术
在程序调式中可以使用断言语句(assert语句)来发现程序的错误。通常的编译器可以根据assert语句的条件来报错。但是,现有的报错方法只报告错误存在于程序中某个模块的代码行信息。对于包括循环语句的程序的调试,现有的报错方法则仅能报告错误代码的代码行信息,但是无法报告究竟在哪个循环发生了错误。由于无法精准定位程序在哪个循环语句出现错误,使得调试的过程缺乏调试信息,从而增加了调试的难度。
发明内容
有鉴于此,本公开提出了一种用于调试程序的方法、电子设备及存储介质。
本公开的第一方面,提供了一种用于调试程序的方法,其中,所述程序的代码包括多个语句,所述方法包括:分析所述程序的代码以在所述多个语句中检测循环语句;响应于检测到所述循环语句,将第一系统任务关联到所述循环语句,所述第一系统任务被配置为在被运行时将所述循环语句的循环定位信息保存于内存中的栈区;以及响应于运行所述程序,读取所述栈区中的所述循环定位信息用于调试所述程序。
本公开的第二方面,提供了一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现第一方面所述的方法。
本公开的第三方面,提供了一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储电子装置的一组指令,该组指令用于使所述电子装置执行第一方面所述的方法。
本公开实施例提供的用于调试程序的方法、电子设备及存储介质,分析程序的代码以在多个语句中检测循环语句,在检测到循环语句后,将第一系统任务关联到循环语句,用于循环语句的循环定位信息保存于内存中的栈区,从而使得在运行程序时,能够通过读取栈区中存储的循环定位新息精准定位程序出现的错误位于哪个循环语句。这样,在调试的过程中,足够的调试信息可以被获取,以降低了调试的难度,提高了程序的调试速度和调试效率。
附图说明
为了更清楚地说明本说明书一个或多个实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本说明书一个或多个实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1A示出了本公开实施例所提供的一种示例性电子设备的结构示意图。
图1B示出了根据本公开实施例的示例性编译器的示意图。
图2示出了根据本公开实施例的示例性仿真工具的示意图。
图3A示出了根据本公开实施例的示例性程序的示意图。
图3B示出了根据本公开实施例的示例性报错信息的示意图。
图3C示出了根据本公开实施例的又一示例性程序的示意图。
图3D示出了根据本公开实施例的又一示例性报错信息的示意图。
图4示出了本公开实施例所提供的一种用于调试程序的示例性方法的流程示意图。
具体实施方式
为使本公开的目的、技术方案和优点更加清楚明白,以下结合具体实施例,并参照附图,对本公开进一步详细说明。
需要说明的是,除非另外定义,本说明书一个或多个实施例使用的技术术语或者科学术语应当为本公开所属领域内具有一般技能的人士所理解的通常意义。本说明书一个或多个实施例中使用的“第一”、“第二”以及类似的词语并不表示任何顺序、数量或者重要性,而只是用来区分不同的组成部分。“包括”或者“包含”等类似的词语意指出现该词前面的元件或者物件涵盖出现在该词后面列举的元件或者物件及其等同,而不排除其他元件或者物件。“连接”或者“相连”等类似的词语并非限定于物理的或者机械的连接,而是可以包括电性的连接,不管是直接的还是间接的。
如背景技术部分所述,对于包括循环语句的程序的调试时,通常的编译器对于assert语句报错,只报告错误存在于程序中某个模块的代码行信息,存在着由于无法精准定位程序在哪个循环语句出现的错误而使得调试的过程缺乏调试信息的的情况,因此增加了调试的难度。
有鉴于此,本公开实施例提供了一种用于调试程序的方法、电子设备及存储介质。所述程序的代码包括多个语句,所述方法包括:分析所述程序的代码以在所述多个语句中检测循环语句;响应于检测到所述循环语句,将第一系统任务关联到所述循环语句,所述第一系统任务被配置为在被运行时将所述循环语句的循环定位信息保存于内存中的栈区;以及响应于运行所述程序,读取所述栈区中的所述循环定位信息用于调试所述程序。
本公开实施例提供的用于调试程序的方法、电子设备及存储介质,分析程序的代码以在多个语句中检测循环语句,在检测到循环语句后,将第一系统任务关联到循环语句,用于循环语句的循环定位信息保存于内存中的栈区,从而使得在运行程序时,能够通过读取栈区中存储的循环定位新息精准定位程序出现的错误位于哪个循环语句。这样,在调试的过程中,足够的调试信息可以被获取,以降低了调试的难度,并提高了程序的调试速度和调试效率。
可以理解的是,上述的程序可以是与逻辑系统设计关联的程序。当一个包括一个或多个模块的程序用硬件语言描述之后,可以利用仿真器对其进行调试,所述程序可以是逻辑系统设计,所述逻辑系统设计可以是,例如,用于供专门应用的集成电路(ApplicationSpecific Integrated Circuit,简称ASIC)或者片上系统芯片(System-On-Chip,简称SOC)的设计。因此,在仿真器中被测试的逻辑系统设计又可以称为被测试设计(Design UnderTest,简称DUT)。仿真器可以通过一个或多个可配置组件(例如,现场可编程逻辑门阵列(Field Programmable Gate Array,简称FPGA))来仿真该DUT,包括执行该DUT的各种操作,从而在制造之前就测试并验证DUT的各个模块的功能。
图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可以移除无用的代码、移除不可访问的代码、清除未使用的变量等。优化可以包括机器相关的优化和机器无关的优化。其中,机器相关的优化,例如,可以是对测试平台(Testbench)的优化,并可以利用一些测试平台的特性来帮助优化。机器无关的优化,例如,可以是待测设备(Device Under Test,简称DUT)的优化。优化后的中间表示则可以被传递给后端126进行进一步处理。
后端126可以根据目标处理器(例如,图1A的处理器102)的架构来进一步优化中间表示,并生成目标代码。通常,目标代码是机器码。
可以理解的是,编译器的结构不限于图1B的示例。例如,前端122和中端124可以被合称为编译器的前端。
图2示出了根据本公开实施例的仿真工具200的示意图。仿真工具200可以是运行在电子设备100上的计算机程序。
在芯片设计领域,通常可以利用仿真工具对一个设计进行仿真。仿真工具例如可以是芯华章科技股份有限公司出品的GalaxSim仿真工具。图2示出的示例性仿真工具200可以包括编译器120和仿真器210。编译器120可以将设计202编译为目标代码204,仿真器210可以根据目标代码204进行仿真,并将仿真结果206输出。例如,仿真工具200可以将仿真结果(例如,仿真波形图)经由图1A的外围接口108输出到输出设备上(例如,显示在显示器上)。
可以理解的是,程序的仿真工具可以是业内任何适用的仿真工具而不限于图2的示例。
图3A示出了根据本公开实施例的示例性程序300的示意图。
当一个包括一个或多个模块的程序300用硬件语言描述之后,可以利用仿真工具200对其进行调试。如图3A所示,该程序300例如可以是一个逻辑系统设计,并且包括多行代码。该程序300描述了“t.v”文件中名为“dut”的模块以及该模块的顶层函数“certain func(datain)”。程序300的代码中包括多个语句,由于在不少实际问题中有许多具有规律性的重复操作,因此在程序300的代码中可以包括循环语句,而循环语句又可以包括嵌套的多层循环。例如,循环语句可以包括外层循环302(即,“for (i=0;i<100;i++)”)和内层循环304(即,“for (j=0;j<100;j++)”)。其中,循环语句可以包括循环变量。例如,循环变量可以进一步包括与内层循环304关联的变量“j”和与外层循环302关联的变量“i”。其中,循环变量(例如,变量“j”或变量“i”)从初始值(例如,“i=0”或“j=0”)开始执行循环语句,当循环变量能够超过循环条件(例如,“i<100”或“j<100”)时,则完成该循环语句,并跳出该循环继续执行后续语句。
在对程序300进行调试的时候,通常可以利用断言语句来报告程序300在运行过程中的错误。例如,程序300的代码中可以包括用于报错的断言语句306(即,“30: A: assert(TERM)”)。该断言语句306可以放置在开发人员希望进行调试检测的地方,从而在调试过程中检测程序300运行是否正确。在断言语句306中,“TERM”表示断言语句306的条件。例如,该条件可以为“a>b”,当程序300满足断言语句306的条件(即,a>b)时,程序300继续执行后续代码,而当程序300不满足断言语句306的条件时,可以通过断言语句306对程序300进行报错并生成报错信息,用于确定程序300的错误出现的位置。
图3B示出了根据本公开实施例的示例性报错信息310的示意图。
如图3B所示,通常仿真工具200对于断言语句306报错时,输出的报错信息310只报告错误代码发生的时间信息312(即,“assert failed at time 1000 ns”)、错误代码所述的文件信息314(即,“from t.v:”)、错误代码的行号信息316(即,“30”)以及错误代码的所属模块信息318(即,“dut.A”)。由于在程序300运行时,内存中调用栈(Call Stack)的栈区可以保存程序300中函数运行时的调用参数、程序300中代码的行号、函数返回的地址等等,所以其中报错信息310可以利用仿真工具200通过系统任务-调用栈(即,“$stack()”)打印出栈区中保存的上下文信息得到,进而查看错误代码的行号信息316以及错误代码的所属模块信息318。
例如,对于“certain_func()”函数的外层循环302(即,“for (i=0;i<100;i++)”),在调用该“certain_func()”函数时,该函数的相关信息会被一个“$push_funcion()”的操作保存在栈区中。这样,在利用仿真工具200打印栈区中保存的上下文信息时,如果外层循环302出现错误,则可以获知出现错误的代码属于“certain_func()”函数。
但是,对于循环语句(例如,for语句、while语句等),当程序300出现错误代码时,仿真工具200无法判定在哪个循环触发了断言语句306,即无法获取循环语句中的循环变量的信息(例如,变量“j”或变量“i”)。
为了能够更加准确地定位错误代码,图3C示出了根据本公开实施例的又一示例性程序320的示意图。
如图3C所示,程序320包括循环语句和断言语句330(即,“line 4 A: assert(TERM)”),其中,循环语句又可以包括嵌套的外层循环322(即,“line 1 for (i=0;i<100;i++)”)和内层循环326(即,“line 2 for (j=0;j<100;j++)”)。为了在断言语句330发现错误代码并对其进行报错时,能够精准定位该错误代码所在的循环语句,以及该错误代码位于所执行的循环语句的哪一层循环,仿真工具200可以向程序320插入与外层循环322关联的系统任务324(即,“$push_loop_info (i)”)以及与内层循环326关联的系统任务328(即,“$push_loop_info (j)”),用于确定错误代码位于哪一个循环语句的哪一层循环。
在一些实施例中,仿真工具200可以对程序320的代码进行分析,根据代码中的语句特点(例如,循环语句中包含“for”)检测循环语句(例如,外层循环322或内层循环326),在检测到循环语句后,仿真工具200可以为每个循环语句关联系统任务。例如,将系统任务324关联到外层循环322以及将系统任务328关联到内层循环326。
其中,系统任务(例如,系统任务324或系统任务328)在被运行时,能够将循环语句(例如,外层循环322或内层循环326)的循环定位信息保存于内存中的栈区。需要注意的是,仿真工具200可以判断被检测到的循环语句是否已经关联了系统任务。对于已经关联了系统任务的循环语句,仿真工具200将不会另行关联系统任务。
图3D示出了根据本公开实施例的又一示例性报错信息340的示意图。
如图3D所示,报错信息340可以包括循环定位信息342。
循环定位信息342可以包括循环语句(例如,外层循环322或内层循环326)的至少一个循环变量的当前值(例如,变量“i”的当前值或变量“j”的当前值)。在运行循环语句(例如,外层循环322或内层循环326)的时候,系统任务(例如,系统任务324或系统任务328)可以查找与循环语句在内存中最临近的至少一个循环变量的当前值,并将其保存于栈区中。例如,在运行循环语句(例如,外层循环322或内层循环326)时,对于外层循环322,系统任务324可以在程序320出现错误代码后查找与外层循环322在内存中最临近的变量“i”的当前值,也就是说查找当前运行的程序320处于外层循环322的第几层循环,该当前值可以是“i=5”,然后将其保存于栈区中。类似地,系统任务328可以查找到与内层循环326在内存中最临近的变量“j”的当前值,例如“j=4”,并将其保存于栈区中。
在一些实施例中,报错信息340还可以包括错误信息344,用于指示具体错误函数和错误的行号。如图3D所示,错误信息344可以包括错误代码关联的函数信息(例如,图3D的“in function certain_func()”)和错误代码的行号(例如,图3D的“line 4”)。错误代码关联的函数信息和错误代码的行号可以被称为错误信息344。
例如,对于图3C的程序320而言,由于其还可以包括断言语句330,而断言语句330在程序320中出现错误代码后生成报错信息310,为了在调试程序320时能够统一获取关于错误代码的全部定位信息,本公开还可以利用例如断言语句330将运行错误的代码的错误信息344存到栈区中。
在一些实施例中,断言语句330可以包括第一分支和第二分支,其中,第一分支表示当断言语句330不满足执行条件“TERM”时,对错误代码进行报错,例如,执行条件“TERM”为“a>b”,当“a≤b”时,则断言语句330不满足执行条件,对错误代码进行报错;第二分支表示当断言语句330满足执行条件“TERM”时,继续执行程序320,例如,执行条件“TERM”为“a>b”,当“a>b”时,则断言语句330满足执行条件,继续执行程序320。为了获取错误代码的错误信息344,仿真工具200可以将系统任务“$stack()”关联到断言语句330的第一分支。利用系统任务“$stack()”可以确定与运行错误的代码关联的函数信息(例如,“certain_func(datain)”)以及运行错误的代码的行号(例如,“line 1”、“line 2”、“line 3”或“line4”),之后将函数信息以及行号作为错误信息344保存到栈区中。
其中,函数信息可以包括运行错误的代码所属的第一函数,以及第一函数所属的第二函数。例如,查找到的函数信息可以是函数“certain_func()”,而当函数“certain_func()”是在另一个函数“parent_func()”中调用的函数,那么需要进一步向上查找到该函数“parent_func()”。也就是说,函数信息可以包括错误代码所属函数的父函数。需要说明的是,在运行断言语句330的时候,系统任务“$stack()”可以逐级向上查找错误代码所属函数的父函数,直到系统任务“$stack()”查找到时序逻辑电路或组合逻辑电路的敏感事件。敏感事件可以是程序320所表示的电路的触发信号。因此,通过向上查找敏感事件可以找到该电路的顶层函数。然后,将查找到的函数信息以及错误代码的行号保存到栈区中。
对于图3C的程序320而言,在分别利用系统任务324、系统任务328和系统任务“$stack()”获取了变量“i”的当前值、变量“j”的当前值、函数信息以及错误代码的行号后,仿真工具200可以在栈区当中依次保存外层循环322的变量“i”的当前值、内层循环326的变量“j”的当前值、函数信息以及错误代码的行号。例如,栈区可以包括多个信息块slot1、slot2和slot3,并且仿真工具200可以依次在信息块“slot1”中保存外层循环322的变量“i”的当前值、在信息块“slot2”中保存内层循环326的变量“j”的当前值、在信息块“slot3”中保存函数信息以及错误代码的行号作为错误信息344。这样,仿真工具200在仿真程序320时,一旦遇到断言语句330报错,仿真工具200可以运行断言语句330的第一分支,以例如后进先出(LIFO)的方式从栈区中依次读取错误信息344、变量“j”的当前值和变量“i”的当前值,从而获得错误信息344和循环定位信息342,之后根据错误信息344和循环定位信息342精准地定位错误代码的位置并对程序320进行调试。
图4示出了本公开实施例所提供的一种用于调试程序的示例性方法的流程示意图。
本公开实施例提供的一种用于调试程序的方法400。该方法400可以由图1A所示的电子设备100执行。例如,方法400可以由在电子设备100上运行的仿真工具200执行。该程序可以是例如图3C的程序320,并且其代码可以包括多个语句。该方法400可以包括以下步骤。
在步骤402,仿真工具200可以分析所述程序(例如,图3C的程序320)的代码以在所述多个语句中检测循环语句(例如,图3C的外层循环322或内层循环326)。
在一些实施例中,其中,所述程序可以是逻辑系统设计。
在步骤404,响应于检测到所述循环语句,仿真工具200可以将第一系统任务(例如,图3C的系统任务324或系统任务328)关联到所述循环语句。所述第一系统任务可以被配置为在被运行时将所述循环语句的循环定位信息(例如,图3D的循环定位信息342)保存于内存中的栈区。
在一些实施例中,所述循环定位信息可以包括所述循环语句的至少一个循环变量的当前值(例如,图3C的变量“i”的当前值或变量“j”的当前值)。所述第一系统任务可以被进一步配置为:在运行所述循环语句时,查找与所述循环语句在内存中最临近的所述至少一个循环变量的当前值;以及将所述至少一个循环变量的当前值保存于所述栈区。
在一些实施例中,所述程序的代码还可以包括断言语句(例如,图3C的断言语句330),并且所述方法可以进一步包括:仿真工具200可以在所述多个语句中检测所述断言语句;以及响应于检测到所述断言语句,仿真工具200可以将第二系统任务(例如,系统任务“$stack()”)关联到所述断言语句。所述第二系统任务可以被配置为在被运行时将运行错误的代码的错误信息(例如,图3D的错误信息344)保存到所述栈区。
在一些实施例中,所述断言语句可以包括第一分支和第二分支。所述第二系统任务可以被关联到所述断言语句的第一分支,并且可以被进一步配置为:确定与所述运行错误的代码关联的函数信息(例如,图3D的“in function certain_func()”)以及所述运行错误的代码的行号(例如,图3D的“line 4”);以及将所述函数信息以及行号作为所述错误信息保存到所述栈区。
在一些实施例中,所述函数信息可以包括所述运行错误的代码所属的第一函数(例如,函数“certain_func()”),以及所述第一函数所属的第二函数(例如,函数“parent_func()”)。
如上所述,程序中的循环语句可以包括多层循环。正因如此,在一些实施例中,所述循环语句可以包括内层循环(例如,图3C的内层循环326)和外层循环(例如,图3C的外层循环322)。所述至少一个循环变量可以包括与所述内层循环关联的第一变量(例如,变量“j”)和与所述外层循环关联的第二变量(例如,变量“i”),并且所述第二变量的当前值、所述第一变量的当前值和所述错误信息依次存储在所述栈区。
在步骤406,响应于运行所述程序,仿真工具200可以读取所述栈区中的所述循环定位信息用于调试所述程序。
在一些实施例中,所述方法400可以进一步包括:仿真工具200可以运行所述断言语句的第一分支;以后进先出的方式从所述栈区读取所述错误信息、所述第一变量的当前值和所述第二变量的当前值;以及提供所述错误信息、所述第一变量的当前值和所述第二变量的当前值。
本领域技术人员可以理解,尽管以上描述是基于逻辑系统的仿真程序进行的,但是本公开提供的方法和设备还可以用于调试其他类型的程序。
需要说明的是,本公开的方法可以由单个设备执行,例如一台计算机或服务器等。本实施例的方法也可以应用于分布式场景下,由多台设备相互配合来完成。在这种分布式场景的情况下,这多台设备中的一台设备可以只执行本公开的方法中的某一个或多个步骤,这多台设备相互之间会进行交互以完成所述的方法。
本公开实施例还提供存储了指令的计算机可读存储介质。该指令在被电子设备执行时用于进行上述方法。该计算机可读存储介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。
上述对本公开特定实施例进行了描述。其他实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
所属领域的普通技术人员应当理解:以上任何实施例的讨论仅为示例性的,并非旨在暗示本公开的范围(包括权利要求)被限于这些例子;在本公开的思路下,以上实施例或者不同实施例中的技术特征之间也可以进行组合,步骤可以以任意顺序实现,并存在如上所述的本公开的不同方面的许多其它变化,为了简明它们没有在细节中提供。
另外,为简化说明和讨论,并且为了不会使本公开难以理解,在所提供的附图中可以示出或可以不示出与集成电路(IC)芯片和其它部件的公知的电源/接地连接。此外,可以以框图的形式示出装置,以便避免使本公开难以理解,并且这也考虑了以下事实,即关于这些框图装置的实施方式的细节是高度取决于将要实施本公开的平台的(即,这些细节应当完全处于本领域技术人员的理解范围内)。在阐述了具体细节(例如,电路)以描述本公开的示例性实施例的情况下,对本领域技术人员来说显而易见的是,可以在没有这些具体细节的情况下或者这些具体细节有变化的情况下实施本公开。因此,这些描述应被认为是说明性的而不是限制性的。
尽管已经结合了本公开的具体实施例对本公开进行了描述,但是根据前面的描述,这些实施例的很多替换、修改和变型对本领域普通技术人员来说将是显而易见的。例如,其它存储器架构(例如,动态RAM(DRAM))可以使用所讨论的实施例。
本公开旨在涵盖落入所附权利要求的宽泛范围之内的所有这样的替换、修改和变型。因此,凡在本公开的精神和原则之内,所做的任何省略、修改、等同替换、改进等,均应包含在本公开的保护范围之内。
Claims (7)
1.一种用于调试程序的方法,其中,所述程序的代码包括多个语句,所述方法包括:
分析所述程序的代码以在所述多个语句中检测for循环语句;
响应于检测到所述for循环语句,将第一系统任务关联到所述for循环语句,所述第一系统任务被配置为在被运行时将所述for循环语句的循环定位信息保存于内存中的栈区,其中,所述循环定位信息包括所述for循环语句的至少一个循环变量的当前值,并且所述第一系统任务被进一步配置为在运行所述for循环语句时,查找与所述for循环语句在内存中最临近的所述至少一个循环变量的当前值,将所述至少一个循环变量的当前值保存于所述栈区;
所述程序的代码还包括断言语句,并且所述方法进一步包括:
在所述多个语句中检测所述断言语句;
响应于检测到所述断言语句,将第二系统任务关联到所述断言语句,所述第二系统任务被配置为在被运行时将运行错误的代码的错误信息保存到所述栈区;
所述断言语句包括第一分支和第二分支,所述第二系统任务被关联到所述断言语句的第一分支并且被进一步配置为:
确定与所述运行错误的代码关联的函数信息以及所述运行错误的代码的行号;
将所述函数信息以及行号作为所述错误信息保存到所述栈区;以及
响应于运行所述程序,读取所述栈区中的所述循环定位信息用于调试所述程序。
2.根据权利要求1所述的方法,其中,所述函数信息包括所述运行错误的代码所属的第一函数,以及所述第一函数所属的第二函数。
3.根据权利要求1所述的方法,其中,所述for循环语句包括内层循环和外层循环,所述至少一个循环变量包括与所述内层循环关联的第一变量和与所述外层循环关联的第二变量,并且所述第二变量的当前值、所述第一变量的当前值和所述错误信息依次存储在所述栈区。
4.根据权利要求3所述的方法,进一步包括:
运行所述断言语句的第一分支;
以后进先出的方式从所述栈区读取所述错误信息、所述第一变量的当前值和所述第二变量的当前值;以及
提供所述错误信息、所述第一变量的当前值和所述第二变量的当前值。
5.根据权利要求1所述的方法,其中,所述程序是逻辑系统设计。
6.一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如权利要求1至5任意一项所述的方法。
7.一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储电子装置的一组指令,该组指令用于使所述电子装置执行权利要求1至5任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110139224.0A CN112506806B (zh) | 2021-02-02 | 2021-02-02 | 用于调试程序的方法、电子设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110139224.0A CN112506806B (zh) | 2021-02-02 | 2021-02-02 | 用于调试程序的方法、电子设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112506806A CN112506806A (zh) | 2021-03-16 |
CN112506806B true CN112506806B (zh) | 2021-10-15 |
Family
ID=74952601
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110139224.0A Active CN112506806B (zh) | 2021-02-02 | 2021-02-02 | 用于调试程序的方法、电子设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112506806B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114707444B (zh) * | 2022-02-09 | 2023-04-28 | 芯华章科技股份有限公司 | 编译验证系统的方法、电子设备及存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101320401A (zh) * | 2008-07-04 | 2008-12-10 | 北京中星微电子有限公司 | 一种电子硬件芯片的获得方法和装置 |
CN105701006A (zh) * | 2014-11-28 | 2016-06-22 | 国际商业机器公司 | 用于程序调试中的变量跟踪的方法和系统 |
US9886365B2 (en) * | 2016-01-07 | 2018-02-06 | Ca, Inc. | Transactional boundaries for software system debugging |
-
2021
- 2021-02-02 CN CN202110139224.0A patent/CN112506806B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101320401A (zh) * | 2008-07-04 | 2008-12-10 | 北京中星微电子有限公司 | 一种电子硬件芯片的获得方法和装置 |
CN105701006A (zh) * | 2014-11-28 | 2016-06-22 | 国际商业机器公司 | 用于程序调试中的变量跟踪的方法和系统 |
US9886365B2 (en) * | 2016-01-07 | 2018-02-06 | Ca, Inc. | Transactional boundaries for software system debugging |
Also Published As
Publication number | Publication date |
---|---|
CN112506806A (zh) | 2021-03-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111931445B (zh) | 用于调试逻辑系统设计的方法、仿真器及存储介质 | |
US20100251220A1 (en) | Method and apparatus for dynamically instrumenting a program | |
CN112597064B (zh) | 对程序进行仿真的方法、电子设备及存储介质 | |
CN112100957B (zh) | 用于调试逻辑系统设计的方法、仿真器、存储介质 | |
CN112287569A (zh) | 用于仿真逻辑系统设计的方法、电子设备及存储介质 | |
CN115422866A (zh) | 用于在仿真器上仿真逻辑系统设计的方法及相关设备 | |
CN112506806B (zh) | 用于调试程序的方法、电子设备及存储介质 | |
CN111858290A (zh) | 用于检测目标代码的内存泄漏路径的方法和设备 | |
CN115470125B (zh) | 基于日志文件的调试方法、设备以及存储介质 | |
WO2023207973A1 (zh) | 编译器测试方法、用例生成方法、装置及指令存储结构 | |
CN112434478A (zh) | 仿真逻辑系统设计的虚拟接口的方法及相关设备 | |
CN115827568B (zh) | 获取逻辑系统设计的数据的方法、电子设备和存储介质 | |
CN115827636A (zh) | 存储及从波形数据库读取逻辑系统设计的仿真数据的方法 | |
CN115964237A (zh) | 一种针对中央处理器cpu的功能及性能测试方法及装置 | |
EP4258121A1 (en) | Program detection method and device | |
CN114239445A (zh) | 一种信号采集方法及芯片验证平台 | |
CN112989736B (zh) | 用于检测修改设计的错误实例的方法、设备及存储介质 | |
CN114328062A (zh) | 校验缓存一致性的方法、装置和存储介质 | |
CN112131806A (zh) | 验证设计的编译方法、电子设备及存储介质 | |
US10783293B2 (en) | Circuit design system, checking method, and non-transitory computer readable medium thereof | |
CN116861829B (zh) | 用于定位逻辑系统设计中错误的方法、电子设备 | |
CN113065302B (zh) | 用于仿真逻辑系统设计的方法、仿真器及可读存储介质 | |
CN117172168B (zh) | 在仿真中实现回调的方法、电子设备和存储介质 | |
CN117172203A (zh) | 处理脚本命令的方法、电子设备和存储介质 | |
CN115658242B (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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |