CN112860473A - 程序运行错误时定位源代码的方法、装置及计算设备 - Google Patents

程序运行错误时定位源代码的方法、装置及计算设备 Download PDF

Info

Publication number
CN112860473A
CN112860473A CN202110456935.0A CN202110456935A CN112860473A CN 112860473 A CN112860473 A CN 112860473A CN 202110456935 A CN202110456935 A CN 202110456935A CN 112860473 A CN112860473 A CN 112860473A
Authority
CN
China
Prior art keywords
function
name
error
instruction
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.)
Granted
Application number
CN202110456935.0A
Other languages
English (en)
Other versions
CN112860473B (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.)
Wuhan Deepin Technology Co ltd
Original Assignee
Wuhan Deepin 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 Wuhan Deepin Technology Co ltd filed Critical Wuhan Deepin Technology Co ltd
Priority to CN202110701031.XA priority Critical patent/CN113342563A/zh
Priority to CN202110456935.0A priority patent/CN112860473B/zh
Publication of CN112860473A publication Critical patent/CN112860473A/zh
Application granted granted Critical
Publication of CN112860473B publication Critical patent/CN112860473B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
    • G06F11/079Root cause analysis, i.e. error or fault diagnosis

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Health & Medical Sciences (AREA)
  • Biomedical Technology (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明公开了一种程序运行错误时定位源代码的方法,在精简指令集计算设备中执行,该方法包括:根据程序的程序名以及从程序运行错误时对应的调用栈中获得的错误提示信息,获取出错指令的地址;根据出错指令的地址,获取出错指令所在函数的混名函数名以及出错指令所对应的源代码在其源文件中的行数;若出错指令所在函数的混名函数名与出错函数的混名函数名不同,更新出错指令的地址,并重复上述混名函数名和行数的获取步骤,直至获取到的混名函数名与出错函数的混名函数名相同,将获取到的行数作为目标文件中出错源代码的行数。本发明一并公开了相应的装置、计算设备及可读存储介质。本发明定位源代码的方法能够快速准确定位出源代码中出错的位置。

Description

程序运行错误时定位源代码的方法、装置及计算设备
技术领域
本发明涉及计算机领域,尤其涉及一种程序运行错误时定位源代码的方法、装置、计算设备及可读存储介质。
背景技术
计算机程序是由编译器等软件将开发人员编写的源代码编译成包含二进制指令的可执行程序得到的。开发人员在编写源代码时大多会使用C、C++等语言。当在编写C或C++程序时,开发者一般会调用开发库(例如由C或者C++语言开发的glibc、stdc++等)中的一些函数来实现某些功能,如字符串处理、文件处理等,有时还会使用到第三方库中的宏。其中,使用宏形成的调用栈与调用函数形成的调用栈有所不同。
例如,当源代码文件a.cpp中的函数f1调用开发库中x.cpp文件中的函数f2后,程序的当前调用栈为f2函数,对应的源码文件为x.cpp,调用者为f1函数。但是当源代码文件a.cpp中的函数f1使用开发库中y.cpp文件中的宏m1后,程序的当前调用栈仍在函数f1中,只不过对应的源代码文件还为开发库中的y.cpp。
这样,如果程序在运行宏代码m1的时候崩溃,虽然调用栈显示出错的是函数f1,但根据调用栈中的指令地址定位到的却是开发库中的源代码文件y.cpp。也就是说,如果程序在运行宏代码m1的时候出现错误,基于调用栈中的指令地址已无法定位到函数f1中的出错的源代码。
在这种情况下,基于目前的现有技术只能尝试在源代码程序中加入断点,通过单步执行的方式来重现问题,进而找出源代码文件中出错的源代码。显然这种方法耗时费力、成本高。并且,对于那些概率性的程序错误,由于其难以重现,因此根本无法找出本程序源代码文件中的出错位置。
发明内容
为此,本发明提供了一种程序运行错误时定位源代码的方法、装置、计算设备及可读存储介质,以力图解决或者至少缓解上面存在的问题。
根据本发明的一个方面,提供一种程序运行错误时定位源代码的方法,适于在精简指令集计算设备中执行,该方法包括:根据程序的程序名以及从程序运行错误时对应的调用栈中获得的错误提示信息,获取出错指令的地址,错误提示信息包括出错函数的函数名和出错指令的偏移量,出错指令的偏移量为出错指令的地址相对于出错函数的地址的偏移量;根据出错指令的地址,获取出错指令所在函数的混名函数名以及出错指令所对应的源代码在其源文件中的行数,出错指令所在函数的混名函数名为出错指令所在函数的函数名混名后的名称;若出错指令所在函数的混名函数名与出错函数的混名函数名不同,更新出错指令的地址,并重复上述混名函数名和行数的获取步骤,直至获取到的混名函数名与出错函数的混名函数名相同,将获取到的行数作为目标文件中出错源代码的行数,目标文件为程序所对应的源文件。
可选地,在根据本发明的程序运行错误时定位源代码的方法中,在更新出错指令的地址的步骤中,通过将出错指令的地址减去预设值来更新出错指令的地址,预设值为一个指令所占的字节数。
可选地,在根据本发明的程序运行错误时定位源代码的方法中,根据程序的程序名以及从程序运行错误时对应的调用栈中获得的错误提示信息,获取出错指令的地址的步骤,包括:根据程序的程序名以及出错函数的函数名,获取出错函数的地址;根据出错函数的地址以及出错指令的偏移量,获取出错指令的地址。
可选地,在根据本发明的程序运行错误时定位源代码的方法中,根据程序的程序名以及出错函数的函数名,获取出错函数的地址的步骤,包括:根据程序的程序名以及出错函数的函数名,获取目标混名函数名以及目标混名函数名对应的函数的地址,目标混名函数名为含有函数名的混名函数名;根据目标混名函数名,获取目标混名函数名对应的函数的函数签名;若目标混名函数名对应的函数的函数签名与出错函数的函数签名相同,将目标混名函数名对应的函数的地址作为出错函数的地址。
可选地,在根据本发明的程序运行错误时定位源代码的方法中,根据程序的程序名以及出错函数的函数名,获取目标混名函数名以及目标混名函数名对应的函数的地址的步骤,包括:根据程序的程序名,获取可执行文件中的符号表;根据出错函数的函数名,从符号表中获取目标混名函数名以及目标混名函数名对应的函数的地址。
可选地,在根据本发明的程序运行错误时定位源代码的方法中,在根据程序的程序名,获取可执行文件中的符号表的步骤中,通过解析文件工具来获取可执行文件中的符号表,解析文件工具适用于根据输入的程序名来将可执行文件中的符号表打印出来。
可选地,在根据本发明的程序运行错误时定位源代码的方法中,在根据出错函数的函数名,从符号表中获取目标混名函数名以及目标混名函数名对应的函数的地址步骤中,通过查找字符串工具来从符号表中获取目标混名函数名以及目标混名函数名对应的函数的地址,查找字符串工具适用于根据输入的字符串来将符号表中含有输入的字符串的行打印出来。
可选地,在根据本发明的程序运行错误时定位源代码的方法中,在根据目标混名函数名,获取目标混名函数名对应的函数的函数签名的步骤中,通过反混名工具来获取目标混名函数名对应的函数的函数签名,反混名工具适用于根据函数的混名函数名来输出函数的函数签名。
可选地,在根据本发明的程序运行错误时定位源代码的方法中,在根据出错指令的地址,获取出错指令所在函数的混名函数名以及出错指令所对应的源代码在其源文件中的行数的步骤中,通过地址定位工具来获取出错指令所在函数的混名函数名以及出错指令所对应的源代码在其源文件中的行数,地址定位工具适用于将指令的地址转换成指令所在函数的混名函数名以及指令所对应的源代码在其源文件中的行数。
根据本发明的又一个方面,提供一种程序运行错误时定位源代码的装置,驻留在精简指令集计算设备中,该装置包括:第一获取模块,适于根据程序的程序名以及从程序运行错误时对应的调用栈中获得的错误提示信息,获取出错指令的地址,错误提示信息包括出错函数的函数名和出错指令的偏移量,出错指令的偏移量为出错指令的地址相对于出错函数的地址的偏移量;第二获取模块,适于根据出错指令的地址,获取出错指令所在函数的混名函数名以及出错指令所对应的源代码在其源文件中的行数,出错指令所在函数的混名函数名为出错指令所在函数的函数名混名后的名称;更新模块,适于若出错指令所在函数的混名函数名与出错函数的混名函数名不同,更新出错指令的地址,并重复第二获取模块的执行动作,直至获取到的混名函数名与出错函数的混名函数名相同,将获取到的行数作为目标文件中出错源代码的行数,目标文件为程序所对应的源文件。
根据本发明的又一个方面,提供一种计算设备,包括:至少一个处理器;以及存储器,存储有程序指令,其中,程序指令被配置为适于由至少一个处理器执行,程序指令包括用于执行根据本发明的程序运行错误时定位源代码的方法的指令。
根据本发明的又一个方面,提供一种存储有程序指令的可读存储介质,当程序指令被计算设备读取并执行时,使得计算设备执行根据本发明的程序运行错误时定位源代码的方法。
根据本发明的程序运行错误时定位源代码的方法,首先根据程序的程序名以及从程序运行错误时对应的调用栈中获得的错误提示信息,获取出错指令的地址。然后,根据出错指令的地址,获取出错指令所在函数的混名函数名以及出错指令所对应的源代码在其源文件中的行数。若出错指令所在函数的混名函数名与出错函数的混名函数名不同,则更新出错指令的地址,并重复上述混名函数名和行数的获取步骤,直至获取到的混名函数名与出错函数的混名函数名相同,将获取到的行数作为程序所对应的源文件中出错源代码的行数。可见,基于本发明中的反向指令查找法,即使程序运行错误时其正在运行的是开发库中的某个宏,也能够快速准确定位出本程序源代码文件中出错代码的行数,从而可以帮助开发人员快速修复软件缺陷。
附图说明
为了实现上述以及相关目的,本文结合下面的描述和附图来描述某些说明性方面,这些方面指示了可以实践本文所公开的原理的各种方式,并且所有方面及其等效方面旨在落入所要求保护的主题的范围内。通过结合附图阅读下面的详细描述,本公开的上述以及其它目的、特征和优势将变得更加明显。遍及本公开,相同的附图标记通常指代相同的部件或元素。
图1示出了根据本发明一个实施例的计算设备100 的结构框图;
图2示出了根据本发明一个实施例的程序运行错误时定位源代码的方法200 的流程图;
图3 示出了根据本发明一个实施例的程序运行错误时定位源代码的装置300 的结构图。
具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
程序崩溃(即程序运行错误)时,其调用栈会显示该程序的错误提示信息,开发者基于该提示信息来定位本程序源代码文件中出错代码的位置。如下示出了一个程序崩溃时的调用栈。
(()+0x145882c) [0x2000245882c]
(()+0x19890) [0x2000b987890]
(RedShop::ExTable::reshuffle(KeyValueStore*,
std::shared_ptr<KeyValueStore::TransImpl>)+0x2df0) [0x2000229da60]
(RedShop::_txc_write_nodes(RedShop::TransContext*, std::shared_ptr<KeyValueStore::TransImpl>)+0x218) [0x2000229f888]
...
从该调用栈中可以获取到:此程序崩溃时其正好运行到了reshuffle函数中,出错指令的绝对地址为0x2000229da60,出错指令的地址相对于出错函数reshuffle的地址(出错函数reshuffle的首地址)的偏移量为0x2df0。
如果程序崩溃时其正在运行的是开发者自己编写的代码,则基于函数名reshuffle以及出错指令地址的偏移量可以定位到的该程序所对应的源代码文件中出错代码的行数。
然而,如果程序中的函数reshuffle使用了开发库中的某个宏,并且程序崩溃时其运行的正是开发库中的这个宏,则如前所述基于函数名reshuffle以及出错指令地址的偏移量定位到将不再是该程序所对应的源代码文件中出错代码的行数,而是开发库中的某个源代码文件中具体的行数。也就是说,如果程序是在运行开发库中的某个宏时发生的崩溃,开发人员根据调用栈中的错误提示信息,其只能得知本程序源代码中的出错函数,而无法再定位出具体的出错位置。
针对于此,本发明基于精简指令集中指令等长这一特点,提出了一种反向指令查找法。具体地,当根据出错指令的地址定位到的是开发库中的某个源代码文件中的具体行数时,基于精简指令集中一条指令的长度来更新出错指令的地址,并重新定位,直至定位到的是本程序源代码中的具体行数(即得到了本程序源代码中出错代码的行数)。可见,基于本发明中的反向指令查找法,即使程序崩溃时其正在运行的是开发库中的某个宏,也能够快速准确定位出源码程序中的出错源码文件以及相应的代码行数,从而可以帮助开发人员快速发现软件所存在的缺陷。
图1示出了根据本发明一个实施例的计算设备100的结构框图。需要说明的是,图1所示的计算设备100仅为一个示例,在实践中,用于实施本发明的程序运行错误时定位源代码的方法的计算设备可以是任意型号的设备,其硬件配置情况可以与图1所示的计算设备100相同,也可以与图1所示的计算设备100不同。实践中用于实施本发明的程序运行错误时定位源代码的方法的计算设备可以对图1所示的计算设备100的硬件组件进行增加或删减,本发明对计算设备的具体硬件配置情况不做限制。
如图1所示,在基本的配置102中,计算设备100典型地包括系统存储器106和一个或者多个处理器104。存储器总线108可以用于在处理器104和系统存储器106之间的通信。
取决于期望的配置,处理器104可以是任何类型的处理,包括但不限于:微处理器(µP)、微控制器(µC)、数字信息处理器(DSP)或者它们的任何组合。处理器104可以包括诸如一级高速缓存110和二级高速缓存112之类的一个或者多个级别的高速缓存、处理器核心114和寄存器116。示例的处理器核心114可以包括运算逻辑单元(ALU)、浮点数单元(FPU)、数字信号处理核心(DSP核心)或者它们的任何组合。示例的存储器控制器118可以与处理器104一起使用,或者在一些实现中,存储器控制器118可以是处理器104的一个内部部分。
取决于期望的配置,系统存储器106可以是任意类型的存储器,包括但不限于:易失性存储器(诸如RAM)、非易失性存储器(诸如ROM、闪存等)或者它们的任何组合。计算设备中的物理内存通常指的是易失性存储器RAM,磁盘中的数据需要加载至物理内存中才能够被处理器104读取。系统存储器106可以包括操作系统120、一个或者多个应用122以及程序数据124。在一些实施方式中,应用122可以布置为在操作系统上由一个或多个处理器104利用程序数据124执行指令。操作系统120例如可以是Linux、Windows等,其包括用于处理基本系统服务以及执行依赖于硬件的任务的程序指令。应用122包括用于实现各种用户期望的功能的程序指令,应用122例如可以是浏览器、即时通讯软件、软件开发工具(例如集成开发环境IDE、编译器等)等,但不限于此。当应用122被安装到计算设备100中时,可以向操作系统120添加驱动模块。
在计算设备100启动运行时,处理器104会从存储器106中读取操作系统120的程序指令并执行。应用122运行在操作系统120之上,利用操作系统120以及底层硬件提供的接口来实现各种用户期望的功能。当用户启动应用122时,应用122会加载至存储器106中,处理器104从存储器106中读取并执行应用122的程序指令。
计算设备100还包括储存设备132,储存设备132包括可移除储存器136和不可移除储存器138,可移除储存器136和不可移除储存器138均与储存接口总线134连接。
计算设备100还可以包括有助于从各种接口设备(例如,输出设备142、外设接口144和通信设备146)到基本配置102经由总线/接口控制器130的通信的接口总线140。示例的输出设备142包括图形处理单元148和音频处理单元150。它们可以被配置为有助于经由一个或者多个A/V端口152与诸如显示器或者扬声器之类的各种外部设备进行通信。示例外设接口144可以包括串行接口控制器154和并行接口控制器156,它们可以被配置为有助于经由一个或者多个I/O端口158和诸如输入设备(例如,键盘、鼠标、笔、语音输入设备、触摸输入设备)或者其他外设(例如打印机、扫描仪等)之类的外部设备进行通信。示例的通信设备146可以包括网络控制器160,其可以被布置为便于经由一个或者多个通信端口164与一个或者多个其他计算设备162通过网络通信链路的通信。
网络通信链路可以是通信介质的一个示例。通信介质通常可以体现为在诸如载波或者其他传输机制之类的调制数据信号中的计算机可读指令、数据结构、程序模块,并且可以包括任何信息递送介质。“调制数据信号”可以这样的信号,它的数据集中的一个或者多个或者它的改变可以在信号中编码信息的方式进行。作为非限制性的示例,通信介质可以包括诸如有线网络或者专线网络之类的有线介质,以及诸如声音、射频(RF)、微波、红外(IR)或者其它无线介质在内的各种无线介质。这里使用的术语计算机可读介质可以包括存储介质和通信介质二者。
在根据本发明的计算设备100中,应用122包括用于执行本发明的程序运行错误时定位源代码的方法200的指令,该指令可以指示处理器104执行本发明的程序运行错误时定位源代码的方法。本领域技术人员可以理解,除了用于执行程序运行错误时定位源代码的方法200的指令之外,应用122还可以包括用于实现其他功能的其他应用126。
图2示出了根据本发明一个实施例的程序运行错误时定位源代码的方法200的流程图,方法200适于在精简指令集计算设备(例如图1所示的计算设备100)中执行。其中,精简指令集计算设备中指令集的主要特征之一是每个指令的长度都一样。当前世界上使用RISC的主流处理器包括ARM、MIPS、RISC-V等处理器,它们的指令长度都是四个字节。
如图2所示,本发明的程序运行错误时定位源代码的方法200始于步骤S210。在步骤S210中,根据程序的程序名以及从程序运行错误时对应的调用栈中获得的错误提示信息,获取出错指令的地址。其中,错误提示信息包括出错函数的函数名和出错指令的偏移量,出错指令的偏移量为出错指令的地址相对于出错函数的地址的偏移量。以上述示出的调用栈为例,从调用栈中可以获得出错函数的函数名为reshuffle,出错函数reshuffle中出错指令的地址相对于出错函数reshuffle的偏移量为0x2df0。因此,从调用栈中可以获得出错函数的函数名和出错指令的偏移量等信息。
根据本发明的一个实施例,在从调用栈中获得出错函数的函数名和出错指令的偏移量后,可以先根据崩溃程序(即运行出现错误的那个程序)的程序名以及出错函数的函数名,获取出错函数的地址。其中,出错函数的地址是指出错函数在可执行文件中的位置,即在没有随机化的情况下,按照原始地址映射到内存中的地址。还需要说明的是,此处出错函数的地址是指出错函数的首地址。根据一种实施例,可以通过如下步骤来获取出错函数的地址。
首先,根据崩溃程序的程序名以及出错函数的函数名,获取目标混名函数名以及目标混名函数名对应的函数的地址,目标混名函数名指的是含有出错函数的函数名的混名函数名。即,此步是根据崩溃程序的程序名以及出错函数的函数名,来获取崩溃程序中含有出错函数的函数名的混名函数名以及其对应的函数的地址。
具体地,根据崩溃程序的程序名,获取可执行文件中的符号表。其中,可以通过解析文件工具来获取可执行文件中的符号表。解析文件工具适用于根据输入的程序名来将可执行文件中的符号表打印出来。因此,根据崩溃程序的程序名(即可执行文件名),利用解析文件工具则可以将崩溃程序对应的执行文件中的符号表打印出来。例如,在Linux操作系统下可以利用readelf命令来获取可执行文件中的符号表。作一个示例,假设上述示出的调用栈对应的程序的程序名为EXECUTABLE,则在Linux操作系统下可以通过执行如下命令来获取可执行文件EXECUTABLE中的符号表:
readelf -s --wide EXECUTABLE
在获取到可执行文件中的符号表之后,接着根据出错函数的函数名,从符号表中获取目标混名函数名以及目标混名函数名对应的函数的地址。其中,可以通过查找字符串工具来从符号表中获取目标混名函数名以及目标混名函数名对应的函数的地址。查找字符串工具适用于根据输入的字符串来将符号表中含有输入的字符串的行打印出来。因此,根据出错函数的函数名,利用查找字符串工具则可以将符号表中含有出错函数的函数名的行打印出来,进而从中可以获取到目标混名函数名以及目标混名函数名对应的函数的地址。
例如,可以利用grep命令来从符号表中获取目标混名函数名以及目标混名函数名对应的函数的地址。以上述示出的调用栈为例,崩溃程序的程序名为EXECUTABLE,出错函数的函数名为reshuffle,则在Linux操作系统下可以通过执行如下命令来将可执行文件EXECUTABLE的符号表中含有reshuffle的行打印出来:
readelf -s --wide EXECUTABLE | grep reshuffle
作一个示例,执行上述命令后得到如下的输出:
7166: 000000000129ac70 18940 FUNC GLOBAL DEFAULT [<other>: 88] 13 _ZN7RedShop7ExTable9reshuffleEP13KeyValueStoreSt10shared_ptrINS1_9TransImplEE
其中,_ZN7RedShop7ExTable9reshuffleEP13KeyValueStoreSt10shared_ptrINS1_9TransImplEE是函数名reshuffle依照C++命名规则混名过的名称,也就是含有reshuffle的混名函数名。000000000129ac70是混名函数名_ZN7RedShop7ExTable9reshuffleEP13KeyValueStoreSt10share
d_ptrINS1_9TransImplEE对应的函数的地址。显然,通过执行上述命令readelf -s --wide EXECUTABLE | grep reshuffle可以得到含有reshuffle的混名函数名以及其所对应的函数的地址。
然后,根据目标混名函数名,获取目标混名函数名对应的函数的函数签名(即获取目标混名函数名混名前的名称)。其中,可以通过反混名工具来获取目标混名函数名对应的函数的函数签名。反混名工具适用于根据函数的混名函数名来输出函数的函数签名。例如,在C++程序中可以利用c++filt命令来进行反混名。作一个示例,以上述获得的目标混名函数名_ZN7RedShop7ExTable9reshuffleEP13KeyValueStoreSt10shared_ptrINS1_9TransImplEE为
例,可以通过执行如下命令来获取该目标混名函数名对应的函数的函数签名:
c++filt _ZN7RedShop7ExTable9reshuffleEP13KeyValueStoreSt10shared_ptrINS1_9TransImplEE
作一个示例,执行上述命令后输出的字符串为:
RedShop::ExTable::reshuffle(KeyValueStore*,std::shared_ptr<KeyValueStore::TransImpl>)
其中,RedShop::ExTable::reshuffle(KeyValueStore*, std::shared_ptr<KeyValueStore::TransImpl>)为目标混名函数名_ZN7RedShop7ExTable9reshuffleEP13KeyValueStoreSt10shared_ptrINS1_9
TransImplEE混名前的名称,即目标混名函数名对应的函数的函数签名。
最后,若目标混名函数名对应的函数的函数签名与出错函数的函数签名相同,将目标混名函数名对应的函数的地址作为出错函数的地址。这是因为如果目标混名函数名对应的函数的函数签名与出错函数的函数签名相同,则表明目标混名函数名对应的函数即为出错函数,因此目标混名函数名对应的函数的函数地址确为出错函数的地址。其中,出错函数的函数签名可以从调用栈中获得。例如,上述示出的调用栈中的(RedShop::ExTable::reshuffle(KeyValueStore*, std::shared_ptr<KeyValueStore::TransImpl>)便为出错函数reshuffle的函数签名。
以上述示出的调用栈和获得的目标混名函数名对应的函数的函数签名为例,将得到的目标混名函数名对应的函数的函数签名RedShop::ExTable::reshuffle(KeyValueStore*, std::shared_ptr<KeyValueStore::TransImpl>)与调用栈中的函数签名(RedShop::ExTable::reshuffle(KeyValueStore*, std::shared_ptr<KeyValueStore::TransImpl>)进行比对,发现二者相同,则表明目标混名函数名对应的函数确为出错函数reshuffle,因此出错函数reshuffle的地址为000000000129ac70。
在获取到出错函数的地址之后,再根据出错函数的地址以及从调用栈中获得的出错指令的偏移量,来获取出错函数中出错指令的地址。具体地,将出错函数的地址与出错指令的偏移量进行相加,得到的地址便为出错指令的地址。继续以上述示出的调用栈为例,出错函数的地址为0x000000000129ac70,出错指令的偏移量为0x2df0,则可以通过执行如下命令来获取出错函数中出错指令的地址:
python -c "print hex(0x000000000129ac70+0x2df0)"
执行上述命令后,得到结果0x129da60,即出错函数的地址为0x129da60。
随后进入步骤 S220,根据出错指令的地址,获取出错指令所在函数的混名函数名以及出错指令所对应的源代码在其源文件中的行数,出错指令所在函数的混名函数名为出错指令所在函数的函数名混名后的名称。
其中,可以通过地址定位工具来获取出错指令所在函数的混名函数名以及出错指令所对应的源代码在其源文件中的行数。地址定位工具适用于将指令的地址转换成指令所在函数的混名函数名以及指令所对应的源代码在其源文件中的行数。例如,可以使用addr2line命令来获取出错指令所在函数的混名函数名以及出错指令所对应的源代码的位置。作一个示例,以上述获得的出错指令的地址为例,可以通过执行如下命令来获取出错指令所在函数的混名函数名和出错指令所对应的源代码在其源文件中的行数:
addr2line -af 0x129da60 -e EXECUTABLE
作一个示例,执行上述命令后得到如下的输出:
0x000000000129da60
_ZNSt13__atomic_baseIiEppEv
/usr/include/c++/x.y/bits/atomic_base.h:296
其中,输出的第一行为出错指令的地址,第二行为出错指令所在函数的混名函数名,第三行为出错指令对应的源代码所在的源文件的文件名以及出错指令对应的源代码在其源文件中的行数。可见,通过执行上述命令addr2line -af 0x129da60 -e EXECUTABLE可以得到出错指令所在函数的混名函数名以及出错指令所对应的源代码在其源文件中的行数。
在得到出错指令所在函数的混名函数名之后,判断出错指令所在函数的混名函数名与出错函数的混名函数名是否相同。其中,出错函数的混名函数名为反混名后与出错函数的函数签名相同的那个目标混名函数名。
若出错指令所在函数的混名函数名与出错函数的混名函数名相同,则表明出错指令对应的源代码所在的源文件即为出错函数所在的那个源文件,也就是崩溃程序所对应的源文件,因此获取到的行数(即出错指令所对应的源代码在其源文件中的行数)便为崩溃程序所对应的源文件中出错源代码的行数。
若出错指令所在函数的混名函数名与出错函数的混名函数名不同,则进入步骤S230,更新出错指令的地址,并重复上述混名函数名和行数的获取步骤(即步骤S220),直至获取到的混名函数名与出错函数的混名函数名相同,将获取到的行数作为目标文件中出错源代码的行数,目标文件为程序所对应的源文件。
若出错指令所在函数的混名函数名与出错函数的混名函数名不同,则表明当前出错指令所对应的源代码并非开发人员编写的代码,而是开发库中的某个源文件中的源代码。这时,可以通过更新出错指令的地址来重新获取更新后的出错指令所在函数的混名函数名以及更新后的出错指令所对应的源代码在其源文件中的行数,并判断重新获取到的混名函数名与出错函数的混名函数名是否相同。重复前述的更新-获取-判断步骤,直到出错指令所在函数的混名函数名与出错函数的混名函数名相同,将最后一次获取到的行数作为崩溃程序所对应的源文件中出错代码的行数。
由于精简指令集中的指令都是等长的,因此当出错指令所在函数的混名函数名与出错函数的混名函数名不同时,可以通过将当前出错指令的地址减去一个指令所占的字节数来获取上个指令的地址。即,可以通过将出错指令的地址减去一个指令所占的字节数来更新出错指令的地址。
当前世界上使用RISC的主流处理器包括ARM、MIPS、RISC-V等处理器,它们的指令长度都是四个字节。因此,根据本发明的一个实施例,可以通过将出错指令的地址减四来更新出错指令的地址。
根据本发明的一个实施例,步骤S230的核心代码如下:
addr = 0x129da60
mangled = '_ZN7RedShop7ExTable9reshuffleEP13KeyValueStoreSt10shared_ptrINS1_9TransImplEE'
for a in range(1000):
cmd = 'addr2line -af {0} -e {1}'.format(hex(addr - a*4),EXECUTABLE)
output = execute(cmd).lines
if output[1].contains(mangled):
print output[2]
break
else:
continue
可以看到,上述程序会反复调用addr2line命令来定位当前指令地址(addr – a*4)对应的源码信息,直到addr2line命令输出的第二行包含混名后的函数名,此时将终止循环,打印源码文件与行数。不然,则继续将当前指令地址减去4,即向前回溯指令,直到最终找到。
利用本发明的程序运行错误时定位源代码的方法,只需要输入可执行文件名,出错函数的函数签名以及出错指令的偏移量,便可得到本程序源代码文件中出错代码的行数,方便快捷,成本低。为了便于理解,此处继续以上述示出的调用栈为例,并假设本发明的程序运行错误时定位源代码的方法为P,则通过执行如下命令便可获得本程序源代码文件中出错代码的行数:
P EXECUTABLE -f “RedShop::ExTable::reshuffle(KeyValueStore*,std::shared_ptr<KeyValue
Store::TransImpl>)” -o 0x2df0
图3示出了根据本发明一个实施例的程序运行错误时定位源代码的装置300的结构框图,适于驻留在精简指令集计算设备中100中。如图3所示,该定位源代码的装置300包括第一获取模块310、第二获取模块320和更新模块330。
第一获取模块310,适于根据程序的程序名以及从程序运行错误时对应的调用栈中获得的错误提示信息,获取出错指令的地址,错误提示信息包括出错函数的函数名和出错指令的偏移量,出错指令的偏移量为出错指令的地址相对于出错函数的地址的偏移量。
第二获取模块320,适于根据出错指令的地址,获取出错指令所在函数的混名函数名以及出错指令所对应的源代码在其源文件中的行数,出错指令所在函数的混名函数名为出错指令所在函数的函数名混名后的名称。
更新模块330,适于若出错指令所在函数的混名函数名与出错函数的混名函数名不同,更新出错指令的地址,并重复第二获取模块的执行动作,直至获取到的混名函数名与出错函数的混名函数名相同,将获取到的行数作为目标文件中出错源代码的行数,目标文件为程序所对应的源文件。
根据本发明的程序运行错误时定位源代码的方法,首先根据程序的程序名以及从程序运行错误时对应的调用栈中获得的错误提示信息,获取出错指令的地址。然后,根据出错指令的地址,获取出错指令所在函数的混名函数名以及出错指令所对应的源代码在其源文件中的行数。若出错指令所在函数的混名函数名与出错函数的混名函数名不同,则更新出错指令的地址,并重复上述混名函数名和行数的获取步骤,直至获取到的混名函数名与出错函数的混名函数名相同,将获取到的行数作为程序所对应的源文件中出错源代码的行数。可见,基于本发明中的反向指令查找法,即使程序运行错误时其正在运行的是开发库中的某个宏,也能够快速准确定位出源码程序中的出错源码文件以及相应的代码行数,从而可以帮助开发人员快速修复软件缺陷。
这里描述的各种技术可结合硬件或软件,或者它们的组合一起实现。从而,本发明的方法和设备,或者本发明的方法和设备的某些方面或部分可采取嵌入有形媒介,例如可移动硬盘、U盘、软盘、CD-ROM或者其它任意机器可读的存储介质中的程序代码(即指令)的形式,其中当程序被载入诸如计算机之类的机器,并被所述机器执行时,所述机器变成实践本发明的设备。
在程序代码在可编程计算机上执行的情况下,计算设备一般包括处理器、处理器可读的存储介质(包括易失性和非易失性存储器和/或存储元件),至少一个输入装置,和至少一个输出装置。其中,存储器被配置用于存储程序代码;处理器被配置用于根据该存储器中存储的所述程序代码中的指令,执行本发明的文档加载方法。
以示例而非限制的方式,可读介质包括可读存储介质和通信介质。可读存储介质存储诸如计算机可读指令、数据结构、程序模块或其它数据等信息。通信介质一般以诸如载波或其它传输机制等已调制数据信号来体现计算机可读指令、数据结构、程序模块或其它数据,并且包括任何信息传递介质。以上的任一种的组合也包括在可读介质的范围之内。
在此处所提供的说明书中,算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与本发明的示例一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下被实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
本领域那些技术人员应当理解在本文所公开的示例中的设备的模块或单元或组件可以布置在如该实施例中所描述的设备中,或者可替换地可以定位在与该示例中的设备不同的一个或多个设备中。前述示例中的模块可以组合为一个模块或者此外可以分成多个子模块。
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
此外,所述实施例中的一些在此被描述成可以由计算机系统的处理器或者由执行所述功能的其它装置实施的方法或方法元素的组合。因此,具有用于实施所述方法或方法元素的必要指令的处理器形成用于实施该方法或方法元素的装置。此外,装置实施例的在此所述的元素是如下装置的例子:该装置用于实施由为了实施该发明的目的的元素所执行的功能。
如在此所使用的那样,除非另行规定,使用序数词“第一”、“第二”、“第三”等等来描述普通对象仅仅表示涉及类似对象的不同实例,并且并不意图暗示这样被描述的对象必须具有时间上、空间上、排序方面或者以任意其它方式的给定顺序。
尽管根据有限数量的实施例描述了本发明,但是受益于上面的描述,本技术领域内的技术人员明白,在由此描述的本发明的范围内,可以设想其它实施例。此外,应当注意,本说明书中使用的语言主要是为了可读性和教导的目的而选择的,而不是为了解释或者限定本发明的主题而选择的。因此,在不偏离所附权利要求书的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。对于本发明的范围,对本发明所做的公开是说明性的,而非限制性的,本发明的范围由所附权利要求书限定。

Claims (10)

1.一种程序运行错误时定位源代码的方法,适于在精简指令集计算设备中执行,所述方法包括:
根据所述程序的程序名以及从程序运行错误时对应的调用栈中获得的错误提示信息,获取出错指令的地址,所述错误提示信息包括出错函数的函数名和出错指令的偏移量,所述出错指令的偏移量为所述出错指令的地址相对于所述出错函数的地址的偏移量;
根据所述出错指令的地址,获取所述出错指令所在函数的混名函数名以及所述出错指令所对应的源代码在其源文件中的行数,所述出错指令所在函数的混名函数名为所述出错指令所在函数的函数名混名后的名称;
若所述出错指令所在函数的混名函数名与所述出错函数的混名函数名不同,更新所述出错指令的地址,并重复上述混名函数名和行数的获取步骤,直至获取到的混名函数名与所述出错函数的混名函数名相同,将获取到的行数作为目标文件中出错源代码的行数,所述目标文件为所述程序所对应的源文件。
2.如权利要求1所述的方法,其中,在所述更新所述出错指令的地址的步骤中,通过将所述出错指令的地址减去预设值来更新所述出错指令的地址,所述预设值为一个指令所占的字节数。
3.如权利要求1或2所述的方法,其中,所述根据所述程序的程序名以及从程序运行错误时对应的调用栈中获得的错误提示信息,获取出错指令的地址的步骤,包括:
根据所述程序的程序名以及出错函数的函数名,获取所述出错函数的地址;
根据所述出错函数的地址以及出错指令的偏移量,获取所述出错指令的地址。
4.如权利要求3所述的方法,其中,所述根据所述程序的程序名以及出错函数的函数名,获取所述出错函数的地址的步骤,包括:
根据所述程序的程序名以及出错函数的函数名,获取目标混名函数名以及所述目标混名函数名对应的函数的地址,所述目标混名函数名为含有所述函数名的混名函数名;
根据所述目标混名函数名,获取所述目标混名函数名对应的函数的函数签名;
若所述目标混名函数名对应的函数的函数签名与所述出错函数的函数签名相同,将所述目标混名函数名对应的函数的地址作为所述出错函数的地址。
5.如权利要求4所述的方法,其中,所述根据所述程序的程序名以及出错函数的函数名,获取目标混名函数名以及所述目标混名函数名对应的函数的地址的步骤,包括:
根据所述程序的程序名,获取可执行文件中的符号表;
根据所述出错函数的函数名,从所述符号表中获取目标混名函数名以及所述目标混名函数名对应的函数的地址。
6.如权利要求5所述的方法,其中,在所述根据所述程序的程序名,获取可执行文件中的符号表的步骤中,通过解析文件工具来获取可执行文件中的符号表,所述解析文件工具适用于根据输入的程序名来将可执行文件中的符号表打印出来;
在所述根据所述出错函数的函数名,从所述符号表中获取目标混名函数名以及所述目标混名函数名对应的函数的地址步骤中,通过查找字符串工具来从所述符号表中获取目标混名函数名以及所述目标混名函数名对应的函数的地址,所述查找字符串工具适用于根据输入的字符串来将符号表中含有输入的字符串的行打印出来。
7.如权利要求1或2所述的方法,其中,在所述根据所述出错指令的地址,获取所述出错指令所在函数的混名函数名以及所述出错指令所对应的源代码在其源文件中的行数的步骤中,通过地址定位工具来获取所述出错指令所在函数的混名函数名以及所述出错指令所对应的源代码在其源文件中的行数,所述地址定位工具适用于将指令的地址转换成指令所在函数的混名函数名以及指令所对应的源代码在其源文件中的行数。
8.一种程序运行错误时定位源代码的装置,驻留在精简指令集计算设备中,所述装置包括:
第一获取模块,适于根据所述程序的程序名以及从程序运行错误时对应的调用栈中获得的错误提示信息,获取出错指令的地址,所述错误提示信息包括出错函数的函数名和出错指令的偏移量,所述出错指令的偏移量为所述出错指令的地址相对于所述出错函数的地址的偏移量;
第二获取模块,适于根据所述出错指令的地址,获取所述出错指令所在函数的混名函数名以及所述出错指令所对应的源代码在其源文件中的行数,所述出错指令所在函数的混名函数名为所述出错指令所在函数的函数名混名后的名称;
更新模块,适于若所述出错指令所在函数的混名函数名与所述出错函数的混名函数名不同,更新所述出错指令的地址,并重复所述第二获取模块的执行动作,直至获取到的混名函数名与所述出错函数的混名函数名相同,将获取到的行数作为目标文件中出错源代码的行数,所述目标文件为所述程序所对应的源文件。
9.一种计算设备,包括:
至少一个处理器;以及
存储器,存储有程序指令,其中,所述程序指令被配置为适于由所述至少一个处理器执行,所述程序指令包括用于执行如权利要求1-7中任一项所述方法的指令。
10.一种存储有程序指令的可读存储介质,当所述程序指令被计算设备读取并执行时,使得所述计算设备执行如权利要求1-7中任一项所述方法。
CN202110456935.0A 2021-04-27 2021-04-27 程序运行错误时定位源代码的方法、装置及计算设备 Active CN112860473B (zh)

Priority Applications (2)

Application Number Priority Date Filing Date Title
CN202110701031.XA CN113342563A (zh) 2021-04-27 2021-04-27 程序运行错误时定位源代码的方法、装置及计算设备
CN202110456935.0A CN112860473B (zh) 2021-04-27 2021-04-27 程序运行错误时定位源代码的方法、装置及计算设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202110456935.0A CN112860473B (zh) 2021-04-27 2021-04-27 程序运行错误时定位源代码的方法、装置及计算设备

Related Child Applications (1)

Application Number Title Priority Date Filing Date
CN202110701031.XA Division CN113342563A (zh) 2021-04-27 2021-04-27 程序运行错误时定位源代码的方法、装置及计算设备

Publications (2)

Publication Number Publication Date
CN112860473A true CN112860473A (zh) 2021-05-28
CN112860473B CN112860473B (zh) 2021-07-30

Family

ID=75992929

Family Applications (2)

Application Number Title Priority Date Filing Date
CN202110701031.XA Pending CN113342563A (zh) 2021-04-27 2021-04-27 程序运行错误时定位源代码的方法、装置及计算设备
CN202110456935.0A Active CN112860473B (zh) 2021-04-27 2021-04-27 程序运行错误时定位源代码的方法、装置及计算设备

Family Applications Before (1)

Application Number Title Priority Date Filing Date
CN202110701031.XA Pending CN113342563A (zh) 2021-04-27 2021-04-27 程序运行错误时定位源代码的方法、装置及计算设备

Country Status (1)

Country Link
CN (2) CN113342563A (zh)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113626308A (zh) * 2021-07-06 2021-11-09 深圳点猫科技有限公司 一种代码调试方法、装置、电子设备及存储介质
CN116521411A (zh) * 2023-03-27 2023-08-01 广东保伦电子股份有限公司 一种检测嵌入式设备程序错误并复位的方法、设备及介质
CN117555720A (zh) * 2024-01-11 2024-02-13 腾讯科技(深圳)有限公司 代码修复方法、装置、设备及介质

Citations (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1704908A (zh) * 2004-05-26 2005-12-07 华为技术有限公司 定位程序异常的方法
CN101211309A (zh) * 2006-12-29 2008-07-02 中兴通讯股份有限公司 嵌入式系统中进程异常跟踪定位的方法
US20080244322A1 (en) * 2007-03-27 2008-10-02 Tim Kelso Program Test System
CN101340314A (zh) * 2008-08-11 2009-01-07 中兴通讯股份有限公司 一种嵌入式系统的实时调试定位方法及其装置
CN101539883A (zh) * 2009-05-05 2009-09-23 北京和利时系统工程有限公司 嵌入式系统的错误追踪方法和装置
US20120144371A1 (en) * 2010-12-01 2012-06-07 Ncr Corporation Using exception information
JP2016167180A (ja) * 2015-03-10 2016-09-15 日本電気株式会社 デバッグ支援装置、デバッグ支援システム、デバッグ支援方法、および、デバッグ支援プログラム
CN106201892A (zh) * 2016-07-20 2016-12-07 中国航空工业集团公司航空动力控制系统研究所 用于嵌入式软件的异常中断源定位检测方法
CN110764945A (zh) * 2019-10-23 2020-02-07 北京博睿宏远数据科技股份有限公司 一种崩溃日志处理方法、装置、设备和存储介质
CN112256570A (zh) * 2020-10-19 2021-01-22 网易(杭州)网络有限公司 远程调试方法、装置、设备及存储介质

Patent Citations (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1704908A (zh) * 2004-05-26 2005-12-07 华为技术有限公司 定位程序异常的方法
CN101211309A (zh) * 2006-12-29 2008-07-02 中兴通讯股份有限公司 嵌入式系统中进程异常跟踪定位的方法
US20080244322A1 (en) * 2007-03-27 2008-10-02 Tim Kelso Program Test System
CN101340314A (zh) * 2008-08-11 2009-01-07 中兴通讯股份有限公司 一种嵌入式系统的实时调试定位方法及其装置
CN101539883A (zh) * 2009-05-05 2009-09-23 北京和利时系统工程有限公司 嵌入式系统的错误追踪方法和装置
US20120144371A1 (en) * 2010-12-01 2012-06-07 Ncr Corporation Using exception information
JP2016167180A (ja) * 2015-03-10 2016-09-15 日本電気株式会社 デバッグ支援装置、デバッグ支援システム、デバッグ支援方法、および、デバッグ支援プログラム
CN106201892A (zh) * 2016-07-20 2016-12-07 中国航空工业集团公司航空动力控制系统研究所 用于嵌入式软件的异常中断源定位检测方法
CN110764945A (zh) * 2019-10-23 2020-02-07 北京博睿宏远数据科技股份有限公司 一种崩溃日志处理方法、装置、设备和存储介质
CN112256570A (zh) * 2020-10-19 2021-01-22 网易(杭州)网络有限公司 远程调试方法、装置、设备及存储介质

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
MOZUN1: "无core文件时应用addr2line定位死机位置", 《HTTPS://BLOG.CSDN.NET/MOZUN1/ARTICLE/DETAILS/53064650》 *

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113626308A (zh) * 2021-07-06 2021-11-09 深圳点猫科技有限公司 一种代码调试方法、装置、电子设备及存储介质
CN116521411A (zh) * 2023-03-27 2023-08-01 广东保伦电子股份有限公司 一种检测嵌入式设备程序错误并复位的方法、设备及介质
CN116521411B (zh) * 2023-03-27 2023-11-17 广东保伦电子股份有限公司 一种检测嵌入式设备程序错误并复位的方法、设备及介质
CN117555720A (zh) * 2024-01-11 2024-02-13 腾讯科技(深圳)有限公司 代码修复方法、装置、设备及介质
CN117555720B (zh) * 2024-01-11 2024-04-26 腾讯科技(深圳)有限公司 代码修复方法、装置、设备及介质

Also Published As

Publication number Publication date
CN113342563A (zh) 2021-09-03
CN112860473B (zh) 2021-07-30

Similar Documents

Publication Publication Date Title
CN112860473B (zh) 程序运行错误时定位源代码的方法、装置及计算设备
CN111290952A (zh) 一种动态链接库函数的跟踪方法及装置
JP2000347872A (ja) 例外を正規制御フローとして処理する方法及び装置
CN112379888A (zh) 一种代码变更分析方法
CN113885936A (zh) 一种定制镜像中软件包依赖的解决方法
WO2022156277A1 (zh) 一种应用程序安装方法、装置、计算设备及可读存储介质
CN114003289A (zh) 一种应用程序运行方法、计算设备及存储介质
CN113204385A (zh) 一种插件加载方法、装置、计算设备及可读存储介质
CN113805971B (zh) 一种应用程序运行方法、计算设备及存储介质
CN114780173B (zh) 一种在应用中加载插件的方法、计算设备及存储介质
CN113821272B (zh) 一种应用程序运行方法、计算设备及存储介质
CN114428642A (zh) 一种基于新型处理器架构的随机指令生成环境
CN114546441A (zh) 一种dsp与cpu通信方式的动态设定方法
CN113254347A (zh) 一种日志函数添加方法、计算设备及储存介质
CN114168489B (zh) 一种函数信息获取方法、计算设备及存储介质
CN113238760B (zh) 一种软件迁移方法、装置、计算设备及可读存储介质
CN111984451A (zh) 表格数据的纠错方法、系统、设备及存储介质
CN113835927B (zh) 一种指令执行方法、计算设备及存储介质
CN114328273B (zh) 一种应用程序控件的调试方法、调试装置及计算设备
CN113821273B (zh) 一种应用程序运行方法、计算设备及存储介质
JP5067705B2 (ja) 異常系テスト支援装置、異常系テスト支援方法、及びプログラム
CN112527660B (zh) 代码的静态检测方法和装置
CN113238760A (zh) 一种软件迁移方法、装置、计算设备及可读存储介质
CN114003282A (zh) 一种基于全局锁的指令执行方法、计算设备及存储介质
WO2021149113A1 (ja) プロセッサ、シミュレータプログラム、アセンブラプログラム、及び情報処理プログラム

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