CN117806859A - 线程堆栈信息获取方法、装置、电子设备及存储介质 - Google Patents

线程堆栈信息获取方法、装置、电子设备及存储介质 Download PDF

Info

Publication number
CN117806859A
CN117806859A CN202311569218.4A CN202311569218A CN117806859A CN 117806859 A CN117806859 A CN 117806859A CN 202311569218 A CN202311569218 A CN 202311569218A CN 117806859 A CN117806859 A CN 117806859A
Authority
CN
China
Prior art keywords
thread
stack information
target program
threads
target
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
CN202311569218.4A
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.)
Apollo Intelligent Connectivity Beijing Technology Co Ltd
Original Assignee
Apollo Intelligent Connectivity Beijing 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 Apollo Intelligent Connectivity Beijing Technology Co Ltd filed Critical Apollo Intelligent Connectivity Beijing Technology Co Ltd
Priority to CN202311569218.4A priority Critical patent/CN117806859A/zh
Publication of CN117806859A publication Critical patent/CN117806859A/zh
Pending legal-status Critical Current

Links

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
    • 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/445Program loading or initiating
    • G06F9/44521Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading

Landscapes

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

Abstract

本公开提供了线程堆栈信息获取方法、装置、电子设备及存储介质。本公开涉及计算机技术领域,尤其涉及数据分析和自动驾驶等技术领域。具体方案为:响应于目标程序的第一线程接收到操作系统发出的第一信号,获取第一线程的第一堆栈信息以及目标程序的至少部分第二线程各自对应的第二堆栈信息;其中,第二线程是在操作系统发出第一信号时除第一线程之外存活的线程;基于第一线程的第一堆栈信息和至少部分第二线程各自对应的第二堆栈信息,生成目标程序的目标堆栈信息。根据本公开的方案,能够在目标程序崩溃时获取目标程序的目标堆栈信息,便于基于目标堆栈信息快速确定目标程序的崩溃代码位置,从而提高排查目标程序异常问题的效率。

Description

