CN114490368B - 一种过滤自定义Python脚本函数调用堆栈的方法 - Google Patents

一种过滤自定义Python脚本函数调用堆栈的方法 Download PDF

Info

Publication number
CN114490368B
CN114490368B CN202210058112.7A CN202210058112A CN114490368B CN 114490368 B CN114490368 B CN 114490368B CN 202210058112 A CN202210058112 A CN 202210058112A CN 114490368 B CN114490368 B CN 114490368B
Authority
CN
China
Prior art keywords
script
stack
function call
platform
function
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.)
Active
Application number
CN202210058112.7A
Other languages
English (en)
Other versions
CN114490368A (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.)
Shanghai Observation Future Information Technology Co ltd
Original Assignee
Shanghai Cloudcare Information 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 Shanghai Cloudcare Information Technology Co ltd filed Critical Shanghai Cloudcare Information Technology Co ltd
Priority to CN202210058112.7A priority Critical patent/CN114490368B/zh
Publication of CN114490368A publication Critical patent/CN114490368A/zh
Application granted granted Critical
Publication of CN114490368B publication Critical patent/CN114490368B/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/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3628Software debugging of optimised code
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3644Software debugging by instrumenting at runtime

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Executing Machine-Instructions (AREA)

Abstract

本发明提供一种过滤自定义Python脚本函数调用堆栈的方法,包括:平台服务器接收平台前端的脚本执行请求,执行脚本并在自定义脚本的外层捕捉报错信息;调用异常解析函数逐层解析报错的函数调用堆栈;过滤函数调用堆栈;将过滤后的函数调用堆栈重新格式化;平台服务器通过HTTP响应将过滤并重新格式化后的函数调用堆栈信息返回平台前端,平台前端将函数调用堆栈信息展示在Web界面中。本发明利用Python内置的堆栈解析工具,依次解析函数调用堆栈中的每一层,剔除了与平台相关的堆栈信息,实现了对用户自定义脚本中报错后输出的堆栈进行过滤,隐藏了平台代码相关内容的处理,达到了保护平台代码不被暴露的效果。

Description

