本申请涉及计算机,具体提供一种程序调用栈获取方法、控制器及存储介质。
背景技术:
1、现有技术中,在软件开发过程中,程序可能会由于各种原因出现崩溃或异常情况。这些问题往往很难在运行时准确捕获和诊断。为了对这些程序崩溃或程序异常情况进行分析,现有技术中通常会利用操作系统提供的核心存储(coredump)文件来记录程序在崩溃时的内存状态(包括堆、栈和全局变量等数据)、导致崩溃的指令、寄存器状态以及函数调用堆栈的信息,相当于一个被冻结的快照。通过对核心存储(coredump)文件进行解析,开发人员可以还原程序崩溃时的现场,深入分析程序崩溃原因。
2、然而,在vxworks操作系统下,这种方式需要连同可执行程序以及依赖的库文件一起拷贝到控制台(workbench)才能进行解析,解析过程繁琐,且耗费时间,效率不高。而如果采用跨域日志系统来监听异常程序,获取程序调用栈的方式。由于跨域日志系统是一个用户态程序,并不能直接调用内核空间中的堆栈跟踪工具来获取程序调用栈。并且,vxworks操作系统中存在地址空间保护机制,即每个实时进程任务在用户空间和内核空间具有不同的标识,也存在无法直接将跨域日志系统获取的异常数据从操作系统的用户空间传递至内核空间的问题。
3、相应地,本领域需要一种新的方案来解决上述问题。
技术实现思路
1、为了克服上述缺陷,提出了本申请,以提供解决或至少部分地解决在vxworks操作系统下,用户空间和内核空间无法传递发生异常程序信息,进而无法高效直接地获取程序调用栈的问题。
2、在第一方面,本申请提供一种程序调用栈获取方法,包括:
3、在所述vxworks操作系统的用户空间的程序异常时,在所述用户空间中获取异常程序中的异常任务的任务用户态标识,将所述任务用户态标识转换为任务名称,并将所述任务名称放入消息队列,所述任务名称与所述任务用户态标识一一对应;
4、在所述vxworks操作系统的内核空间中,将所述任务名称从所述消息队列中取出,将取出的所述任务名称转换为任务内核态标识,并根据所述任务内核态标识获取所述异常程序的程序调用栈;所述任务名称与所述任务内核态标识一一对应。
5、在上述程序调用栈获取方法的一个技术方案中,所述在所述用户空间中获取异常程序中的异常任务的任务用户态标识,包括:
6、基于所述用户空间中的跨域日志系统,获取异常程序;
7、根据所述异常程序,获取所述异常程序中的异常任务对应的任务用户态标识。
8、在上述程序调用栈获取方法的一个技术方案中,所述基于所述用户空间中的跨域日志系统,获取异常程序,包括:
9、当所述用户空间的程序异常时,根据所述跨域日志系统中的任务异常信号,基于所述跨域日志系统中的崩溃处理程序获取所述异常程序;
10、其中,所述任务异常信号为预先被注册在所述跨域日志系统中的,在所述用户控制的程序异常时被触发的信号。
11、在上述程序调用栈获取方法的一个技术方案中,所述异常程序为实时进程中的程序,所述方法还包括:
12、在启动所述实时进程时,根据预设需求对跨域日志系统进行初始化,以使所述跨域日志系统中的崩溃处理程序能够随时捕获实时进程中的异常程序。
13、在上述程序调用栈获取方法的一个技术方案中,所述将所述任务名称从所述消息队列中取出,包括:
14、基于所述内核空间中的可下载内核模块不断监听所述消息队列,以将所述消息队列中的所述任务名称取出。
15、在上述程序调用栈获取方法的一个技术方案中,所述根据所述任务内核态标识获取所述异常程序的程序调用栈,包括:
16、根据所述任务内核态标识,调用所述内核空间中的堆栈跟踪工具,获取所述异常程序的程序调用栈。
17、在上述程序调用栈获取方法的一个技术方案中,所述将取出的所述任务名称转换为任务内核态标识,包括:
18、基于所述vxworks操作系统中的库函数的应用程序编程接口,将取出的所述任务名称转化为任务内核态标识。
19、在上述程序调用栈获取方法的一个技术方案中,所述根据所述任务内核态标识获取所述异常程序的程序调用栈之后,所述方法还包括:
20、基于所述vxworks操作系统中的控制台程序,将所述程序调用栈进行可视化显示,并将所述程序调用栈保存到异常日志文件中。
21、在第三方面,提供一种控制器,该控制器包括至少一个处理器和至少一个存储器,所述存储器适于存储多条程序代码,所述程序代码适于由所述处理器加载并运行以执行上述程序调用栈获取方法的技术方案中任一项技术方案所述的程序调用栈获取方法。
22、在第四方面,提供一种计算机可读存储介质,该计算机可读存储介质其中存储有多条程序代码,所述程序代码适于由处理器加载并运行以执行上述程序调用栈获取方法的技术方案中任一项技术方案所述的程序调用栈获取方法。
23、本申请上述一个或多个技术方案,至少具有如下一种或多种
24、有益效果:
25、在实施本申请的技术方案中,本申请在vxworks操作系统的用户空间的程序异常时,在用户空间中获取异常程序中的异常任务的任务用户态标识,将任务用户态标识转换为任务名称,并将任务名称放入消息队列。在vxworks操作系统的内核空间中,将任务名称从消息队列中取出,将取出的任务名称转换为任务内核态标识,并根据任务内核态标识获取异常程序的程序调用栈。通过上述配置方式,本申请通过任务名称进行用户态标识和内核态标识之间的转化,利用消息队列将任务名称传递到内核空间中,可以绕过vxworks操作系统的地址空间保护机制,实现了异常程序信息在vxworks操作系统中的用户空间到内核空间的传递。如此,绕过了用户态程序不能直接调用堆栈跟踪工具的限制,在内核空间内可直接获取程序调用栈。相对于现有技术,本申请有效提高了在vxworks操作系统发生程序崩溃或异常时获取程序调用栈的效率,极大地简化了开发人员的工作流程,提高了问题诊断的速度。
1.一种程序调用栈获取方法,其特征在于,应用于vxworks操作系统,包括:
2.根据权利要求1所述的程序调用栈获取方法,其特征在于,
3.根据权利要求2所述的程序调用栈获取方法,其特征在于,
4.根据权利要求3所述的程序调用栈获取方法,其特征在于,
5.根据权利要求1所述的程序调用栈获取方法,其特征在于,
6.根据权利要求1所述的程序调用栈获取方法,其特征在于,
7.根据权利要求1所述的程序调用栈获取方法,其特征在于,
8.根据权利要求1所述的程序调用栈获取方法,其特征在于,
9.一种控制器,包括至少一个处理器和至少一个存储器,所述存储器适于存储多条程序代码,其特征在于,所述程序代码适于由所述处理器加载并运行以执行权利要求1至8中任一项所述的程序调用栈获取方法。
10.一种计算机可读存储介质,其中存储有多条程序代码,其特征在于,所述程序代码适于由处理器加载并运行以执行权利要求1至8中任一项所述的程序调用栈获取方法。