线程堆栈信息获取方法、装置、电子设备及存储介质
技术领域
本公开涉及计算机技术领域,尤其涉及数据分析和自动驾驶等技术领域。
背景技术
在自动驾驶领域中,软件在操作系统中运行时,经常会出现异常进而导致程序崩溃,为了快速定位崩溃代码位置,通常需要获取崩溃函数(崩溃线程)的堆栈信息。但是,一些情况下,堆栈信息所指示的崩溃函数可能不是造成程序崩溃的直接原因。对于此类情况,如何快速定位真正崩溃代码位置,对于排查程序的异常问题具有重要意义。
发明内容
本公开提供了一种线程堆栈信息获取方法、装置、电子设备及存储介质。
根据本公开的第一方面,提供了一种线程堆栈信息获取方法,包括:
响应于目标程序的第一线程接收到操作系统发出的第一信号,获取第一线程的第一堆栈信息以及目标程序的至少部分第二线程各自对应的第二堆栈信息;其中,第二线程是在操作系统发出第一信号时除第一线程之外存活的线程;
基于第一线程的第一堆栈信息和至少部分第二线程各自对应的第二堆栈信息,生成目标程序的目标堆栈信息。
根据本公开的第二方面,提供了一种线程堆栈信息获取装置,包括:
第一获取模块,用于响应于目标程序的第一线程接收到操作系统发出的第一信号,获取第一线程的第一堆栈信息以及目标程序的至少部分第二线程各自对应的第二堆栈信息;其中,第二线程是在操作系统发出第一信号时除第一线程之外存活的线程;
生成模块,用于基于第一线程的第一堆栈信息和至少部分第二线程各自对应的第二堆栈信息,生成目标程序的目标堆栈信息。
根据本公开的第三方面,提供了一种电子设备,包括:
至少一个处理器;
与至少一个处理器通信连接的存储器;
存储器存储有可以被至少一个处理器执行的指令,指令被至少一个处理器执行,以使至少一个处理器能够执行本公开中任一实施例的方法。
根据本公开的第四方面,提供了一种存储有计算机指令的非瞬时计算机可读存储介质,其中,计算机指令用于使计算机执行根据本公开中任一实施例的方法。
根据本公开的第五方面,提供了一种计算机程序产品,包括存储在存储介质上的计算机程序,计算机程序在被处理器执行时实现根据本公开中任一实施例的方法。
根据本公开的第六方面,提供了一种自动驾驶车辆,包括如第三方面所述的电子设备。
根据本公开的方案,能够在目标程序崩溃时获取目标程序的目标堆栈信息,便于基于目标堆栈信息快速确定目标程序的崩溃代码位置,从而提高排查目标程序异常问题的效率。
上述概述仅仅是为了说明书的目的,并不意图以任何方式进行限制。除上述描述的示意性的方面、实施方式和特征之外,通过参考附图和以下的详细描述,本申请进一步的方面、实施方式和特征将会是容易明白的。
附图说明
在附图中,除非另外规定,否则贯穿多个附图相同的附图标记表示相同或相似的部件或元素。这些附图不一定是按照比例绘制的。应该理解,这些附图仅描绘了根据本申请公开的一些实施方式,而不应将其视为是对本申请范围的限制。
图1是根据本公开实施例的线程堆栈信息获取方法的流程示意图;
图2是根据本公开实施例的线程堆栈信息获取的架构示意图;
图3是根据本公开实施例的第一动态链接库、第二动态链接库与目标程序的关系示意图;
图4是根据本公开实施例的线程堆栈信息获取装置的结构示意图;
图5是根据本公开实施例的线程堆栈信息获取方法的场景示意图;
图6是用来实现本公开实施例的线程堆栈信息获取方法的电子设备的结构示意图。
具体实施方式
以下结合附图对本公开的示范性实施例做出说明,其中包括本公开实施例的各种细节以助于理解,应当将它们认为仅仅是示范性的。因此,本领域普通技术人员应当认识到,可以对这里描述的实施例做出各种改变和修改,而不会背离本公开的范围。同样,为了清楚和简明,以下的描述中省略了对公知功能和结构的描述。
本公开的说明书实施例和权利要求书及上述附图中的术语“第一”、“第二”和“第三”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元。方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
在对本公开实施例的技术方案进行介绍之前,先对本公开可能使用到的技术术语做进一步说明:
核心转储(core dump):是操作系统在进程收到某些信号而终止运行时,将此时进程地址空间的内容以及有关进程状态的其他信息写出的一个磁盘文件。
堆栈(stack):是一种运算受限的线性表。
相关技术中,当程序运行过程中,经常会出现异常导致程序崩溃,为了快速定位崩溃代码位置,通常需要获取崩溃函数的堆栈信息,而有些情况下,堆栈信息所指示的当前崩溃函数可能并非是造成程序崩溃的直接原因,此种情况下,如何快速获取整个程序所有线程在崩溃时的堆栈信息,对定位真正崩溃代码位置有很重要的作用,对于排查一些异常问题有重要意义。
目前,获取程序线程堆栈的方法主要有以下两种实现方案:
方案一:使用程序调试工具(GNU Debugger,GDB):GDB是通用信息处理系统(Uniplexed Information and Computering System,Unix)及类Unix系统下经常使用的调试工具,使用GDB调试工具在程序异常时可获取到所有线程堆栈,主要有以下三种使用方式:
方式(1):使用GDB工具启动要运行的程序,此时GDB相当于运行程序的父进程,运行进程相当于GDB的子进程,程序在运行过程中如果发生异常,GDB可以捕获到该异常信号,并暂停异常线程;在暂停过程中,用户可输入GDB提供的调试命令将异常线程和其他线程的堆栈信息都打印或保存(如位检测指令(Bit Test,BT)命令用来打印当前线程堆栈,对所有线程应用反向追踪(thread apply all bt)命令可以打印所有线程堆栈)。
方式(2):先运行程序,GDB提供一种粘贴(attach)到程序的方法,在程序运行过程中,可以将GDB attach到要调试的程序上,此时就可以像第一种方式那样对程序进行调试,在程序发生异常时获取到所有线程的堆栈信息。
方式(3):运行程序并开启操作系统核心转储的功能(使用操作系统提供的(Unix资源限制)文件描述符命令设置),程序异常时会自动将异常发生时的程序状态(包括内存快照、线程堆栈等)自动转储到指定目录(一般称作core dump文件,即核心转储文件),然后可以使用GDB工具加载core dump文件,同时需要加载运行程序的可执行文件(内部包含了调试符号),可以复现线程堆栈,通过特定命令拿到指定线程或所有线程的堆栈信息。
方案二:使用操作系统提供的获取线程堆栈的接口获取:操作系统一般提供获取堆栈的接口函数,在类Unix操作系统(linux)下,该接口函数为回溯跟踪函数(backtrace)和栈跟踪符号化函数(backtrace_symbols)。其中,backtrace函数用于获取当前线程的函数堆栈地址;backtrace_symbols函数用于将该地址转换成具体的函数名称。
上述方案一的不足之处在于:方式(1)直接使用GDB工具启动程序,会严重拖慢程序运行速度,使程序运行性能大打折扣,通常在排查特定问题时才会使用GDB直接启动程序,且程序运行过程中出现异常被GDB捕获时,需要人为和GDB工具使用命令交互进行调试,在完全无人工的生产环境,无法使用此方式;方式(2)需要在程序发生异常之前使用GDB工具attach到程序才能在程序发生异常时捕获,若程序已经出现异常,GDB就无法再attach到程序了,此时无法获取到异常堆栈;方式(3)需要操作系统开启核心转储功能,程序发生异常时,操作系统自动把核心转储文件存放到指定位置,核心转储文件通常比较大(大小跟程序运行时所占用的内存大小有关,内存占用越大,保存的核心转储文件也越大),对于磁盘空间较小的系统,资源有限,通常无法提供太大的磁盘空间用来存储核心转储文件,且核心转储文件需要及时清理,如果不及时清理,再次发生异常,又需要磁盘空间来保存新的核心转储文件,且核心转储文件保存完之后,还需要GDB工具加载文件再自动解析保存,效率极低,也无法在完全无人工的生产场景中使用。
上述方案二的不足之处在于:虽然可以在程序中利用系统提供的信号捕获机制和堆栈获取的接口来获取异常线程的堆栈信息,但是无法直接获取到所有线程的堆栈信息。如果捕获到异常的线程并非导致程序异常的直接线程(比如异常线程的堆栈被其他的线程篡改了,真正发生问题的线程是其他的线程,但是导致异常的线程被捕获到了,或者捕获到异常的线程本身获取到的堆栈是无效信息),这种方法无法精确定位异常线程的位置,也就无法及时解决异常问题。
本公开为了至少部分地解决上述问题以及其他潜在问题中的一个或者多个问题,提出了一种线程堆栈信息获取方法,通过预先获取目标程序的线程标识符,在目标程序崩溃时获取目标程序的目标堆栈信息,能够减小对磁盘及内存空间的占用,实时性强;同时,由于目标堆栈信息包括多个线程各自对应的堆栈信息,基于目标堆栈信息快速确定目标程序的崩溃代码位置,解决了单个堆栈信息所指示的崩溃函数因不是使程序崩溃的真正原因而导致无法正确定位崩溃代码位置的问题,能提高排查目标程序异常问题的效率。
本公开实施例提供了一种线程堆栈信息获取方法,图1是根据本公开实施例的线程堆栈信息获取方法的流程示意图,该线程堆栈信息获取方法可以应用于线程堆栈信息获取装置。该线程堆栈信息获取装置位于电子设备。该电子设备包括但不限于固定设备和/或移动设备。例如,固定设备包括但不限于个人计算机、电视机等。例如,移动设备包括但不限于手机、车载终端等。在一些可能的实现方式中,该线程堆栈信息获取方法还可以通过处理器调用存储器中存储的计算机可读指令的方式来实现。如图1所示,该线程堆栈信息获取方法包括:
S101:响应于目标程序的第一线程接收到操作系统发出的第一信号,获取第一线程的第一堆栈信息以及目标程序的至少部分第二线程各自对应的第二堆栈信息;其中,第二线程是在操作系统发出第一信号时除第一线程之外存活的线程;
S102:基于第一线程的第一堆栈信息和至少部分第二线程各自对应的第二堆栈信息,生成目标程序的目标堆栈信息。
在一些实施方式中,该目标程序为可以运行于操作系统中的程序。该目标程序可以是电子设备或车端设备自带的程序;也可以是部署于电子设备和车端设备的第三方程序。示例性地,目标程序包括但不限于导航程序、道路标识识别程序、车道偏离预警程序、车道保持辅助程序和自适应巡航程序等程序。以上仅为示例性说明,不作为对目标程序包括的全部可能的类型的限定,只是这里不做穷举。
在一些实施方式中,该第一线程为在目标程序中最早表现出异常的线程。示例性地,在目标程序运行中可能会出现多处异常,在程序A运行在操作系统中时,在t1时间线程1出现异常问题、在t2时间线程7出现异常问题、在t3时间线程9出现异常问题,t1早于t2,t2早于t3,则程序A的线程1为程序A的第一线程。又示例性地,在目标程序运行中可能会出现多处异常,在程序B运行在操作系统中时,在t4时间线程2出现异常但并未被操作系统检测到、在t5时间线程4出现异常且被操作系统检测到,t4早于t5,则程序B的线程4为程序B的第一线程。
在一些实施方式中,该操作系统可以部署于车端或电子设备上。在操作系统上可以运行该目标程序。该操作系统可以向目标程序发送第一信号。
在一些实施方式中,该第一信号用于捕获目标程序异常,该信号在程序发生异常时由操作系统自动发送至目标程序。该第一信号可以包括段错误(SIGSEGV)、非法指令(SIGILL)、算术逻辑错误(SIGFPE)、总线错误(SIGBUS)等。本申请中,在目标程序接收到第一信号时,调用该第一信号对应的异常处理函数,为了方便描述,将该第一信号对应的异常处理函数称为异常处理函数1。
在一些实施方式中,该第一堆栈信息可以包括:该第一线程的线程标识符、该第一线程的线程状态、该第一线程的优先级、该第一线程的线程中央处理器(CentralProcessing Unit,CPU)时间、该第一线程的数据段等信息以及该第一线程的运行数据等。该第一堆栈信息在生成后可以存储在内存,或存储至磁盘,或上传至云端。这里,内存是指操作系统为目标程序分配的存储区域。
在一些实施方式中,该第二线程可以是指除第一线程外的所有线程。也可以是指除第一线程外的部分线程。该部分线程可以是所有第二程序中除出错率低于第一预设阈值的线程以外的第二线程。这里,第一预设阈值可根据需求进行设定。
在一些实施方式中,该第二堆栈信息可以包括:该第二线程的线程标识符、该第二线程的线程状态、该第二线程的优先级、该第二线程的线程CPU时间、该第二线程的数据段等信息以及该第二线程的运行数据等。该第二堆栈信息在生成后可以存储在内存,或存储至磁盘,或上传至云端。这里,内存是指操作系统为目标程序分配的存储区域。
在一些实施方式中,该目标堆栈信息可包括目标程序的目标线程的堆栈信息,该目标线程包括第一线程和部分第二线程。这里,部分第二线程可以是所有第二线程中由用户指定的线程,或者是出错率高于第二预设阈值的线程。这里,第二预设阈值可以根据用户需求进行设定或调整。第二预设阈值大于第一预设阈值。
在一些实施方式中,该目标堆栈信息可包括目标程序的目标线程的堆栈信息,该目标线程包括第一线程和所有第二线程。
在一些实施方式中,该线程堆栈信息获取方法还可以包括:响应于目标程序的第一线程接收到操作系统发出的第一信号,确定该目标程序的目标线程;获取该目标线程的堆栈信息,得到目标堆栈信息。实际应用中,该目标线程包括第一线程;其中,该第一线程为异常线程。实际应用中,该目标线程可以包括:第一线程和所有第二线程。实际应用中,该目标线程可以包括:第一线程和至少部分第二线程;其中,该至少部分第二线程可以是所有第二线程中靠近第一线程的第二线程;该至少部分第二行程还可以是所有第二线程中出错率高于第二预设阈值的第二线程;该至少部分第二行程也可以是所有第二线程中重要度高于第三预设阈值的第二线程;该至少部分第二行程也可以是所有第二线程中由用户预先指定的第二线程。
图2示出了线程堆栈信息获取的架构示意图,如图2所示,Hook组件的pthread_create函数获取所有线程标识符,将线程标识符保存到数据缓存组件。该数据缓存组件保存所有线程标识符。目标程序包括主线程和m条线程;线程n接收到第一信号,执行异常处理函数1(也可称为异常处理子程序1);具体地,异常处理函数1包括以下处理:从数据缓存组件获取所有线程标识符;向线程1、2…n-1、n+1、…、m分别发送第二信号;等待线程1、2…n-1、n+1、…、m完成信号处理;搜索线程1、2…n-1、n+1、…、m线程堆栈;保存本线程的堆栈信息;输出或向云端回传所有线程的堆栈信息。线程1、线程2、…n-1、n+1、…、m接收到第二信号,各自执行异常处理函数2(也可称为异常处理子程序2);具体地,异常处理函数2包括以下处理:保存本线程的堆栈信息。
在一些实施方式中,该线程堆栈信息获取方法还可以包括:确定堆栈信息排序规则;基于该堆栈信息排序规则对该目标堆栈信息中的多个堆栈信息进行排序。示例性地,若该堆栈信息排序规则为靠近第一线程的第二线程的优先级较高,则将靠近第一线程的多个第二线程的第二堆栈信息排列在目标堆栈信息列表的前面。示例性地,若该堆栈信息排序规则为与第一线程有调用或被调用关系的第二线程的优先级较高,则将与第一线程有调用或被调用关系的第二线程的第二堆栈信息排列在目标堆栈信息列表的前面。如此,能够便于快速从目标堆栈信息中定位目标程序的崩溃代码位置,从而提高排查目标程序异常问题的效率。以上仅为示例性说明,不作为对堆栈信息排序规则包括的全部可能的内容的限定,只是这里不做穷举。
本公开实施例的技术方案,响应于目标程序的第一线程接收到操作系统发出的第一信号,获取第一线程的第一堆栈信息以及目标程序的至少部分第二线程各自对应的第二堆栈信息;其中,第二线程是在操作系统发出第一信号时除第一线程之外存活的线程;基于第一线程的第一堆栈信息和至少部分第二线程各自对应的第二堆栈信息,生成目标程序的目标堆栈信息。如此,相对于接收到操作系统发出的第一信号时上报第一线程的第一堆栈信息这种处理方式,在目标程序崩溃时获取目标程序的目标堆栈信息,由于目标堆栈信息包括第一线程的第一堆栈信息和至少部分第二线程各自对应的第二堆栈信息,便于基于目标堆栈信息确定目标程序的崩溃代码位置,解决了因第一线程不是导致程序崩溃的真正原因而导致无法准确定位崩溃代码位置的问题,从而能提高排查目标程序异常问题的效率和准确性。
在一些实施方式中,该线程堆栈信息获取方法还包括:获取目标程序的线程标识符;将获取的线程标识符保存到第二动态链接库;其中,第二动态链接库关联有目标程序和第一动态链接库,第一动态链接库将获取的线程标识符保存到第二动态链接库,目标程序从第二动态链接库获取线程标识符。
在一些实施方式中,该线程标识符可以用线程的身份标识号(Identitydocument,ID)表示,该线程标识符是通过第一动态链接库(又称Hook组件)得到的。
在一些实施方式中,该第一动态链接库用于获取目标程序的所有线程的线程标识符。具体地,操作系统下线程标识符分为两种,一种是线程创建时操作系统分配的唯一线程标识符,该标识符可以在进程的线程信息(/proc/pid/task)目录下读取到;另一种是线程创建时为进程分配的唯一进程标识符。对两种标识符测试,通过第一种线程标识符向线程发送信号,通常线程无法正常捕获到;第二种线程标识符通常在创建线程时获取,操作系统提供创建线程函数(pthread_create函数)用来创建一个线程,该函数的第一个参数是线程标识符,调用该函数后用户可以拿到线程标识符。但是,上述方法有一个弊端,只有自己写的程序能这样拿到线程标识符,如果是第三方已经编译好的程序,就无法通过该接口得到线程标识符。因此,可以实现一个Hook组件,通过Hook方式自动获取到所有线程的线程标识符。操作系统提供一个环境变量(LD_PRELOAD),目标程序在运行时调用函数会得到该函数所在的第一动态链接库(Hook组件),LD_PRELOAD环境变量指定的动态链接库有最高优先级,将被操作系统优先搜索到。若在LD_PRELOAD指定的动态链接库里已经搜到要使用的函数,就只使用该函数,不会再搜索下一个同样的函数,除非在程序里手动执行要使用下一个同样的函数。通过上述机制,可以重新定义pthread_create函数。根据操作系统提供的pthread_create函数的参数定义,重新定义pthread_create函数,在该函数内部,先调用操作系统本身提供的pthread_create函数,就可以得到线程标识符;再将该线程标识符存储到内存中,将重新定义的pthread_create函数编译成动态链接库(记为第一动态链接库)。通过LD_PRELOAD环境变量指定编译好的动态链接库路径,可以保证目标程序的所有线程在创建的时候优先调用自定义的pthread_create函数,以得到所有线程的线程标识符。
图3示出了第一动态链接库、第二动态链接库与目标程序的关系示意图,如图3所示,该第二动态链接库用于保存第一动态链接库得到的线程标识符。具体地,虽然Hook组件是通过LD_PRELOAD环境变量加载的,但是目标程序无法直接使用它内部的数据。因此,需要实现一个数据缓存组件,数据缓存组件与Hook组件和目标程序同时连接,数据缓存组件内部的数据可以与Hook组件和目标程序共享,Hook组件将得到的线程标识符存储到数据缓存组件中,目标程序从数据缓存组件读取所有线程的线程标识符。
在一些实施方式中,若目标程序A包括N个线程,在目标程序开始运行到目标程序出现崩溃时只有M个线程正在运行,则仅需要获取目标程序的这M个线程各自对应的线程标识符。
本公开实施例的技术方案,通过Hook组件获取目标程序所有线程的线程标识符,能够提高获取线程堆栈的实时性,提高获取的线程标识符的全面性。同时,将所有线程的线程标识符保存至数据缓存组件,便于后续供目标程序查询线程标识符,既能大大降低存储成本,又能提高线程标识符的查询速度。
本公开实施例中,获取目标程序的至少部分第二线程各自对应的第二堆栈信息,包括:从第二动态链接库获取至少部分第二线程各自对应的线程标识符;基于至少部分第二线程各自对应的线程标识符,向目标程序的至少部分第二线程发送第二信号,以由至少部分第二线程在接收到第二信号时获取各自对应的第二堆栈信息。
在一些实施方式中,该第二信号为自定义信号,该信号由第一线程向多个第二线程发送。该第二信号包括但不限于用户自定义信号1(SIGUSR1)、用户自定义信号2(SIGUSR2)等。为了方便描述,该第一信号对应的异常处理函数称为异常处理函数2。
其中,该第一线程向多个第二线程发送第二信号可以包括:根据线程顺序依次向多个第二线程发送第二信号;或根据线程优先级依次向多个线程发送第二信号;或随机向多个第二线程发送第二信号。这里,该第一线程不能同时向多个第二线程发送第二信号。
本公开实施例的技术方案,从第二动态链接库获取至少部分第二线程各自对应的线程标识符;基于至少部分第二线程各自对应的线程标识符,向目标程序的至少部分第二线程发送第二信号,以由至少部分第二线程在接收到第二信号时获取各自对应的第二堆栈信息。如此,能够根据实际情况从第二动态链接库获取至少部分第二线程各自对应的线程标识符,进而基于至少部分第二线程各自对应的线程标识符,向目标程序的至少部分第二线程发送第二信号;可实现向至少部分第二线程发送第二信号,便于快速灵活地获取所需第二线程的第二堆栈信息,有助于提高确定目标程序异常问题的速度。
本公开实施例中,获取目标程序的线程标识符,包括:在操作系统为目标程序创建线程之前,加载第一动态链接库中的第一目标函数,以在操作系统为目标程序创建线程时通过第一目标函数获取目标程序的线程标识符;其中,第一目标函数用于调用操作系统的第二目标函数,并提取目标程序的线程标识符;第二目标函数用于创建线程。
在一些实施方式中,该第一目标函数为自定义的pthread_create函数,该第一目标函数内部嵌套有操作系统的第二目标函数。该第一目标函数与该第二目标函数名称相同、内容不相同;该第一目标函数用于从操作系统的第二目标函数创建的线程中获取线程标识符。
在一些实施方式中,目标程序处于未启动状态时,不能创建线程;在目标程序处于启动状态时创建线程,获取目标程序的线程标识符。这里,目标程序启动的状态是由用户决定的,不是由目标程序控制的,也不是由操作系统控制的。
在一些实施方式中,其中,第二目标函数是操作系统的pthread_create函数;第一目标函数是重新定义的pthread_create函数。该第一目标函数用于调用操作系统的第二目标函数,返回线程标识符;这里,返回的线程标识符可以存储至第一动态链接库。该第二目标函数用于创建线程,该第二目标函数存储在操作系统的函数库中。
本公开实施例的技术方案,在操作系统为目标程序创建线程之前,加载第一动态链接库中的第一目标函数,以在操作系统为目标程序创建线程时通过第一目标函数获取目标程序的线程标识符,能够基于至少部分第二线程各自对应的线程标识符向该至少部分第二线程发送第二信号,进而获取至少部分第二线程各自对应的第二堆栈信息,使得目标堆栈信息中包括多个线程各自对应的堆栈信息,便于准确定位目标程序的崩溃代码位置,从而提高确定目标程序的异常问题的准确性。
本公开实施例中,第一目标函数与第二目标函数的名称相同;第一动态链接库被操作系统的目标环境变量指定,第一动态链接库是在目标程序运行前被操作系统加载的链接库。
本公开实施例中,该目标环境变量可以是LD_PRELOAD环境变量。具体地,仅加载一次第一动态链接库,第一动态链接库就可以获取函数、符号以及信息等内容。因此,在目标程序运行过程中,不需要每次执行第一目标函数时,都需要执行一次加载第一动态链接库的操作。第一动态链接库是对源代码进行编译后得到的,该源代码至少包括我们重新定义的第一目标函数(即pthread_create函数)。利用操作系统的目标环境变量指定第一动态链接库,该第一动态链接库是目标程序处于运行状态先加载的链接库。在操作系统的环境变量中将第二目标函数进行编译得到第二动态链接库。该目标环境变量指定第一动态链接库后具有最高优先级。通过目标环境变量,可以在主程序和其动态链接库的中间加载其他动态链接库。
本公开实施例的技术方案,能够通过第一动态链接库获取目标堆栈信息。当操作系统部署于车端时,能够提高确定目标程序异常问题的效率,从而有助于提高自动驾驶车辆的安全性。当操作系统部署于电子设备时,能够提高确定目标程序异常问题的效率,从而有助于电子设备的稳定运行。
本公开实施例中,获取第一线程的第一堆栈信息,包括:控制第一线程基于第一信号进入第一异常处理函数;其中,第一信号用于指示进入第一异常处理函数;通过第一异常处理函数获取第一线程的第一堆栈信息。
在一些实施方式中,该第一信号用于指示进入第一异常处理程序,第一线程进入第一异常处理程序后将调用第一异常处理函数以获取第一线程的堆栈信息。第一异常处理函数可以是程序员编写的一段代码。
在一些实施方式中,该操作系统有默认处理函数,该默认处理函数会触发默认功能导致目标程序直接崩溃。若操作系统在目标程序出现异常时调用第一异常处理函数,第一异常处理函数可以在目标程序中实现第一异常处理,该第一异常处理包括以下处理:将第一线程的第一堆栈信息保存至内存;以及向第二线程发送第二信号。
这里,该第二异常处理函数可以是由操作系统提供的信号动作函数(sigaction)或信号函数(signal)进行注册。
本公开实施例的技术方案,控制第一线程基于第一信号进入第一异常处理函数。如此,能够调用第一异常处理函数以触发第一异常处理,在目标程序未崩溃前保存线程堆栈信息,有助于提高确定目标程序的异常位置的准确性,进而有助于提高确定目标程序异常问题的准确性。
本公开实施例中,获取第一线程的第一堆栈信息,包括:在向至少部分第二线程发送第二信号前,通过第一线程获取第一线程的第一堆栈信息;或在向至少部分第二线程发送第二信号后,通过第一线程获取第一线程的第一堆栈信息;或在接收到至少部分第二线程发送的第三信号后,通过第一线程获取第一线程的第一堆栈信息;其中,第三信号用于指示已获取第二堆栈信息。也就是说,该第三信号用于指示第二堆栈信息获取完成。
本公开实施例中,该第一线程获取第一堆栈信息的时间可以根据用户需求进行设定。示例性地,目标程序A的第一线程接收到自动驾驶车辆的操作系统发送的第一信号,第一线程在获取第一堆栈信息后,向至少部分第二线程发送第二信号。目标程序B的第一线程接收到电子设备的操作系统发送的第一信号,第一线程向至少部分第二线程发送第二信号后,获取第一堆栈信息。目标程序C的第一线程在接收到至少部分第二线程发送的第三信号后,获取第一堆栈信息。
本公开实施例的技术方案,在向至少部分第二线程发送第二信号前,通过第一线程获取第一线程的第一堆栈信息;或在向至少部分第二线程发送第二信号后,通过第一线程获取第一线程的第一堆栈信息;或在接收到至少部分第二线程发送的第三信号后,通过第一线程获取第一线程的第一堆栈信息,能够根据实际情况或用户需求调整第一堆栈信息的获取时间,有助于提高获取目标堆栈信息的灵活性。
本公开实施例中,获取第一线程的第一堆栈信息以及目标程序的至少部分第二线程各自对应的第二堆栈信息,包括:控制第二线程基于第二信号进入第二异常处理函数;其中,第二信号用于指示进入第二异常处理函数;通过第二异常处理函数获取第二线程的第二堆栈信息。
在一些实施方式中,该第二信号用于指示进入第二异常处理程序,第二线程进入第二异常处理程序后将调用第二异常函数以获取第二线程的堆栈信息。第二异常处理函数可以是程序员编写的一段代码。
这里,该第二异常处理函数可以是由操作系统提供的sigaction函数或signal函数进行注册。
本公开实施例的技术方案,控制第二线程基于第二信号进入第二异常处理函数;其中,第二信号用于指示进入第二异常处理函数;通过第二异常处理函数获取第二线程的第二堆栈信息。如此,能够调用第二异常函数以触发第二异常处理,在目标程序崩溃时保存第二线程的第二堆栈信息,有助于提高确定目标程序的异常位置的准确性,进而有助于提高确定目标程序异常问题的准确性。
本公开实施例中,该线程堆栈信息获取方法还包括:响应于检测到第二线程获取第二堆栈信息,由第一线程收集至少部分第二线程各自对应的第二堆栈信息;保存第一线程的第一堆栈信息和至少部分第二线程各自对应的第二堆栈信息。
这里,第一线程的第一堆栈信息和至少部分第二线程各自对应的第二堆栈信息,均保存在操作系统为目标程序分配的内存中。
在一些实施方式中,该第一线程获取第一堆栈信息并向多个第二线程发送第二信号;该第一线程收集多个第二线程的第二堆栈信息;基于第一堆栈信息和第二堆栈信息得到目标堆栈信息;由第一线程输出目标堆栈信息;将目标堆栈信息存储至磁盘或上传至云端。
本公开实施例的技术方案,响应于检测到第二线程获取第二堆栈信息,由第一线程收集至少部分第二线程各自对应的第二堆栈信息;保存第一线程的第一堆栈信息和至少部分第二线程各自对应的第二堆栈信息。如此,将第一堆栈信息和第二堆栈信息保存至磁盘或上传至云端,有助于减小对磁盘及内存空间的占用。
在一些实施方式中,该第一线程获取第一堆栈信息并向多个第二线程发送第二信号;由目标程序指定的某个第二线程收集第一线程的第一堆栈信息和其他第二线程各自对应的第二堆栈信息;基于第一堆栈信息和第二堆栈信息得到目标堆栈信息;由该被指定的某个第二线程输出目标堆栈信息;将目标堆栈信息存储至磁盘或上传至云端。
如此,由目标程序指定的某个第二线程收集第一线程的第一堆栈信息和其他第二线程各自对应的第二堆栈信息,将第一堆栈信息和第二堆栈信息保存至磁盘或上传至云端,有助于减小对磁盘及内存空间的占用。由于该被指定的第二线程未收到第一信号,且仅收集到第二信号,能够提高收集第一堆栈信息和第二堆栈信息的稳定性,进而提高目标堆栈信息的生成稳定性,从而有助于提高定位目标程序中崩溃代码的位置的准确性。
在一些实施方式中,该线程堆栈信息获取方法还包括:将目标堆栈信息输出到电子设备的屏幕或者保存到电子设备的磁盘,电子设备安装有目标程序。
本公开实施例中,将目标堆栈信息输入到电子设备的屏幕,用户可以根据目标堆栈信息进行分析,确定目标程序的崩溃代码位置;基于目标程序的崩溃代码位置,确定目标程序的异常问题。这里,电子设备可以是任意形式的电子设备。通过将目标堆栈信息输入到电子设备的屏幕,能够及时提醒用户目标程序出现异常,从而有助于提高用户发现目标程序异常的速度。
在一些实施方式中,将目标堆栈信息保存至电子设备的磁盘,用户可以根据目标堆栈信息进行分析,确定目标程序的崩溃代码位置;基于目标程序的崩溃代码位置,确定目标程序的异常问题。这里,电子设备可以是任意形式的电子设备。通过将目标堆栈信息输入到电子设备的磁盘,能够及时存储目标堆栈信息,以保证在对该目标程序进行分析时,快速取得目标堆栈信息,从而有助于节省用户分析目标程序的时间。
本公开实施例的技术方案,将目标堆栈信息输出到电子设备的屏幕或者保存到电子设备的磁盘,能够基于目标堆栈信息进行实时分析确定目标程序的崩溃代码位置;基于目标程序的崩溃代码位置,确定目标程序的异常问题;有助于提高处理目标程序异常问题的实时性。
本公开实施例中,该线程堆栈信息获取方法还包括:向服务器发送目标堆栈信息,以由服务器基于目标堆栈信息确定目标程序的异常位置,基于异常位置确定新的目标程序。
这里,服务器可以是目标程序的服务器。
本公开实施例中,服务器基于目标堆栈信息进行分析确定崩溃代码的位置;基于崩溃代码的位置确定目标程序的异常问题;用户可以根据崩溃代码的位置和异常问题对目标程序的代码进行修改,得到新的目标程序,从而提高目标程序的迭代速度。
本公开实施例的技术方案,向服务器发送目标堆栈信息,以由服务器基于目标堆栈信息确定目标程序的异常位置,基于异常位置确定新的目标程序。能够在目标程序出现异常问题的情况下及时基于目标堆栈信息确定代码崩溃位置和异常问题,有助于提高处理目标程序的异常问题的实时性。
本公开实施例中,该线程堆栈信息获取方法还包括:将新的目标程序发送至电子设备,以由电子设备将目标程序更新为新的目标程序,电子设备安装有目标程序。
本公开实施例中,对目标堆栈信息进行分析,得到代码崩溃位置和异常问题;基于代码崩溃位置和异常问题对目标程序进行修改,得到新的目标程序;将新的目标程序发送至电子设备,以由电子设备将目标程序更新为新的目标程序。
本公开实施例的技术方案,将新的目标程序发送至电子设备,以由电子设备将目标程序更新为新的目标程序。能够在目标程序出现异常问题的情况下及时基于目标堆栈信息确定代码崩溃位置和异常问题,有助于提高处理目标程序的异常问题的实时性,从而有助于提高更新目标程序的效率。在目标程序为自动驾驶系统的程序时,有助于快速实现目标程序的漏洞恢复,从而提高自动驾驶的安全性。
本公开实施例提供了一种线程堆栈信息获取装置,如图4所示,该线程堆栈信息获取装置可以包括:第一获取模块401,用于响应于目标程序的第一线程接收到操作系统发出的第一信号,获取第一线程的第一堆栈信息以及目标程序的至少部分第二线程各自对应的第二堆栈信息;其中,第二线程是在操作系统发出第一信号时除第一线程之外存活的线程;生成模块402,用于基于第一线程的第一堆栈信息和至少部分第二线程各自对应的第二堆栈信息,生成目标程序的目标堆栈信息。
在一些实施例中,该线程堆栈信息获取装置还包括:第二获取模块(图4中未示出),用于获取目标程序的线程标识符;第一保存模块(图4中未示出),用于将获取的线程标识符保存到第二动态链接库;其中,第二动态链接库关联有目标程序和第一动态链接库,第一动态链接库将获取的线程标识符保存到第二动态链接库,目标程序从第二动态链接库获取线程标识符。
在一些实施例中,该第一获取模块401,包括:第一获取子模块,用于从第二动态链接库获取至少部分第二线程各自对应的线程标识符;第二获取子模块,用于基于至少部分第二线程各自对应的线程标识符,向目标程序的至少部分第二线程发送第二信号,以由至少部分第二线程在接收到第二信号时获取各自对应的第二堆栈信息。
在一些实施例中,该第二获取模块(图4中未示出),包括:第三获取子模块,用于在操作系统为目标程序创建线程之前,加载第一动态链接库中的第一目标函数,以在操作系统为目标程序创建线程时通过第一目标函数获取目标程序的线程标识符;其中,第一目标函数用于调用操作系统的第二目标函数,并提取目标程序的线程标识符;第二目标函数用于创建线程。
在一些实施例中,该第一目标函数与第二目标函数的名称相同;第一动态链接库被操作系统的目标环境变量指定,第一动态链接库是在目标程序运行前被操作系统加载的链接库。
在一些实施例中,该第一获取模块401,包括:第一控制子模块,用于控制第一线程基于第一信号进入第一异常处理函数;其中,第一信号用于指示进入第一异常处理函数;第四获取子模块,用于通过第一异常处理函数获取第一线程的第一堆栈信息。
在一些实施例中,该第一获取模块401,包括:第五获取子模块,用于在向至少部分第二线程发送第二信号前,通过第一线程获取第一线程的第一堆栈信息;或第六获取子模块,用于在向至少部分第二线程发送第二信号后,通过第一线程获取第一线程的第一堆栈信息;或第七获取子模块,用于在接收到至少部分第二线程发送的第三信号后,通过第一线程获取第一线程的第一堆栈信息;其中,第三信号用于指示已获取第二堆栈信。
在一些实施例中,该第一获取模块401,包括:第二控制子模块,用于控制第二线程基于第二信号进入第二异常处理函数;其中,第二信号用于指示进入第二异常处理函数;第八获取子模块,用于通过第二异常处理函数获取第二线程的第二堆栈信息。
在一些实施例中,该线程堆栈信息获取装置还包括:收集模块(图4中未示出),用于响应于检测到第二线程获取第二堆栈信息,由第一线程收集至少部分第二线程各自对应的第二堆栈信息;第二保存模块(图4中未示出),用于保存第一线程的第一堆栈信息和至少部分第二线程各自对应的第二堆栈信息。
在一些实施例中,该线程堆栈信息获取装置还包括:输出模块(图4中未示出),用于将目标堆栈信息输出到电子设备的屏幕或者保存到电子设备的磁盘,电子设备安装有目标程序。
在一些实施例中,该线程堆栈信息获取装置还包括:确定模块(图4中未示出),用于向服务器发送目标堆栈信息,以由服务器基于目标堆栈信息确定目标程序的异常位置,基于异常位置确定新的目标程序。
在一些实施例中,该线程堆栈信息获取装置还包括:更新模块(图4中未示出),用于将新的目标程序发送至电子设备,以由电子设备将目标程序更新为新的目标程序,电子设备安装有目标程序。
本领域技术人员应当理解,本公开实施例的线程堆栈信息获取装置中各处理模块的功能,可参照前述的线程堆栈信息获取方法的相关描述而理解,本公开实施例的线程堆栈信息获取装置中各处理模块,可通过实现本公开实施例该的功能的模拟电路而实现,也可以通过执行本公开实施例该的功能的软件在电子设备上的运行而实现。
本公开实施例的线程堆栈信息获取装置,在目标程序崩溃时获取目标程序的目标堆栈信息,便于基于目标堆栈信息确定目标程序的崩溃代码位置,从而提高排查目标程序异常问题的效率。
本公开实施例提供了一种线程堆栈信息获取的场景示意图,如图5所示。
如前所述的,本公开实施例提供的线程堆栈信息获取方法应用于电子设备。电子设备旨在表示各种形式的数字计算机,诸如,服务器、刀片式服务器、大型计算机和其它适合的计算机。电子设备还可以表示各种形式的移动装置,诸如,车端数字助理、车端电话和其它类似的计算装置。
具体地,电子设备可具体执行以下操作:
响应于目标程序的第一线程接收到操作系统发出的第一信号,获取第一线程的第一堆栈信息以及目标程序的至少部分第二线程各自对应的第二堆栈信息;其中,第二线程是在操作系统发出第一信号时除第一线程之外存活的线程;
基于第一线程的第一堆栈信息和至少部分第二线程各自对应的第二堆栈信息,生成目标程序的目标堆栈信息。
其中,该目标程序的目标堆栈信息可以存储至数据源中。该数据源可以是各种形式的数据存储设备,例如,膝上型计算机、台式计算机、工作台、个人数字助理、服务器、刀片式服务器、大型计算机和其它适合的计算机。数据源还可以表示各种形式的移动装置,诸如,车端数字助理、车端电话和其它类似的计算装置。此外,该数据源可以位于车端,也可以位于云端。
应理解,图5所示的场景图仅仅是示意性而非限制性的,本领域技术人员可以基于图5的例子进行各种显而易见的变化和/或替换,得到的技术方案仍属于本公开实施例的公开范围。
本公开的技术方案中,所涉及的用户个人信息的获取,存储和应用等,均符合相关法律法规的规定,且不违背公序良俗。
根据本公开的实施例,本公开还提供了一种电子设备、一种可读存储介质、一种计算机程序产品和一种自动驾驶车辆。
图6示出了可以用来实施本公开的实施例的示例电子设备600的示意性框图。电子设备旨在表示各种形式的数字计算机,诸如,膝上型计算机、台式计算机、工作台、个人数字助理、服务器、刀片式服务器、大型计算机和其它适合的计算机。电子设备还可以表示各种形式的移动装置,诸如,个人数字助理、蜂窝电话、智能电话、可穿戴设备和其它类似的计算装置。本文所示的部件、它们的连接和关系,以及它们的功能仅仅作为示例,并且不意在限制本文中描述的和/或者要求的本公开的实现。
如图6所示,设备600包括计算单元601,其可以根据存储在只读存储器(Read-OnlyMemory,ROM)602中的计算机程序或者从存储单元608加载到随机访问存储器(RandomAccess Memory,RAM)603中的计算机程序,来执行各种适当的动作和处理。在RAM 603中,还可存储设备600操作所需的各种程序和数据。计算单元601、ROM 602以及RAM 603通过总线604彼此相连。输入/输出(Input/Output,I/O)接口605也连接至总线604。
设备600中的多个部件连接至I/O接口605,包括:输入单元606,例如键盘、鼠标等;输出单元607,例如各种类型的显示器、扬声器等;存储单元608,例如磁盘、光盘等;以及通信单元609,例如网卡、调制解调器、无线通信收发机等。通信单元609允许设备600通过诸如因特网的计算机网络和/或各种电信网络与其他设备交换信息/数据。
计算单元601可以是各种具有处理和计算能力的通用和/或专用处理组件。计算单元601的一些示例包括但不限于中央处理单元CPU、图形处理单元(Graphics ProcessingUnit,GPU)、各种专用的人工智能(Artificial Intelligence,AI)计算芯片、各种运行机器学习模型算法的计算单元、数字信号处理器(Digital Signal Processor,DSP),以及任何适当的处理器、控制器、微控制器等。计算单元601执行上文所描述的各个方法和处理,例如线程堆栈信息获取方法。例如,在一些实施例中,线程堆栈信息获取方法可被实现为计算机软件程序,其被有形地包含于机器可读介质,例如存储单元608。在一些实施例中,计算机程序的部分或者全部可以经由ROM 602和/或通信单元609而被载入和/或安装到设备600上。当计算机程序加载到RAM 603并由计算单元601执行时,可以执行上文描述的线程堆栈信息获取方法的一个或多个步骤。备选地,在其他实施例中,计算单元601可以通过其他任何适当的方式(例如,借助于固件)而被配置为执行线程堆栈信息获取方法。
本文中以上描述的系统和技术的各种实施方式可以在数字电子电路系统、集成电路系统、现场可编程门阵列(Field Programmable Gate Array,FPGA)、专用集成电路(Application Specific Integrated Circuit,ASIC)、专用标准产品(Application-Specific Standard Products,ASSP)、芯片上系统的系统(System on Chip,SOC)、复杂可编程逻辑设备(Complex Programmable Logic Device,CPLD)、计算机硬件、固件、软件和/或它们的组合中实现。这些各种实施方式可以包括:实施在一个或者多个计算机程序中,该一个或者多个计算机程序可在包括至少一个可编程处理器的可编程系统上执行和/或解释,该可编程处理器可以是专用或者通用可编程处理器,可以从存储系统、至少一个输入装置和至少一个输出装置接收数据和指令,并且将数据和指令传输至该存储系统、该至少一个输入装置和该至少一个输出装置。
用于实施本公开的方法的程序代码可以采用一个或多个编程语言的任何组合来编写。这些程序代码可以提供给通用计算机、专用计算机或其他可编程数据处理装置的处理器或控制器,使得程序代码当由处理器或控制器执行时使流程图和/或框图中所规定的功能/操作被实施。程序代码可以完全在机器上执行、部分地在机器上执行,作为独立软件包部分地在机器上执行且部分地在远程机器上执行或完全在远程机器或服务器上执行。
在本公开的上下文中,机器可读介质可以是有形的介质,其可以包含或存储以供指令执行系统、装置或设备使用或与指令执行系统、装置或设备结合地使用的程序。机器可读介质可以是机器可读信号介质或机器可读储存介质。机器可读介质可以包括但不限于电子的、磁性的、光学的、电磁的、红外的,或半导体系统、装置或设备,或者上述内容的任何合适组合。机器可读存储介质的更具体示例会包括基于一个或多个线的电气连接、便携式计算机盘、硬盘、随机存取存储器、只读存储器、可擦除可编程只读存储器(ErasableProgrammable Read-Only Memory,EPROM)、快闪存储器、光纤、便捷式紧凑盘只读存储器(Compact Disk Read Only Memory,CD-ROM)、光学储存设备、磁储存设备,或上述内容的任何合适组合。
为了提供与用户的交互,可以在计算机上实施此处描述的系统和技术,该计算机具有:用于向用户显示信息的显示装置(例如,阴极射线管(Cathode Ray Tube,CRT)或者液晶显示器(Liquid Crystal Display,LCD)监视器);以及键盘和指向装置(例如,鼠标或者轨迹球),用户可以通过该键盘和该指向装置来将输入提供给计算机。其它种类的装置还可以用于提供与用户的交互;例如,提供给用户的反馈可以是任何形式的传感反馈(例如,视觉反馈、听觉反馈,或者触觉反馈);并且可以用任何形式(包括声输入、语音输入,或者触觉输入)来接收来自用户的输入。
可以将此处描述的系统和技术实施在包括后台部件的计算系统(例如,作为数据服务器),或者包括中间件部件的计算系统(例如,应用服务器),或者包括前端部件的计算系统(例如,具有图形用户界面或者网络浏览器的用户计算机,用户可以通过该图形用户界面或者该网络浏览器来与此处描述的系统和技术的实施方式交互),或者包括这种后台部件、中间件部件,或者前端部件的任何组合的计算系统中。可以通过任何形式或者介质的数字数据通信(例如,通信网络)来将系统的部件相互连接。通信网络的示例包括:局域网(Local Area Network,LAN)、广域网(Wide Area Network,WAN)和互联网。
计算机系统可以包括客户端和服务器。客户端和服务器一般远离彼此并且通常通过通信网络进行交互。通过在相应的计算机上运行并且彼此具有客户端和服务器关系的计算机程序来产生客户端和服务器的关系。服务器可以是云服务器,也可以为分布式系统的服务器,或者是结合了区块链的服务器。
应该理解,可以使用上面所示的各种形式的流程,重新排序、增加或删除步骤。例如,本公开中记载的各步骤可以并行地执行也可以顺序地执行也可以不同的次序执行,只要能够实现本公开公开的技术方案所期望的结果,本文在此不进行限制。
上述具体实施方式,并不构成对本公开保护范围的限制。本领域技术人员应该明白的是,根据设计要求和其他因素,可以进行各种修改、组合、子组合和替代。任何在本公开的原则之内所作的修改、等同替换和改进等,均应包含在本公开保护范围之内。