一种过滤自定义Python脚本函数调用堆栈的方法
技术领域
本发明涉及计算机程序设计技术领域,具体而言,涉及一种过滤自定义Python脚本函数调用堆栈的方法。
背景技术
在支持用户自定义Python脚本的***中,对于用户编写自定义Python脚本在运行出错时,Python程序会中断处理并输出函数调用堆栈。然而由于平台属于用户自定义脚本的调用方,因此Python程序输出的函数调用堆栈也会把平台相关的代码信息一并输出。这样一方面会对用户调试自己编写的代码带来困扰,另一方面也会一定程度上导致平台代码结构的暴露。
支持在主程序中执行用户自定义脚本的平台,对于所执行的脚本的报错,要么就原样输出包含平台本身代码的函数堆栈信息,要么只会输出最终错误内容,即:不输出堆栈信息,只输出错误信息。
发明内容
鉴于此,本发明的目的在于对执行用户自定义Python脚本报错后输出的堆栈信息进行过滤,去除平台相关代码信息,增强***的安全性。
本发明利用Python内置的堆栈解析工具,依次解析函数调用堆栈中的每一层,剔除与平台相关的堆栈信息,实现对用户自定义脚本中报错后输出的堆栈进行过滤,隐藏平台代码相关内容的处理。
本发明方法的实现核心在于捕获直接从用户脚本中跑错的错误,解析并遍历后剔除和平台相关内容的处理。
本发明提供一种过滤自定义Python脚本函数调用堆栈的方法,包括以下步骤:
a1、在平台Web界面编辑脚本代码,选择执行脚本,通过平台前端向平台服务器发送脚本执行请求;
a2、平台服务器接收到脚本执行请求后,执行脚本并在用户自定义脚本的外层捕捉报错信息;
a3、调用Python自带的异常解析函数逐层解析所述报错信息的函数调用堆栈;
a4、过滤函数调用堆栈,剔除与平台代码相关的堆栈;
a5、将过滤后的函数调用堆栈重新格式化并返回平台服务器;
a6、平台服务器通过HTTP响应将过滤并重新格式化后的函数调用堆栈信息返回平台前端,平台前端接收到HTTP响应后,将函数调用堆栈信息展示在Web界面中,供用户查看。
进一步地,所述a2步骤的所述脚本执行请求的内容包括所需执行的脚本ID、所需执行的函数名。
进一步地,所述a2步骤的所述执行脚本并在用户自定义脚本的外层捕捉报错信息的方法包括:调用runscript函数run_script(user_script)来执行用户脚本,并使用Python异常处理try...except捕获从脚本运行中抛出的错误。
进一步地,所述a3步骤的所述调用Python自带的异常解析函数逐层解析报错的函数调用堆栈的方法包括:
在错误处理except代码块中,调用Python自带的sys.exc_info函数,获取异常堆栈数据tb;
调用filterstack函数filter_stack(tb),参数tb即所述获取的异常堆栈数据,filter_stack(tb)函数使用传入的tb,循环获取每一层堆栈的详细信息,所述详细信息包括:所在脚本文件路径、代码行号、函数名称、出错行代码。
进一步地,所述a4步骤的所述过滤函数调用堆栈的方法包括:
如所在脚本文件路径处于平台代码目录下,则认为这一层为平台代码,不输出堆栈列表,跳过;
如所在脚本文件路径不处于平台代码目录下,则认为这一层需要输出,加入待输出堆栈列表。
进一步地,所述a5步骤的所述将过滤后的函数调用堆栈重新格式化的方法包括:
过滤函数处理堆栈数据的循环完毕后,将待输出堆栈列表按照所在脚本路径,代码行号,函数名称,出错行代码的格式:「File "<所在脚本路径>", line <代码行号>, in<函数名称>\n<出错行代码>」格式生成堆栈信息文本,并返回平台服务器。
本发明还提供一种计算机可读存储介质,其上存储有计算机程序,所述程序被处理器执行时实现上述所述过滤自定义Python脚本函数调用堆栈的方法的步骤。
本发明还提供一种计算机设备,所述计算机设备包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如上述所述过滤自定义Python脚本函数调用堆栈的方法的步骤。
与现有技术相比,本发明的有益效果是:
本发明利用Python内置的堆栈解析工具,对在自定义脚本运行中的报错,依次解析函数调用堆栈中的每一层,剔除了与平台相关的堆栈信息,实现了对用户自定义脚本中报错后输出的堆栈进行过滤,隐藏了平台代码相关内容的处理,不会输出和平台相关的函数调用堆栈信息,达到了保护平台代码不被暴露的效果。
附图说明
通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术用户员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。
在附图中:
图1是本发明一种过滤自定义Python脚本函数调用堆栈的方法流程图;
图2是本发明实施例计算机设备的构成架构图;
图3是本发明实施例错误的堆栈信息展示在Web界面的界面截图;
图4是本发明实施例捕获用户脚本运行中异常报错信息的示意图。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本公开相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本公开的一些方面相一致的装置和方法的例子。
在本公开使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本公开。在本公开和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
应当理解,尽管在本公开可能采用术语第一、第二、第三来描述各种信号,但这些信号不应限于这些术语。这些术语仅用来将同一类型的信号彼此区分开。例如,在不脱离本公开范围的情况下,第一信号也可以被称为第二信号,类似地,第二信号也可以被称为第一信号。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
本发明实施例方法的实现核心在于捕获直接从用户脚本中跑错的错误,解析并遍历后剔除和平台相关内容的处理。
本发明实施例提供一种提取自定义脚本print函数输出内容的方法,参见图1所示,包括以下步骤:
a1、在平台Web界面编辑脚本代码,选择执行脚本,通过平台前端向平台服务器发送脚本执行请求;
参见图4所示,本发明实施例调用的用户自定义脚本里的函数为 runscript函数run_script(user_script),其中,参数user_script为用户自定义脚本代码;
a2、平台服务器接收到脚本执行请求后,执行脚本并在用户自定义脚本的外层捕捉报错信息;
a3、调用Python自带的异常解析函数逐层解析所述报错信息的函数调用堆栈;
a4、过滤函数调用堆栈,剔除与平台代码相关的堆栈;
a5、将过滤后的函数调用堆栈重新格式化并返回平台服务器;
a6、平台服务器通过HTTP响应将过滤并重新格式化后的函数调用堆栈信息返回平台前端,平台前端接收到HTTP响应后,将函数调用堆栈信息展示在Web界面中,供用户查看。
所述a2步骤的所述脚本执行请求的内容包括所需执行的脚本ID、所需执行的函数名。
所述a2步骤的所述执行脚本并在用户自定义脚本的外层捕捉报错信息的方法包括:调用runscript 函数run_script(user_script)来执行用户脚本,并使用Python异常处理try...except捕获从脚本运行中抛出的错误。
所述a3步骤的所述调用Python自带的异常解析函数逐层解析报错的函数调用堆栈的方法包括:
在错误处理except代码块中,调用Python自带的sys.exc_info函数,获取异常堆栈数据tb;
调用filter_stack(tb)函数,参数tb即所述获取的异常堆栈数据,filter_stack(tb)函数使用传入的tb,循环获取每一层堆栈的详细信息,所述详细信息包括:所在脚本文件路径、代码行号、函数名称、出错行代码。
所述a4步骤的所述过滤函数调用堆栈的方法包括:
如所在脚本文件路径处于平台代码目录下,则认为这一层为平台代码,不输出堆栈列表,跳过;
如所在脚本文件路径不处于平台代码目录下,则认为这一层需要输出,加入待输出堆栈列表。
所述a5步骤的所述将过滤后的函数调用堆栈重新格式化的方法包括:
过滤函数处理堆栈数据的循环完毕后,将待输出堆栈列表按照所在脚本路径,代码行号,函数名称,出错行代码的格式:「File "<所在脚本路径>", line <代码行号>, in<函数名称>\n<出错行代码>」格式生成堆栈信息文本,并返回平台服务器。
实施例
一个由用户登录***后自行编写的自定义脚本,其中包含用户编写的函数try_error,处理内容中存在除0的错误。
1. 用户在平台中指定此try_error函数后执行;
2. ***运行用户自定义脚本后,捕捉到错误;
3. ***将错误过滤并重新格式化后,将错误的堆栈信息通过HTTP响应返回平台前端;
4. 平台前端根据HTTP响应返回,将用户脚本运行中错误的堆栈信息展示在Web界面中即可。
而在以往,这类输出信息都会不经过过滤直接展示给用户,或干脆不返回,只有最后一个行的错误描述(如:ZeroDivisionError: division by zero),参见图3所示;
而此错误的完整堆栈在终端中如下:
Traceback (most recent call last):
File
"/mnt/hgfs/git-pastgift/zhuyun/middlewares/dataflux-func/worker/tasks/main/func_debugger.py", line 184, in func_debugger
func_resp = entry_func(**func_call_kwargs)
File "demo__error", line 11, in try_error
File "demo__error", line 8, in sub_func
File "demo__error", line 4, in sub_func2
ZeroDivisionError: division by zero
其中,「/mnt/hgfs/...func_debugger.py」即为平台代码所在位置。经过本发明方法的处理后被隐藏,只会返回用户脚本相关的层。
本发明实施例利用Python内置的堆栈解析工具,对在自定义脚本运行中的报错,依次解析函数调用堆栈中的每一层,剔除了与平台相关的堆栈信息,实现了对用户自定义脚本中报错后输出的堆栈进行过滤,隐藏了平台代码相关内容的处理,不会输出和平台相关的函数调用堆栈信息,达到了保护平台代码不被暴露的效果。
本发明实施例还提供了一种计算机设备,图2是本发明实施例提供的一种计算机设备的结构示意图;参见附图图2所示,该计算机设备包括:输入装置23、输出装置24、存储器22和处理器21;所述存储器22,用于存储一个或多个程序;当所述一个或多个程序被所述一个或多个处理器21执行,使得所述一个或多个处理器21实现如上述实施例提供的过滤自定义Python脚本函数调用堆栈的方法;其中输入装置23、输出装置24、存储器22和处理器21可以通过总线或者其他方式连接,图2中以通过总线连接为例。
存储器22作为一种计算设备可读写存储介质,可用于存储软件程序、计算机可执行程序,如本发明实施例所述的过滤自定义Python脚本函数调用堆栈的方法对应的程序指令;存储器22可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作***、至少一个功能所需的应用程序;存储数据区可存储根据设备的使用所创建的数据等;此外,存储器22可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件;在一些实例中,存储器22可进一步包括相对于处理器21远程设置的存储器,这些远程存储器可以通过网络连接至设备。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
输入装置23可用于接收输入的数字或字符信息,以及产生与设备的用户设置以及功能控制有关的键信号输入;输出装置24可包括显示屏等显示设备。
处理器21通过运行存储在存储器22中的软件程序、指令以及模块,从而执行设备的各种功能应用以及数据处理,即实现上述的过滤自定义Python脚本函数调用堆栈的方法。
上述提供的计算机设备可用于执行上述实施例提供的过滤自定义Python脚本函数调用堆栈的方法,具备相应的功能和有益效果。
本发明实施例还提供一种包含计算机可执行指令的存储介质,所述计算机可执行指令在由计算机处理器执行时用于执行如上述实施例提供的过滤自定义Python脚本函数调用堆栈的方法,存储介质是任何的各种类型的存储器设备或存储设备,存储介质包括:安装介质,例如CD-ROM、软盘或磁带装置;计算机***存储器或随机存取存储器,诸如DRAM、DDR RAM、SRAM、EDO RAM,兰巴斯(Rambus)RAM等;非易失性存储器,诸如闪存、磁介质(例如硬盘或光存储);寄存器或其它相似类型的存储器元件等;存储介质可以还包括其它类型的存储器或其组合;另外,存储介质可以位于程序在其中被执行的第一计算机***中,或者可以位于不同的第二计算机***中,第二计算机***通过网络(诸如因特网)连接到第一计算机***;第二计算机***可以提供程序指令给第一计算机用于执行。存储介质包括可以驻留在不同位置中(例如在通过网络连接的不同计算机***中)的两个或更多存储介质。存储介质可以存储可由一个或多个处理器执行的程序指令(例如具体实现为计算机程序)。
当然,本发明实施例所提供的一种包含计算机可执行指令的存储介质,其计算机可执行指令不限于如上实施例所述的过滤自定义Python脚本函数调用堆栈的方法,还可以执行本发明任意实施例所提供的过滤自定义Python脚本函数调用堆栈的方法中的相关操作。
至此,已经结合附图所示的优选实施方式描述了本发明的技术方案,但是,本领域技术用户员容易理解的是,本发明的保护范围显然不局限于这些具体实施方式。在不偏离本发明的原理的前提下,本领域技术用户员可以对相关技术特征做出同的更改或替换,这些更改或替换之后的技术方案都将落入本发明的保护范围之内。
以上所述仅为本发明的优选实施例,并不用于限制本发明;对于本领域的技术用户员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、同替换、改进,均应包含在本发明的保护范围之内。

