CN101615136A - linux环境下快速转换调用堆栈地址的***及方法 - Google Patents
linux环境下快速转换调用堆栈地址的***及方法 Download PDFInfo
- Publication number
- CN101615136A CN101615136A CN200910142259A CN200910142259A CN101615136A CN 101615136 A CN101615136 A CN 101615136A CN 200910142259 A CN200910142259 A CN 200910142259A CN 200910142259 A CN200910142259 A CN 200910142259A CN 101615136 A CN101615136 A CN 101615136A
- Authority
- CN
- China
- Prior art keywords
- function
- address
- information
- module
- public
- 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
Links
Images
Landscapes
- Executing Machine-Instructions (AREA)
Abstract
本发明公开了一种linux环境下快速转换调用堆栈地址的***及方法,提高了linux环境下获取函数调用堆栈的效率。其中该方法包括:建立一包含有若干公共线程的公共线程池;需要保存当前堆栈信息时,获取函数调用堆栈地址信息;从每一层的堆栈地址信息中解析出函数地址数组,将函数地址数组与当前堆栈相关信息组合成一个结构体对象并缓存到一缓存队列中;遍历缓存队列中的每个节点,用公共线程池并行处理每个节点的每层函数地址的转换操作,得到转换结果。与现有技术相比,本发明提高了linux环境下获取函数调用堆栈的效率,在实际应用中频繁执行此操作时,提高了***性能。
Description
技术领域
本发明涉及计算机技术领域,尤其涉及,具体地说,是涉及一种linux环境下快速转换调用堆栈地址的***及方法。
背景技术
在Linux环境下,一般查看函数运行时堆栈的方法是使用GDB之类的外部调试器。但是,有些时候为了分析程序的BUG,在需要的时候打印出函数的调用堆栈信息是非常有用的。
现有技术通常调用backtrace函数和backtrace_symbols函数,来获取函数调用堆栈信息,每一层堆栈信息的格式如下所示:
/应用程序名[函数地址]。
具体的例子如下:
/kernel[0x804869c]。
由此可以看出,获取的其实只是函数地址,并不是具体的函数名称和源代码行数。想要获取更详细的信息,还必须执行终端命令addr2line来进行转换:
addr2line-f 0x804869c-e kernel>file1。
该命令把指定应用程序(kernel)对应函数地址的具体函数信息保存到file1文件中,保存信息的格式如下例所示:
os_malloc
/root/src/pub/err.c:69。
在file1文件中,第一行保存的是具体的函数名称,第二行是函数源代码的行数。
因此,现有技术在Linux环境下获取函数调用堆栈的流程,如图1所示,主要包括如下几个步骤:
步骤S110,调用backtrace函数和backtrace symbols函数,获取函数调用堆栈地址信息;
步骤S120,从每一层的堆栈地址信息中解析出函数地址;
步骤S130,调用system函数执行addr2line命令,把函数地址转换成具体的函数名称和函数源代码行数,保存到一临时文件中;
步骤S140,读取临时文件,从中解析出函数名称和函数源代码行数。
由于步骤S130及步骤S140中,需要进行临时文件的辅助转换(把函数地址转换成函数名及源代码行数这一转换),在实际应用中不适合频繁调用该操作,否则会严重影响程序的执行性能,因此有必要对现有的Linux环境下获取函数调用堆栈技术加以改进,以提高***运行效率。
发明内容
本发明所要解决的技术问题,在于需要提供一种linux环境下快速转换调用堆栈地址的***及方法,以提高linux环境下获取函数调用堆栈的效率。
为了解决上述技术问题,本发明提供了一种linux环境下快速转换调用堆栈地址的方法,包括:
建立一包含有若干公共线程的公共线程池;
需要保存当前堆栈信息时,获取函数调用堆栈地址信息;
从每一层的堆栈地址信息中解析出函数地址数组,将所述函数地址数组与当前堆栈相关信息组合成一个结构体对象并缓存到一缓存队列中;
遍历所述缓存队列中的每个节点,用所述公共线程池并行处理每个节点的每层函数地址的转换操作,得到转换结果。
优选地,该方法进一步包括:
将一个结构体对象作为一个信息节点,将所有信息节点组成一个查询表;
抛弃所述转换操作的中间结果时,根据所述查询表从所述缓存队列中删除所述中间结果对应的信息节点。
优选地,用所述公共线程池中的公共线程并行处理所述转换操作,每个公共线程得到一基本堆栈结果;
对所有的基本堆栈结果进行组合,得到所述转换结果。
优选地,该方法进一步包括:
转换函数地址时,将函数地址转换成函数名称和函数源代码行数,保存到一临时文件中;
读取所述临时文件,从所述临时文件中解析出函数名称和函数源代码行数。
优选地,该方法进一步包括:
建立一全局的函数地址映射表;
从所述临时文件中解析出函数名称和函数源代码行数后,将所述函数名称及函数源代码行数保存到所述函数地址映射表中;
转换函数地址时,查询所述函数地址映射表,查询到相应的匹配结果则完成所述转换操作,否则将函数地址转换成函数名称及函数源代码行数。
为了解决上述技术问题,本发明还提供了一种linux环境下快速转换调用堆栈地址的***,包括建立模块、获取模块、解析模块、组合模块、缓存队列及处理模块,其中:
所述建立模块,用于建立一包含有若干公共线程的公共线程池;
所述获取模块,用于在需要保存当前堆栈信息时,获取函数调用堆栈地址信息;
所述解析模块,用于从每一层的堆栈地址信息中解析出函数地址数组;
所述组合模块,用于将所述函数地址数组与当前堆栈相关信息组合成一个结构体对象;
所述缓存队列,用于缓存所述组合模块组合的所述结构体对象;
所述处理模块,用于遍历所述缓存队列中的每个节点,用所述公共线程池并行处理每个节点的每层函数地址的转换操作,得到转换结果。
优选地,该***进一步包括删除模块:
所述组合模块,进一步将一个结构体对象作为一个信息节点,然后将所有信息节点组成一个查询表;
所述删除模块,在需要抛弃所述转换操作的中间结果时,根据所述查询表从所述缓存队列中删除所述中间结果对应的信息节点。
优选地,所述处理模块,用所述公共线程池中的公共线程并行处理所述转换操作,每个公共线程得到一基本堆栈结果,然后对所有的基本堆栈结果进行组合,得到所述转换结果。
优选地,所述处理模块,转换函数地址时进一步将函数地址转换成函数名称和函数源代码行数,保存到一临时文件中;读取所述临时文件,从所述临时文件中解析出函数名称和函数源代码行数。
优选地,所述处理模块,进一步建立一全局的函数地址映射表,从所述临时文件中解析出函数名称和函数源代码行数后,将所述函数名称及函数源代码行数保存到所述函数地址映射表中;在转换函数地址时,查询所述函数地址映射表,查询到相应的匹配结果则完成所述转换操作,否则将函数地址转换成函数名称及函数源代码行数。
与现有技术相比,本发明提高了linux环境下获取函数调用堆栈的效率,在实际应用中频繁执行此操作时,提高了***性能。
附图说明
图1为现有技术在Linux环境下获取函数调用堆栈实施例的流程示意图;
图2为本发明快速转换调用堆栈地址方法实施例的流程示意图;
图3为本发明检测内存泄露时转换调用堆栈地址应用实例的流程示意图;
图4为本发明linux环境下快速转换调用堆栈地址的***实施例的组成示意图。
具体实施方式
以下将结合附图及实施例来详细说明本发明的实施方式,借此对本发明如何应用技术手段来解决技术问题,并达成技术效果的实现过程能充分理解并据以实施。
图1所示现有技术调用堆栈实施例的步骤S130及步骤S140中,调用system函数执行addr2line命令并解析文件的时间开销非常大。
图2是本发明快速转换调用堆栈地址方法实施例的流程示意图,如图2所示,该实施例主要包括如下步骤:
步骤S210,建立一公共线程池,该公共线程池包含有若干用于后续转换操作的公共线程;
步骤S220,当需要保存当前堆栈信息时,调用backtrace函数和backtrace symbols函数,获取函数调用堆栈地址信息;
步骤S230,从每一层的堆栈地址信息中解析出函数地址数组,将该函数地址数组及与当前堆栈相关信息组合成一个结构体对象;
步骤S240,将该结构体对象缓存到一个缓存队列中,而不是立即进行后续的转换操作,只有需要输出给用户时,才进行转换;在缓存队列中,将每一个结构体对象作为一个信息节点,所有信息节点组成一个查询表;
在实际应用时,可以抛弃部分中间结果,即临时保存的一些基本堆栈信息,比如函数地址数组及当前堆栈相关信息组成的结构体对象,这些中间结果并不需要输出,且不会应用于后续操作,这样做节约部分中间结果转换所带来的时间开销;
当需要抛弃一些中间结果时,用map在缓存队列的查询表中进行快速检索,从而删除对应于缓存队列中不再需要结构体对象的信息节点;
步骤S250,需要输出详细的堆栈结果时,遍历缓存队列中的每一个节点,用该公共线程池中的公共线程来并行处理当前节点的每一层函数地址的转换操作,每个公共线程得到一基本堆栈结果;
步骤S260,对所有公共线程的基本堆栈结果进行组合,获得最终的转换结果,然后输出该转换结果。
其中,上述步骤S250,该公共线程池中的公共线程并行处理当前节点每一层函数地址的转换操作,主要包括如下步骤:
步骤S251,在转换当前函数地址时,调用system函数执行addr2line命令,把函数地址转换成具体的函数名称和函数源代码行数,保存到一临时文件中;
步骤S252,读取该临时文件,从该临时文件中解析出函数名称和函数源代码行数,并将函数名称及函数源代码行数保存到函数地址映射表中。
步骤S253,返回当前线程的执行结果。
本发明还可以通过建立函数地址映射表,可以节约频繁转换所带来的时间开销。比如在建立该公共线程池之后,使用map建立一全局的函数地址映射表;在从临时文件中解析出函数名称及函数源代码行数之后,将该函数名称及函数源代码行数保存到该函数地址映射表中;后续对于相同的转换操作,在输出堆栈结果时,即可首先查询该函数地址映射表,如果查询到相匹配的结果则直接输出该映射表所保存的信息,否则再进行转换。
以下通过监测内存泄露为例来说明本发明的详细过程。图3为本发明检测内存泄露时转换调用堆栈地址应用实例的流程示意图。如图3所示,该应用实例主要包括如下步骤:
步骤S310,建立一公共线程池,包含50个用于后续转换操作的公共线程;
步骤S320,使用map建立一全局的函数地址映射表,可以在该映射表中查找指定函数地址的转换结果;
步骤S330,一上层模块调用new或malloc等操作来分配内存空间,内存泄露监测模块捕获到该上层某模块分配内存的操作时,调用backtrace函数和backtrace_symbols函数获取该上层模块的函数调用堆栈;
步骤S340,将基本堆栈结果(即函数地址数组)、内存分配时分配的内存指针以及分配的空间大小组合成一结构体对象;
步骤S350,将该结构体对象保存到分配信息队列中,作为后续统计的依据;
步骤S360,上层模块调用delete或free函数释放内存时,内存泄露监测模块捕获到上层模块释放内存的操作,于是从分配信息队列中将对应指针的节点删除;
步骤S370,用户输入命令,要求输出当前未被释放内存的相关信息,则内存泄露监测模块遍历分配信息队列的每个节点,获取每个节点的基本堆栈结果(即一个函数地址数组),并使用20个公共线程并行地对20层堆栈地址进行转换,每个线程的处理步骤如步骤S371至步骤S374所述;
步骤S371,转换当前节点时,先查找函数地址映射表,如果找到相应的匹配结果,则转步骤S374,如果没有找到相应的匹配结果,则转步骤S372;
步骤S372,调用system函数执行addr2line命令,把函数地址转换成具体的函数名称和源代码行数,保存到临时文件file_n中;
步骤S373,读取临时文件file_n,从中解析出函数名称和源代码行数,并将结果保存到函数地址映射表中;
步骤S374,返回转换后的结果,当前线程处理结束。
步骤S380,等待所有20个公共线程都处理结束后,将当前节点标记为已转换,避免下次输出时重复操作,并返回所有公共线程的组合结果;
步骤S390,内存泄露监测模块将当前堆栈信息逐层输出到屏幕或文件,供用户查看该内存指针是如何被分配的。
图4为本发明linux环境下快速转换调用堆栈地址的***实施例的组成示意图。如图4所示,该***实施例主要包括建立模块410、获取模块420、解析模块430、组合模块440、缓存队列450及处理模块460,其中:
建立模块410,用于建立一包含有若干公共线程的公共线程池;
获取模块420,用于在需要保存当前堆栈信息时,获取函数调用堆栈地址信息;
解析模块430,用于从每一层的堆栈地址信息中解析出函数地址数组;
组合模块440,用于将函数地址数组与当前堆栈相关信息组合成一个结构体对象;
缓存队列450,用于缓存组合模块440组合的结构体对象;
处理模块460,用于遍历缓存队列450中的每个节点,用公共线程池并行处理每个节点的每层函数地址的转换操作,得到转换结果。
如图4所示,该***还可以进一步包括删除模块470,在组合模块440将一个结构体对象作为一个信息节点并将所有信息节点组成一个查询表后,删除模块470在需要抛弃转换操作的中间结果时,根据查询表从缓存队列450中删除中间结果对应的信息节点。
上述处理模块460,用公共线程池中的公共线程并行处理转换操作,每个公共线程得到一基本堆栈结果,然后对所有的基本堆栈结果进行组合,得到转换结果。
上述处理模块460,转换函数地址时可以进一步将函数地址转换成函数名称和函数源代码行数,保存到一临时文件中;读取临时文件,从临时文件中解析出函数名称和函数源代码行数。
上述处理模块460,可以进一步建立一全局的函数地址映射表,从临时文件中解析出函数名称和函数源代码行数后,将函数名称及函数源代码行数保存到函数地址映射表中;在转换函数地址时,查询函数地址映射表,查询到相应的匹配结果则完成转换操作,否则将函数地址转换成函数名称及函数源代码行数。
本发明相对于现有技术的改进,主要体现在如下几个方面:
(1)延迟处理;将堆栈信息的转换操作尽量延迟,过滤掉一些临时信息转换所带来的时间开销,节约了时间成本;
(2)并行处理;采用多线程方式同时处理堆栈信息的每一层函数地址,提高了转换速度,提高了处理效率;
(3)使用函数地址映射表,以空间换取时间;由于函数地址映射表的辅助,在多次转换同一函数地址的情况下,除了第一次需要使用现有技术的方案进行转换外,后续的操作都在内存中直接处理,速度更快进一步提高了处理效率。
因此,本发明有效提高了***的执行效率,尤其对调用频率较高的应用,改进前后的性能对比非常明显。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉该技术的人员在本发明所揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。
Claims (10)
1、一种linux环境下快速转换调用堆栈地址的方法,其特征在于,包括:
建立一包含有若干公共线程的公共线程池;
需要保存当前堆栈信息时,获取函数调用堆栈地址信息;
从每一层的堆栈地址信息中解析出函数地址数组,将所述函数地址数组与当前堆栈相关信息组合成一个结构体对象并缓存到一缓存队列中;
遍历所述缓存队列中的每个节点,用所述公共线程池并行处理每个节点的每层函数地址的转换操作,得到转换结果。
2、如权利要求1所述的方法,其特征在于,该方法进一步包括:
将一个结构体对象作为一个信息节点,将所有信息节点组成一个查询表;
抛弃所述转换操作的中间结果时,根据所述查询表从所述缓存队列中删除所述中间结果对应的信息节点。
3、如权利要求1所述的方法,其特征在于:
用所述公共线程池中的公共线程并行处理所述转换操作,每个公共线程得到一基本堆栈结果;
对所有的基本堆栈结果进行组合,得到所述转换结果。
4、如权利要求3所述的方法,其特征在于,该方法进一步包括:
转换函数地址时,将函数地址转换成函数名称和函数源代码行数,保存到一临时文件中;
读取所述临时文件,从所述临时文件中解析出函数名称和函数源代码行数。
5、如权利要求4所述的方法,其特征在于,该方法进一步包括:
建立一全局的函数地址映射表;
从所述临时文件中解析出函数名称和函数源代码行数后,将所述函数名称及函数源代码行数保存到所述函数地址映射表中;
转换函数地址时,查询所述函数地址映射表,查询到相应的匹配结果则完成所述转换操作,否则将函数地址转换成函数名称及函数源代码行数。
6、一种linux环境下快速转换调用堆栈地址的***,其特征在于,包括建立模块、获取模块、解析模块、组合模块、缓存队列及处理模块,其中:
所述建立模块,用于建立一包含有若干公共线程的公共线程池;
所述获取模块,用于在需要保存当前堆栈信息时,获取函数调用堆栈地址信息;
所述解析模块,用于从每一层的堆栈地址信息中解析出函数地址数组;
所述组合模块,用于将所述函数地址数组与当前堆栈相关信息组合成一个结构体对象;
所述缓存队列,用于缓存所述组合模块组合的所述结构体对象;
所述处理模块,用于遍历所述缓存队列中的每个节点,用所述公共线程池并行处理每个节点的每层函数地址的转换操作,得到转换结果。
7、如权利要求6所述的***,其特征在于,该***进一步包括删除模块:
所述组合模块,进一步将一个结构体对象作为一个信息节点,然后将所有信息节点组成一个查询表;
所述删除模块,在需要抛弃所述转换操作的中间结果时,根据所述查询表从所述缓存队列中删除所述中间结果对应的信息节点。
8、如权利要求6所述的***,其特征在于:
所述处理模块,用所述公共线程池中的公共线程并行处理所述转换操作,每个公共线程得到一基本堆栈结果,然后对所有的基本堆栈结果进行组合,得到所述转换结果。
9、如权利要求8所述的***,其特征在于:
所述处理模块,转换函数地址时进一步将函数地址转换成函数名称和函数源代码行数,保存到一临时文件中;读取所述临时文件,从所述临时文件中解析出函数名称和函数源代码行数。
10、如权利要求9所述的***,其特征在于:
所述处理模块,进一步建立一全局的函数地址映射表,从所述临时文件中解析出函数名称和函数源代码行数后,将所述函数名称及函数源代码行数保存到所述函数地址映射表中;在转换函数地址时,查询所述函数地址映射表,查询到相应的匹配结果则完成所述转换操作,否则将函数地址转换成函数名称及函数源代码行数。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2009101422599A CN101615136B (zh) | 2009-06-26 | 2009-06-26 | linux环境下快速转换调用堆栈地址的***及方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2009101422599A CN101615136B (zh) | 2009-06-26 | 2009-06-26 | linux环境下快速转换调用堆栈地址的***及方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101615136A true CN101615136A (zh) | 2009-12-30 |
CN101615136B CN101615136B (zh) | 2012-07-18 |
Family
ID=41494794
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2009101422599A Active CN101615136B (zh) | 2009-06-26 | 2009-06-26 | linux环境下快速转换调用堆栈地址的***及方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101615136B (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104572046A (zh) * | 2013-10-16 | 2015-04-29 | 腾讯科技(深圳)有限公司 | 一种堆栈还原方法和计算机*** |
CN105653388A (zh) * | 2016-01-29 | 2016-06-08 | 浪潮(北京)电子信息产业有限公司 | 一种集群文件***中客户端进程信息的诊断方法 |
CN105893240A (zh) * | 2015-11-20 | 2016-08-24 | 乐视致新电子科技(天津)有限公司 | 一种Android程序调试方法和装置 |
CN109716730A (zh) * | 2016-09-09 | 2019-05-03 | 微软技术许可有限责任公司 | 生产应用的自动化性能调试 |
CN110727480A (zh) * | 2019-09-05 | 2020-01-24 | 北京字节跳动网络技术有限公司 | 获取调用栈栈帧指令偏移的方法、装置、介质和设备 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100535870C (zh) * | 2006-12-29 | 2009-09-02 | 中兴通讯股份有限公司 | 嵌入式***中进程异常跟踪定位的方法 |
-
2009
- 2009-06-26 CN CN2009101422599A patent/CN101615136B/zh active Active
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104572046A (zh) * | 2013-10-16 | 2015-04-29 | 腾讯科技(深圳)有限公司 | 一种堆栈还原方法和计算机*** |
CN104572046B (zh) * | 2013-10-16 | 2019-01-11 | 腾讯科技(深圳)有限公司 | 一种堆栈还原方法和计算机*** |
CN105893240A (zh) * | 2015-11-20 | 2016-08-24 | 乐视致新电子科技(天津)有限公司 | 一种Android程序调试方法和装置 |
CN105653388A (zh) * | 2016-01-29 | 2016-06-08 | 浪潮(北京)电子信息产业有限公司 | 一种集群文件***中客户端进程信息的诊断方法 |
CN109716730A (zh) * | 2016-09-09 | 2019-05-03 | 微软技术许可有限责任公司 | 生产应用的自动化性能调试 |
CN110727480A (zh) * | 2019-09-05 | 2020-01-24 | 北京字节跳动网络技术有限公司 | 获取调用栈栈帧指令偏移的方法、装置、介质和设备 |
CN110727480B (zh) * | 2019-09-05 | 2023-04-07 | 北京字节跳动网络技术有限公司 | 获取调用栈栈帧指令偏移的方法、装置、介质和设备 |
Also Published As
Publication number | Publication date |
---|---|
CN101615136B (zh) | 2012-07-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101615136B (zh) | linux环境下快速转换调用堆栈地址的***及方法 | |
CN101944114B (zh) | 内存数据库和物理数据库间的数据同步方法 | |
US6317756B1 (en) | On-the-fly garbage collector | |
US6862674B2 (en) | Methods and apparatus for performing a memory management technique | |
CN102754394B (zh) | 一种哈希表存储、查找方法以及装置 | |
CN105786918B (zh) | 基于数据载入存储空间的数据查询方法和装置 | |
US20140115291A1 (en) | Numa optimization for garbage collection of multi-threaded applications | |
US10031843B2 (en) | Managing memory in a computer system | |
CN104394096A (zh) | 一种基于多核处理器的报文处理方法及多核处理器 | |
CN111752972B (zh) | 基于RocksDB的key-value存储模式下的数据关联查询方法及*** | |
CN101290590A (zh) | 一种嵌入式操作***中切换任务的方法和单元 | |
CN103034538A (zh) | 一种嵌入式操作***中驱动程序的多级缓存处理方法 | |
CN114327917A (zh) | 内存管理方法、计算设备及可读存储介质 | |
CN115391427A (zh) | Impala自动化伸缩的***、方法、介质及设备 | |
CN102917036A (zh) | 一种基于Memcached的分布式缓存数据同步实现方法 | |
KR101830504B1 (ko) | 분산 환경 기반 빅데이터 실시간 분석을 위한 인-메모리 db 연결 지원형 스케줄링 방법 및 시스템 | |
CN110109677B (zh) | 一种动态对象缓存池分配方法 | |
CN111580932A (zh) | 一种虚拟机磁盘在线迁移去冗余方法 | |
US20200327051A1 (en) | Hybrid garbage collection | |
CN100351813C (zh) | 数字信号处理***中访问存储单元的方法及其处理*** | |
CN105893521A (zh) | 一种读写分离的HBase入库方法 | |
CN103995741A (zh) | 一种Java虚拟机分代垃圾快速回收方法 | |
CN113312181A (zh) | 一种基于activiti自定义表单的高并发工作流审批方法 | |
CN103152620B (zh) | 动态加载不同在线视频的方法和*** | |
JPS60204048A (ja) | 仮想記憶方式 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |