获取线程崩溃的栈信息的方法及装置与流程

文档序号:29639378发布日期:2022-04-13 18:02阅读:188来源:国知局
获取线程崩溃的栈信息的方法及装置与流程

1.本技术涉及计算机技术领域,尤指一种获取线程崩溃的栈信息的方法及装置。


背景技术:

2.plc控制器广泛应用于过程控制领域,是十分重要的自动化控制设备。和利时公司基于国产mips架构处理器研发了高安全的微内核操作系统内核(简称微内核),该微内核运行在cpu的内核空间。和利时公司基于该微内核开发了plc控制器软件,该plc控制器软件运行在cpu的用户空间。
3.根据plc控制器软件需求,当发生线程崩溃时必须提供线程崩溃的栈信息以进一步分析和定位问题。但是,plc控制器软件运行在用户态,使用虚拟内存,且无法访问微内核的内存。该微内核在内核空间只提供线程管理、进程间通信(ipc)、虚拟内存空间、句柄空间、设备基础单元(中断对象)五项极其原始的功能,微内核能够识别线程的崩溃栈,但无法访问plc控制器软件的内存。上述两点导致发生线程崩溃时微内核无法将线程崩溃的栈信信通过内存传递给plc控制器软件。
4.申请内容
5.本技术提供了一种用户空间获取线程崩溃的栈信息的方法及装置,能够使用户获取到线程崩溃的栈信息。
6.本技术提出的一种获取线程崩溃的栈信息的方法,包括:
7.当用户空间接收到线程崩溃通知后,用户空间的崩溃处理线程读取cpu的外部flash中的线程崩溃的栈信息;
8.并将所读取的线程崩溃的栈信息记录到系统的日志文件,以供用户通过读取所述日志文件获取线程崩溃的栈信息。
9.一种示例性的实施例中,所述线程崩溃的栈信息保存在所述外部flash的最后第一数量的字节所在的块存储空间。
10.一种示例性的实施例中,所述线程崩溃的栈信息是在发生线程崩溃时,由微内核写入到所述外部flash中。
11.一种示例性的实施例中,所述微内核将所述线程崩溃的栈信息写入到所述外部flash之前,包括:
12.所述微内核的初始线程对所述外部flash进行初始化;
13.所述微内核将所述线程崩溃的栈信息写入到所述外部flash之后,包括:
14.产生中断以通知用户空间发生了线程崩溃。
15.一种示例性的实施例中,所述微内核将所述线程崩溃的栈信息写入到所述外部flash,包括:
16.所述微内核根据崩溃线程的起始栈地址和sp的值截取线程崩溃的全部栈信息中的第二数量的字节数据;
17.将第三数量的字节数据头添加到所述第二数量的字节数据,形成所述线程崩溃的
栈信息;
18.擦除所述外部flash的最后第一数量字节所在的块存储空间;
19.将所述线程崩溃的栈信息写入到所擦除的块存储空间;
20.所述第一数量等于所述第二数量和所述第三数量之和。
21.一种示例性的实施例中,所述微内核根据崩溃线程的起始栈地址和sp的值截取线程崩溃的全部信息中的第二数量的字节数据,包括:
22.当所述起始栈地址和所述sp的值之差大于第二数量时,从所述sp开始读取第二数量的字节数据;
23.当当所述起始栈地址和所述sp之差小于或等于第二数量时,从所述sp开始读取实际字节数。
24.一种示例性的实施例中,所述第一数量为1024;所述第二数量为1000;所述第三数量为24。
25.一种示例性的实施例中,所述微内核的初始线程对所述外部flash进行初始化,包括:
26.调用所述外部flash的初始化函数实现外部flash的初始化。
27.一种示例性的实施例中,所述外部flash包括nor-flash。
28.本技术提供的一种获取线程崩溃的栈信息的装置,包括存储器和处理器,
29.所述存储器,用于保存用于获取线程崩溃的栈信息的程序;
30.所述处理器,用于读取执行所述用于获取线程崩溃的栈信息的程序,执行如下操作:
31.当用户空间接收到线程崩溃通知后,用户空间的崩溃处理线程读取cpu的外部flash中的线程崩溃的栈信息;
32.并将所读取的线程崩溃的栈信息记录到系统的日志文件,以供用户通过读取所述日志文件获取线程崩溃的栈信息。
33.一种示例性的实施例中,所述线程崩溃的栈信息保存在所述外部flash的最后第一数量的字节所在的块存储空间。
34.一种示例性的实施例中,所述线程崩溃的栈信息是在发生线程崩溃时,由微内核写入到所述外部flash中。
35.一种示例性的实施例中,所述微内核将所述线程崩溃的栈信息写入到所述外部flash之前,包括:
36.所述微内核的初始线程对所述外部flash进行初始化;
37.所述微内核将所述线程崩溃的栈信息写入到所述外部flash之后,包括:
38.产生中断以通知用户空间发生了线程崩溃。
39.一种示例性的实施例中,所述微内核将所述线程崩溃的栈信息写入到所述外部flash,包括:
40.所述微内核根据崩溃线程的起始栈地址和sp的值截取线程崩溃的全部栈信息中的第二数量的字节数据;
41.将第三数量的字节数据头添加到所述第二数量的字节数据,形成所述线程崩溃的栈信息;
42.擦除所述外部flash的最后第一数量字节所在的块存储空间;
43.将所述线程崩溃的栈信息写入到所擦除的块存储空间;
44.所述第一数量等于所述第二数量和所述第三数量之和。
45.一种示例性的实施例中,所述微内核根据崩溃线程的起始栈地址和sp的值截取线程崩溃的全部信息中的第二数量的字节数据,包括:
46.当所述起始栈地址和所述sp的值之差大于第二数量时,从所述sp开始读取第二数量的字节数据;
47.当当所述起始栈地址和所述sp之差小于或等于第二数量时,从所述sp开始读取实际字节数。
48.一种示例性的实施例中,所述第一数量为1024;所述第二数量为1000;所述第三数量为24。
49.一种示例性的实施例中,所述微内核的初始线程对所述外部flash进行初始化,包括:
50.调用所述外部flash的初始化函数实现外部flash的初始化。
51.一种示例性的实施例中,所述外部flash包括nor-flash。
52.申请至少一个实施例,通过微内核将所述线程崩溃的栈信息写入nor-flash,能够使用户获取到线程崩溃的栈信息。
53.本技术的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本技术而了解。本技术的其他优点可通过在说明书以及附图中所描述的方案来实现和获得。
附图说明
54.附图用来提供对本技术技术方案的理解,并且构成说明书的一部分,与本技术的实施例一起用于解释本技术的技术方案,并不构成对本技术技术方案的限制。
55.图1为本技术实施例的获取线程崩溃的栈信息的方法的流程图;
56.图2为本技术实施例的plc控制器结构框图;
57.图3为本技术实施例的线程崩溃栈信息记录的总体流程图;
58.图4为本技术实施例的获取线程崩溃的栈信息的装置的示意图。
具体实施方式
59.图1为本技术实施例的获取线程崩溃地址的方法的流程图,如图1所示,本实施例的获取线程崩溃的栈信息的方法,包括s11-s12步骤:
60.s11、当用户空间接收到线程崩溃通知后,用户空间的崩溃处理线程读取cpu的外部flash中的线程崩溃的栈信息;
61.s12、将所读取的线程崩溃的栈信息记录到系统的日志文件,以供用户通过读取所述日志文件获取线程崩溃的栈信息。
62.一种示例性的实施例中,所述线程崩溃的栈信息保存在所述外部flash的最后第一数量的字节所在的块存储空间。
63.一种示例性的实施例中,所述线程崩溃的栈信息是在发生线程崩溃时,由微内核
写入到所述外部flash中。
64.一种示例性的实施例中,所述微内核将所述线程崩溃的栈信息写入到所述外部flash之前,包括:
65.所述微内核的初始线程对所述外部flash进行初始化;
66.一种示例性的实施例中,所述微内核将所述线程崩溃的栈信息写入到所述外部flash之后,包括:
67.产生中断以通知用户空间发生了线程崩溃。
68.一种示例性的实施例中,所述微内核将所述线程崩溃的栈信息写入到所述外部flash,包括:
69.所述微内核根据崩溃线程的起始栈地址和sp的值截取线程崩溃的全部栈信息中的第二数量的字节数据;
70.将第三数量的字节数据头添加到所述第二数量的字节数据,形成所述线程崩溃的栈信息;
71.擦除所述外部flash的最后第一数量字节所在的块存储空间;
72.将所述线程崩溃的栈信息写入到所擦除的块存储空间;
73.所述第一数量等于所述第二数量和所述第三数量之和。
74.一种示例性的实施例中,所述微内核根据崩溃线程的起始栈地址和sp的值截取线程崩溃的全部信息中的第二数量的字节数据,包括:
75.当所述起始栈地址和所述sp的值之差大于第二数量时,从所述sp开始读取第二数量的字节数据;
76.当当所述起始栈地址和所述sp之差小于或等于第二数量时,从所述sp开始读取实际字节数。
77.一种示例性的实施例中,所述第一数量为1024;所述第二数量为1000;所述第三数量为24。
78.一种示例性的实施例中,所述微内核的初始线程对所述外部flash进行初始化,包括:
79.调用所述外部flash的初始化函数实现外部flash的初始化。
80.一种示例性的实施例中,cpu的外部flash包括nor-flash。
81.一种示例性的实施例中,所述日志文件保存在cpu的外部的nand-flash。
82.为了很好的理解申请内容,下面以基于微内核操作系统的将线程崩溃的栈信息从微内核传递到plc控制器软件的实现方法来具体说明。
83.本技术设计的崩溃栈记录功能,主要修改了微内核操作系统内核、崩溃处理线程两部分。其中微内核操作系统内核对应图2plc控制器结构框图之部件12微内核操作系统内核;崩溃处理线程对应图2plc控制器结构框图之部件20崩溃处理线程。
84.本技术设计的基于微内核操作系统的plc控制器的线程崩溃栈记录功能,难点在于找到一种有效的从微内核向plc控制器软件传递信息的通道。线程的崩溃栈就是线程崩溃时线程栈中保存的内容,通过该内容结合代码反汇编信息,用户可以回朔崩溃发生时函数的调用过程。线程的崩溃栈信息通常较大,至少几十字节。由于微内核操作系统只提供了五项极其原始的功能,未提供从微内核向用户空间传递用户信息的方法和接口函数,导致
线程的崩溃栈信息难以从微内核传递给plc控制器软件。具体分为如下2方面:
85.其一,微内核无法借助内存将该崩溃地址传递给plc控制器软件。微内核运行在内核空间,plc控制器软件运行在用户空间,二者都是虚拟地址,且地址不可见,不存在微内核和plc控制器软件共享内存的通道和接口函数。虽然微内核中保存了线程的崩溃栈信息,但微内核无法借助内存将该崩溃栈信息传递给plc控制器软件,导致plc控制器软件无法获得线程的崩溃栈信息。
86.其二,微内核无法借助cpu寄存器将该崩溃栈信息传递给plc控制器软件。mips体系架构的cpu总共有32个寄存器,而线程崩溃栈是一片数据区,寄存器根本就无法存放这么多数据。综上所述,微内核无法借助cpu寄存器将该崩溃栈信息传递给plc控制器软件。
87.由于微内核无法借助内存将该崩溃栈信息传递给plc控制器软件,并且微内核无法借助cpu寄存器将该崩溃栈信息传递给plc控制器软件,本技术结合微内核操作系统和plc控制器软件的特点,使用cpu外部flash作为从微内核向plc控制器软件传递线程崩溃栈信息的通道,实现了线程崩溃栈信息从微内核向plc控制器软件传递的需求。论证过程如下:
88.微内核中线程的栈默认设置为64kb,最低不小于4kb。多数情况下截取线程栈信息的最近1024字节,结合代码反汇编信息,用户就可以回朔崩溃发生时函数的调用过程。由于线程的崩溃栈信息较大,最好存储在一种非内存的可交换介质中。plc控制器软件中设计了文件系统,可以将大片信息以文件形式保存在nand-flash中。plc控制器软件中还设计了掉电保持功能,在掉电时可以将大片用户数据以二进制形式保存在nor-flash中。如果微内核也可以访问nor-flash或者nand-flash,则可以在崩溃发生时将线程崩溃栈信息记录到nor-flash或者nand-flash中,然后在崩溃处理线程中读取线程崩溃栈信息,则该功能可以实现。微内核可以访问串口打印一些调试信息,说明微内核能够访问cpu的某些外设;plc控制器软件也可以向串口打印一些调试信息,且该功能不依赖微内核,说明plc控制器软件也能够访问cpu的某些外设。由此判断微内核和plc控制器软件都可以访问cpu的某些外设,推断应该能在微内核中加入nor-flash或者nand-flash驱动,使其可以访问nor-flash或者nand-flash。在plc控制器软件中,nand-flash上面构建了文件系统,nand-flash使用较复杂;nor-flash上面没有文件系统,只有简单的驱动,且只在系统断电的时候写入一些数据,系统上电的时候读取一些数据。所以在plc控制器软件中nor-flash比nand-flash使用简单很多,增加功能时影响更小,选择nor-flash更合适。综上所述,本技术结合和利时公司开发的plc控制器软件特点,在内核中能构建一个nor-flash驱动,在发生线程崩溃时,内核将线程崩溃栈信息存入nor-flash中;崩溃处理线程运行时从nor-flash中读取崩溃栈信息,然后调用日志系统将崩溃栈信息再存入位于nand-flash的日志文件中,从而实现基于微内核操作系统的plc控制器的线程崩溃栈记录功能。
89.本技术设计的基于微内核操作系统的plc控制器的线程崩溃栈信息记录功能,对微内核操作系统内核的改动包括2点。当微内核初始化时,参照串口的初始化过程,加入nor-flash的初始化,使微内核可以访问该nor-flash。结合和利时公司开发的plc控制器软件特点,nor-flash只使用了前面的块,后面的块尚未使用,因此选择nor-flash的最后1024字节存储线程崩溃信息。当线程发生崩溃时,微内核首先擦除nor-flash的最后1024字节所在块,然后截取线程崩溃栈的最近1000字节,再增加一个24字节的崩溃栈信息数据头,将其
写入nor-flash的最后1024字节,并继续运行。
90.本技术设计的基于微内核操作系统的plc控制器的线程崩溃栈信息记录功能,位于用户空间的初始线程初始化时,之前已执行了nor-flash的初始化,所以本技术对此模块不需要修改。
91.本技术设计的基于微内核操作系统的plc控制器的线程崩溃栈信息记录功能,对崩溃处理线程的改动包括2点。当崩溃处理线程运行时,它首先读取nor-flash的最后1024字节,然后调用日志接口将该1024字节记录到日志文件中。plc控制器软件已提供读取日志功能,用户通过读取日志文件即可看到崩溃栈信息。
92.本技术设计的基于微内核操作系统的plc控制器的线程崩溃栈信息记录功能,线程崩溃栈信息记录的总体流程如图3所示。当发生崩溃时,微内核将崩溃栈信息写入nor-flash的最后1024字节;崩溃处理线程读取nor-flash的最后1024字节并调用日志模块将上述1024字节写入日志文件中;随后用户通过网络读取日志文件获取崩溃栈信息。
93.本技术设计的基于微内核操作系统的plc控制器的线程崩溃栈信息记录功能实现方法及其实现,在微内核中增加了nor-flash的驱动函数,并在微内核和plc控制器软件中增加了一组函数,如下所示:
94.int os_ker_drv_init_norflash(void);
95.int os_ker_drv_erase_norflash_block(unsigned int offset);
96.int os_ker_drv_write_to_norflash(char*paddr,unsigned int len);
97.int os_ker_drv_read_from_norflash(char*paddr,unsigned int len);
98.void os_ker_init_norflash(void);
99.void os_ker_write_estack_to_norflash(char*paddr,unsigned int len);
100.unsigned int os_app_read_estack_from_norflash(char*paddr,unsigned int len);
101.os_ker_init_norflash函数完成nor-flash的初始化。
102.上述函数中,在微内核中增加的nor-flash的驱动函数包括os_ker_drv_init_norflash、os_ker_drv_erase_norflash_block、os_ker_drv_write_to_norflash、os_ker_drv_read_from_norflash。这几个函数分别实现nor-flash的底层初始化、读数据、写数据功能。这部分代码主要是参照plc控制器软件中的nor-flash驱动改写。此处需要注意的是,微内核运行在内核空间且使用虚拟地址,plc控制器软件运行在用户空间且使用虚拟地址,所以在微内核和plc控制器软件中各有一份独立的nor-flash驱动程序,两者之间是不可见的。这两份驱动程序的主要差异访问nor-flash的虚拟地址不一样。在plc控制器软件中使用的是os_api_mem_map函数映射得到的设备虚拟地址;微内核中则直接使用内核态的设备虚拟地址。具体到mips架构上,微内核可以通过设备物理地址+0xa0000000得到设备的虚拟地址,这是mips架构的特性。如果是arm或者x86架构,则必须通过其它方法得到设备的虚拟地址,具体实现思路应该是在内核态建立设备的物理地址和虚拟地址映射关系。本技术目前仅对mips架构作了完整实现,对arm或者x86架构未做具体的分析和实现。
103.os_ker_init_norflash函数实现nor-flash的初始化功能。该函数调用nor-flash的初始化函数os_ker_drv_init_norflash实现nor-flash的初始化。
104.os_ker_write_estack_to_norflash函数实现崩溃栈信息写入nor-flash功能。该
函数首先截取崩溃栈信息的最近1000字节,具体截取方法为:找到崩溃线程的起始栈地址和sp值(即堆栈指针),如果二者差值大于1000字节,就从sp开始读取1000字节,否则从sp开始读取实际字节数。为崩溃栈信息增加24字节数据头,24字节数据头包括4字节有效数据长度和20字节保留字段。该函数然后调用nor-flash擦除函数os_ker_drv_erase_norflash_block擦除nor-flash的最后1024字节所在的块。该函数接下来调用nor-flash写入函数os_ker_drv_write_to_norflash将上述信息写入nor-flash中的最后1024字节。
105.os_app_read_estack_from_norflash函数实现从nor-flash读取崩溃栈信息并记入日志功能。该函数调用nor-flash读取函数读取nor-flash的最后1024字节(注意:该nor-flash读取函数之前已有,本技术未作修改)。该函数然后调用日志模块将这1024字节写入日志文件中。
106.此处需要注意的是,微内核运行在内核空间且使用虚拟地址,plc控制器软件运行在用户空间且使用虚拟地址,所以在微内核和plc控制器软件中各有一份独立的nor-flash驱动程序。分别供os_ker_init_norflash、os_ker_write_estack_to_norflash和os_app_read_estack_from_norflash调用。
107.本技术的优点在于:本技术紧紧围绕微内核的特点,适用nor-flash作为交换介质,将线程崩溃栈信息从微内核传递给了plc控制器软件,满足了产品的功能要求。本技术设计的基于微内核操作系统的plc控制器的线程崩溃栈信息记录功能撇弃基于内存和cpu寄存器的传递路径,采用nor-flash做为传递路径,逻辑清晰,绕开了微内核操作系统的很多限制和困境,避免了对微内核的大范围改动。本技术设计的基于微内核操作系统的plc控制器的线程崩溃栈信息记录功能增加了一组函数集,该函数集实现相对简单。
108.图4为本技术实施例的获取线程崩溃的栈信息装置的示意图,如图4所示,本技术实施例提出的一种线程崩溃的栈信息装置,包括存储器和处理器,
109.所述存储器,用于保存用于线程崩溃的栈信息的程序;
110.所述处理器,用于读取执行所述用于线程崩溃的栈信息的程序,执行上述的线程崩溃的栈信息的方法。
111.本技术描述了多个实施例,但是该描述是示例性的,而不是限制性的,并且对于本领域的普通技术人员来说显而易见的是,在本技术所描述的实施例包含的范围内可以有更多的实施例和实现方案。尽管在附图中示出了许多可能的特征组合,并在具体实施方式中进行了讨论,但是所公开的特征的许多其它组合方式也是可能的。除非特意加以限制的情况以外,任何实施例的任何特征或元件可以与任何其它实施例中的任何其他特征或元件结合使用,或可以替代任何其它实施例中的任何其他特征或元件。
112.本技术包括并设想了与本领域普通技术人员已知的特征和元件的组合。本技术已经公开的实施例、特征和元件也可以与任何常规特征或元件组合,以形成由权利要求限定的独特的申请方案。任何实施例的任何特征或元件也可以与来自其它申请方案的特征或元件组合,以形成另一个由权利要求限定的独特的申请方案。因此,应当理解,在本技术中示出和/或讨论的任何特征可以单独地或以任何适当的组合来实现。因此,除了根据所附权利要求及其等同替换所做的限制以外,实施例不受其它限制。此外,可以在所附权利要求的保护范围内进行各种修改和改变。
113.此外,在描述具有代表性的实施例时,说明书可能已经将方法和/或过程呈现为特
定的步骤序列。然而,在该方法或过程不依赖于本文所述步骤的特定顺序的程度上,该方法或过程不应限于所述的特定顺序的步骤。如本领域普通技术人员将理解的,其它的步骤顺序也是可能的。因此,说明书中阐述的步骤的特定顺序不应被解释为对权利要求的限制。此外,针对该方法和/或过程的权利要求不应限于按照所写顺序执行它们的步骤,本领域技术人员可以容易地理解,这些顺序可以变化,并且仍然保持在本技术实施例的精神和范围内。
114.本领域普通技术人员可以理解,上文中所公开方法中的全部或某些步骤、系统、装置中的功能模块/单元可以被实施为软件、固件、硬件及其适当的组合。在硬件实施方式中,在以上描述中提及的功能模块/单元之间的划分不一定对应于物理组件的划分;例如,一个物理组件可以具有多个功能,或者一个功能或步骤可以由若干物理组件合作执行。某些组件或所有组件可以被实施为由处理器,如数字信号处理器或微处理器执行的软件,或者被实施为硬件,或者被实施为集成电路,如专用集成电路。这样的软件可以分布在计算机可读介质上,计算机可读介质可以包括计算机存储介质(或非暂时性介质)和通信介质(或暂时性介质)。如本领域普通技术人员公知的,术语计算机存储介质包括在用于存储信息(诸如计算机可读指令、数据结构、程序模块或其他数据)的任何方法或技术中实施的易失性和非易失性、可移除和不可移除介质。计算机存储介质包括但不限于ram、rom、eeprom、闪存或其他存储器技术、cd-rom、数字多功能盘(dvd)或其他光盘存储、磁盒、磁带、磁盘存储或其他磁存储装置、或者可以用于存储期望的信息并且可以被计算机访问的任何其他的介质。此外,本领域普通技术人员公知的是,通信介质通常包含计算机可读指令、数据结构、程序模块或者诸如载波或其他传输机制之类的调制数据信号中的其他数据,并且可包括任何信息递送介质。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1