Claims (8)

1.一种过滤自定义Python脚本函数调用堆栈的方法,其特征在于,包括以下步骤:
a1、在平台Web界面编辑脚本代码,选择执行脚本,通过平台前端向平台服务器发送脚本执行请求;
a2、平台服务器接收到脚本执行请求后,执行脚本并在用户自定义脚本的外层捕捉报错信息;
a3、调用Python自带的异常解析函数逐层解析所述报错信息的函数调用堆栈;
a4、过滤所述函数调用堆栈,剔除与平台代码相关的堆栈;
a5、将过滤后的函数调用堆栈重新格式化并返回平台服务器;
a6、平台服务器通过HTTP响应将过滤并重新格式化后的函数调用堆栈信息返回平台前端,平台前端接收到HTTP响应后,将函数调用堆栈信息展示在Web界面中。
2.根据权利要求1所述的过滤自定义Python脚本函数调用堆栈的方法,其特征在于,所述a2步骤的所述脚本执行请求的内容包括所需执行的脚本ID、所需执行的函数名。
3.根据权利要求1所述的过滤自定义Python脚本函数调用堆栈的方法,其特征在于,所述a2步骤的所述执行脚本并在用户自定义脚本的外层捕捉报错信息的方法包括:调用runscript函数来执行用户脚本,并使用Python异常处理捕获从脚本运行中抛出的错误。
4.根据权利要求1所述的过滤自定义Python脚本函数调用堆栈的方法,其特征在于,所述a3步骤的所述调用Python自带的异常解析函数逐层解析报错的函数调用堆栈的方法包括:
在错误处理except代码块中,调用Python自带的sysexcinfo函数,获取异常堆栈数据tb;
调用filterstack函数,filterstack函数的参数包括tb,参数tb即所述获取的异常堆栈数据,循环获取每一层堆栈的详细信息,所述详细信息包括:所在脚本文件路径、代码行号、函数名称、出错行代码。
5.根据权利要求1所述的过滤自定义Python脚本函数调用堆栈的方法,其特征在于,所述a4步骤的所述过滤函数调用堆栈的方法包括:
如所在脚本文件路径处于平台代码目录下,则无需加入待输出堆栈列表,跳过;
如所在脚本文件路径不处于平台代码目录下,则加入待输出堆栈列表。
6.根据权利要求5所述的过滤自定义Python脚本函数调用堆栈的方法,其特征在于,所述a5步骤的所述将过滤后的函数调用堆栈重新格式化的方法包括:
过滤函数处理堆栈数据的循环完毕后,将待输出堆栈列表按照:所在脚本路径,代码行号,函数名称,出错行代码的格式生成堆栈信息文本,并返回平台服务器。
7.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述程序被处理器执行时实现权利要求1-6任一项所述过滤自定义Python脚本函数调用堆栈的方法的步骤。
8.一种计算机设备,所述计算机设备包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现如权利要求1-6任一项所述过滤自定义Python脚本函数调用堆栈的方法的步骤。
CN202210058112.7A 2022-01-19 2022-01-19 一种过滤自定义Python脚本函数调用堆栈的方法 Active CN114490368B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202210058112.7A CN114490368B (zh) 2022-01-19 2022-01-19 一种过滤自定义Python脚本函数调用堆栈的方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210058112.7A CN114490368B (zh) 2022-01-19 2022-01-19 一种过滤自定义Python脚本函数调用堆栈的方法