Claims (28)

1.一种线程堆栈信息获取方法,包括:
响应于目标程序的第一线程接收到操作系统发出的第一信号,获取所述第一线程的第一堆栈信息以及所述目标程序的至少部分第二线程各自对应的第二堆栈信息;其中,所述第二线程是在所述操作系统发出所述第一信号时除所述第一线程之外存活的线程;
基于所述第一线程的所述第一堆栈信息和至少部分所述第二线程各自对应的所述第二堆栈信息,生成所述目标程序的目标堆栈信息。
2.根据权利要求1所述的方法,还包括:
获取所述目标程序的线程标识符;
将获取的所述线程标识符保存到第二动态链接库;其中,所述第二动态链接库关联有所述目标程序和第一动态链接库,所述第一动态链接库将获取的所述线程标识符保存到所述第二动态链接库,所述目标程序从所述第二动态链接库获取所述线程标识符。
3.根据权利要求2所述的方法,其中,所述获取所述目标程序的至少部分第二线程各自对应的第二堆栈信息,包括:
从所述第二动态链接库获取至少部分所述第二线程各自对应的所述线程标识符;
基于至少部分所述第二线程各自对应的所述线程标识符,向所述目标程序的至少部分所述第二线程发送第二信号,以由至少部分所述第二线程在接收到所述第二信号时获取各自对应的所述第二堆栈信息。
4.根据权利要求2所述的方法,其中,所述获取所述目标程序的线程标识符,包括:
在所述操作系统为所述目标程序创建线程之前,加载第一动态链接库中的第一目标函数,以在所述操作系统为所述目标程序创建线程时通过所述第一目标函数获取所述目标程序的线程标识符;其中,所述第一目标函数用于调用所述操作系统的第二目标函数,并提取所述目标程序的线程标识符;所述第二目标函数用于创建线程。
5.根据权利要求4所述的方法,其中,所述第一目标函数与所述第二目标函数的名称相同;所述第一动态链接库被所述操作系统的目标环境变量指定,所述第一动态链接库是在所述目标程序运行前被所述操作系统加载的链接库。
6.根据权利要求1所述的方法,其中,所述获取所述第一线程的第一堆栈信息,包括:
控制所述第一线程基于所述第一信号进入第一异常处理函数;其中,所述第一信号用于指示进入第一异常处理函数;
通过所述第一异常处理函数获取所述第一线程的所述第一堆栈信息。
7.根据权利要求6所述的方法,其中,所述获取所述第一线程的第一堆栈信息,包括:
在向至少部分所述第二线程发送第二信号前,通过所述第一线程获取所述第一线程的所述第一堆栈信息;或
在向至少部分所述第二线程发送所述第二信号后,通过所述第一线程获取所述第一线程的所述第一堆栈信息;或
在接收到至少部分所述第二线程发送的第三信号后,通过所述第一线程获取所述第一线程的所述第一堆栈信息;其中,所述第三信号用于指示已获取所述第二堆栈信息。
8.根据权利要求1所述的方法,其中,获取所述目标程序的至少部分第二线程各自对应的第二堆栈信息,包括:
控制所述第二线程基于所述第二信号进入第二异常处理函数;其中,所述第二信号用于指示进入所述第二异常处理函数;
通过所述第二异常处理函数获取所述第二线程的所述第二堆栈信息。
9.根据权利要求1所述的方法,还包括:
响应于检测到所述第二线程获取所述第二堆栈信息,由所述第一线程收集至少部分所述第二线程各自对应的所述第二堆栈信息;
保存所述第一线程的所述第一堆栈信息和至少部分所述第二线程各自对应的所述第二堆栈信息。
10.根据权利要求1所述的方法,还包括:
将所述目标堆栈信息输出到电子设备的屏幕或者保存到所述电子设备的磁盘,所述电子设备安装有所述目标程序。
11.根据权利要求1所述的方法,还包括:
向服务器发送所述目标堆栈信息,以由所述服务器基于所述目标堆栈信息确定所述目标程序的异常位置,基于所述异常位置确定新的目标程序。
12.根据权利要求11所述的方法,还包括:
将所述新的目标程序发送至电子设备,以由所述电子设备将所述目标程序更新为所述新的目标程序,所述电子设备安装有所述目标程序。
13.一种线程堆栈信息获取装置,包括:
第一获取模块,用于响应于目标程序的第一线程接收到操作系统发出的第一信号,获取所述第一线程的第一堆栈信息以及所述目标程序的至少部分第二线程各自对应的第二堆栈信息;其中,所述第二线程是在所述操作系统发出所述第一信号时除所述第一线程之外存活的线程;
生成模块,用于基于所述第一线程的所述第一堆栈信息和至少部分所述第二线程各自对应的所述第二堆栈信息,生成所述目标程序的目标堆栈信息。
14.根据权利要求13所述的装置,还包括:
第二获取模块,用于获取所述目标程序的线程标识符;
第一保存模块,用于将获取的所述线程标识符保存到第二动态链接库;其中,所述第二动态链接库关联有所述目标程序和第一动态链接库,所述第一动态链接库将获取的所述线程标识符保存到所述第二动态链接库,所述目标程序从所述第二动态链接库获取所述线程标识符。
15.根据权利要求14所述的装置,其中,所述第一获取模块,包括:
第一获取子模块,用于从所述第二动态链接库获取至少部分所述第二线程各自对应的所述线程标识符;
第二获取子模块,用于基于至少部分所述第二线程各自对应的所述线程标识符,向所述目标程序的至少部分所述第二线程发送第二信号,以由至少部分所述第二线程在接收到所述第二信号时获取各自对应的所述第二堆栈信息。
16.根据权利要求14所述的装置,其中,所述第二获取模块,包括:
第三获取子模块,用于在所述操作系统为所述目标程序创建线程之前,加载第一动态链接库中的第一目标函数,以在所述操作系统为所述目标程序创建线程时通过所述第一目标函数获取所述目标程序的线程标识符;其中,所述第一目标函数用于调用所述操作系统的第二目标函数,并提取所述目标程序的线程标识符;所述第二目标函数用于创建线程。
17.根据权利要求16所述的装置,其中,所述第一目标函数与所述第二目标函数的名称相同;所述第一动态链接库被所述操作系统的目标环境变量指定,所述第一动态链接库是在所述目标程序运行前被所述操作系统加载的链接库。
18.根据权利要求13所述的装置,其中,所述第一获取模块,包括:
第一控制子模块,用于控制所述第一线程基于所述第一信号进入第一异常处理函数;其中,所述第一信号用于指示进入第一异常处理函数;
第四获取子模块,用于通过所述第一异常处理函数获取所述第一线程的所述第一堆栈信息。
19.根据权利要求18所述的装置,其中,所述第一获取模块,包括:
第五获取子模块,用于在向至少部分所述第二线程发送第二信号前,通过所述第一线程获取所述第一线程的所述第一堆栈信息;或
第六获取子模块,用于在向至少部分所述第二线程发送所述第二信号后,通过所述第一线程获取所述第一线程的所述第一堆栈信息;或
第七获取子模块,用于在接收到至少部分所述第二线程发送的第三信号后,通过所述第一线程获取所述第一线程的所述第一堆栈信息;其中,所述第三信号用于指示已获取所述第二堆栈信息。
20.根据权利要求13所述的装置,其中,所述第一获取模块,包括:
第二控制子模块,用于控制所述第二线程基于所述第二信号进入第二异常处理函数;其中,所述第二信号用于指示进入所述第二异常处理函数;
第八获取子模块,用于通过所述第二异常处理函数获取所述第二线程的所述第二堆栈信息。
21.根据权利要求13所述的装置,还包括:
收集模块,用于响应于检测到所述第二线程获取所述第二堆栈信息,由所述第一线程收集至少部分所述第二线程各自对应的所述第二堆栈信息;
第二保存模块,用于保存所述第一线程的所述第一堆栈信息和至少部分所述第二线程各自对应的所述第二堆栈信息。
22.根据权利要求13所述的装置,还包括:
输出模块,用于将所述目标堆栈信息输出到电子设备的屏幕或者保存到所述电子设备的磁盘,所述电子设备安装有所述目标程序。
23.根据权利要求13所述的装置,还包括:
确定模块,用于向服务器发送所述目标堆栈信息,以由所述服务器基于所述目标堆栈信息确定所述目标程序的异常位置,基于所述异常位置确定新的目标程序。
24.根据权利要求23所述的装置,还包括:
更新模块,用于将所述新的目标程序发送至电子设备,以由所述电子设备将所述目标程序更新为所述新的目标程序,所述电子设备安装有所述目标程序。
25.一种电子设备,包括:
至少一个处理器;以及
与至少一个处理器通信连接的存储器;其中,
存储器存储有可被至少一个处理器执行的指令,指令被至少一个处理器执行,以使至少一个处理器能够执行权利要求1-12中任一项的方法。
26.一种存储有计算机指令的非瞬时计算机可读存储介质,其中,计算机指令用于使计算机执行根据权利要求1-12中任一项的方法。
27.一种计算机程序产品,包括存储在存储介质上的计算机程序,计算机程序在被处理器执行时实现根据权利要求1-12中任一项的方法。
28.一种自动驾驶车辆,包括如权利要求25所述的电子设备。
CN202311569218.4A 2023-11-22 2023-11-22 线程堆栈信息获取方法、装置、电子设备及存储介质 Pending CN117806859A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202311569218.4A CN117806859A (zh) 2023-11-22 2023-11-22 线程堆栈信息获取方法、装置、电子设备及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202311569218.4A CN117806859A (zh) 2023-11-22 2023-11-22 线程堆栈信息获取方法、装置、电子设备及存储介质

Publications (1)

Publication Number Publication Date
CN117806859A true CN117806859A (zh) 2024-04-02

Family

ID=90418959

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202311569218.4A Pending CN117806859A (zh) 2023-11-22 2023-11-22 线程堆栈信息获取方法、装置、电子设备及存储介质

Country Status (1)

Country Link
CN (1) CN117806859A (zh)

Similar Documents

Publication Publication Date Title
JP7209034B2 (ja) エッジコンピューティングテスト方法、装置、機器及び読み取り可能な記憶媒体
CN109800159B (zh) 程序调试方法、程序调试装置、终端设备及存储介质
US9256517B1 (en) Display of aggregated stack traces in a source code viewer
EP3030969B1 (en) Automated application test system
EP3859533A2 (en) Method and apparatus for testing map service, electronic device, storage medium and computer program product
US9946628B2 (en) Embedding and executing trace functions in code to gather trace data
US20120159449A1 (en) Call Stack Inspection For A Thread Of Execution
US20030217354A1 (en) Scope-based breakpoint selection and operation
TWI684916B (zh) 函式選取方法和伺服器
US20210157711A1 (en) System and method for controlled data extraction in computer networks
CN111552646A (zh) 用于回归测试的方法和装置
CN113127050A (zh) 一种应用资源打包过程监控方法、装置、设备和介质
CN112506854A (zh) 页面模板文件的存储和页面生成方法、装置、设备及介质
CN114185874A (zh) 一种基于大数据的建模方法、装置、开发框架及设备
CN112416762B (zh) Api测试方法及装置、设备、计算机可读存储介质
CN114035829A (zh) 页面组件更新方法、装置、电子设备以及存储介质
CN108536586B (zh) Android移动终端的信息获取方法、设备以及系统
CN117806859A (zh) 线程堆栈信息获取方法、装置、电子设备及存储介质
CN108197005B (zh) Ios应用的底层运行性能监测方法、介质、设备及系统
CN112506871B (zh) 自动化任务管理及日志管理方法、系统、电子设备和介质
CN115268956A (zh) 一种基于rpa的安卓自动化环境搭建方法
JP2022065641A (ja) ネットワークオペレータ処理方法、装置、電子デバイス、記憶媒体及びプログラム
CN113687880A (zh) 一种调用组件的方法、装置、设备和介质
US9201762B1 (en) Processor implemented systems and methods for reversible debugging using a replicate process system call
CN111340976A (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