Publications (2)

Publication Number Publication Date
CN114490368A CN114490368A (zh) 2022-05-13
CN114490368B true CN114490368B (zh) 2022-10-14

Family

ID=81472821

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210058112.7A Active CN114490368B (zh) 2022-01-19 2022-01-19 一种过滤自定义Python脚本函数调用堆栈的方法

Country Status (1)

Country Link
CN (1) CN114490368B (zh)

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106294134B (zh) * 2016-07-29 2018-02-23 腾讯科技(深圳)有限公司 代码的崩溃定位方法及装置
CN112114987B (zh) * 2019-06-20 2024-04-09 腾讯科技(深圳)有限公司 运行环境的异常检测方法、装置、智能终端及存储介质

Also Published As

Publication number Publication date
CN114490368A (zh) 2022-05-13

Similar Documents

Publication Publication Date Title
CN105843741B (zh) 应用程序的信息处理方法和装置
US8601443B2 (en) Method and system for correlating trace data
WO2014020457A1 (en) Remote debug service in a cloud environment
CN110875858B (zh) 应用测试数据抓取方法、***、设备及存储介质
CN106557300B (zh) 一种野指针的函数栈信息确定方法、装置及电子设备
CN111782525B (zh) Java方法远程调试方法及装置
US6598181B1 (en) Method and system for debugging multiple function calls
CN106997313B (zh) 一种应用程序的信号处理方法、***及终端设备
CN109032629A (zh) 一种代码更新方法及装置
CN110134538B (zh) 快速定位问题日志的方法、装置、介质和电子设备
CN111274130A (zh) 一种自动化测试方法、装置、设备及存储介质
CN108920379B (zh) 捕获lua代码异常的方法和装置
CN114490368B (zh) 一种过滤自定义Python脚本函数调用堆栈的方法
CN110609666B (zh) 打印机配置方法、装置、电子设备及可读存储介质
CN109784054B (zh) 行为堆栈信息获取方法及装置
US8201151B2 (en) Method and system for providing post-mortem service level debugging
WO2013104964A1 (en) Thread based dynamic data collection
CN116501431A (zh) 一种页面元素定位方法、装置和存储介质
CN108628744B (zh) 故障诊断方法、装置及电子设备
CN113138913A (zh) Java代码注入检测方法、装置、设备及存储介质
CN114510429B (zh) 一种基于动态符号执行的调试方法、***和介质
CN114253810A (zh) 浏览器内核异常监控方法、装置、存储介质及电子设备
CN111209198A (zh) 基于jpda的调试方法、装置、电子设备及存储介质
CN113986622A (zh) Sdk异常的自检方法、装置、介质和计算设备
CN112363707A (zh) 一种基于java反射技术的控制层通用调度方法

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
CP01 Change in the name or title of a patent holder
CP01 Change in the name or title of a patent holder

Address after: 201203 building 7, No. 399, Keyuan Road, China (Shanghai) pilot Free Trade Zone, Pudong New Area, Shanghai

Patentee after: Shanghai Observation Future Information Technology Co.,Ltd.

Address before: 201203 building 7, No. 399, Keyuan Road, China (Shanghai) pilot Free Trade Zone, Pudong New Area, Shanghai

Patentee before: SHANGHAI CLOUDCARE INFORMATION TECHNOLOGY CO.,LTD.