一种程序异常的监控方法和装置制造方法

文档序号:6625583阅读:420来源:国知局
一种程序异常的监控方法和装置制造方法
【专利摘要】本发明实施例公开了一种程序异常的监控方法,包括:向被监控程序关联的通信窗口发送探测消息;若预设时间内未收到所述通信窗口反馈的响应消息,确定所述被监控程序运行异常;获取所述被监控程序的堆栈信息;根据所述堆栈信息生成异常日志文件。本发明实施例还公开了一种程序异常的监控装置。采用本发明,能在程序发生异常时保留现场数据。
【专利说明】一种程序异常的监控方法和装置

【技术领域】
[0001]本发明涉及软件测试领域,尤其涉及一种程序异常的监控方法和装置。

【背景技术】
[0002]在程序的运行过程中,由于程序本身的设计或外部负载的问题经常会发生异常,例如程序存在Bug造成CPU占用率过高或者读写操作过于频繁造成界面卡顿或退出等异常情况,这些异常有时在程序测试阶段很难发现,需要在实际使用中由用户来反馈异常信息,软件设计人员根据反馈的异常信息分析异常原因。然而程序在运行过程中发生异常的时间是随机的,当用户反馈程序的异常信息,程序的现场数据已难以保留,软件设计人员又很难重现程序发生异常的现场数据。


【发明内容】

[0003]本发明实施例所要解决的技术问题在于,提供一种程序异常的监控方法。可在程序发生异常时保留现场数据。
[0004]为了解决上述技术问题,本发明实施例提供了一种程序异常的监控方法,包括:
[0005]向被监控程序关联的通信窗口发送探测消息;
[0006]若预设时间内未收到所述通信窗口反馈的响应消息,确定所述被监控程序运行异常;
[0007]获取所述被监控程序的堆栈信息;
[0008]根据所述堆栈信息生成异常日志文件。
[0009]相应地,本发明实施例还提供了一种程序异常的监控装置,包括:
[0010]发送模块,用于向被监控程序关联的通信窗口发送探测消息;
[0011]确定模块,用于若预设时间内未收到所述通信窗口反馈的响应消息,确定所述被监控程序运行异常;
[0012]获取模块,用于获取所述被监控程序的堆栈信息;
[0013]生成模块,用于根据所述堆栈信息生成异常日志文件。
[0014]实施本发明实施例,具有如下有益效果:
[0015]通过向被监控程序关联的通信窗口发送探测消息,在预设的时长内未收到通信窗口反馈的响应消息,确定被监控程序发生异常,获取被监控程序的堆栈信息并根据堆栈信息生成异常日志文件,这样可以自动监控被监控程序发生的异常,并在发生异常时获取被监控程序的现场数据,便于分析和确定被监控程序的异常原因。

【专利附图】

【附图说明】
[0016]为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0017]图1是本发明第一实施例提供的一种程序异常的监控方法的流程示意图;
[0018]图2是本发明第二实施例提供的一种程序异常的监控方法的流程示意图;
[0019]图3是图1和图2中注入DLL的示意图;
[0020]图4是图1和图2中创建通信窗口和监控线程的示意图;
[0021]图5是本发明实施例的一种程序异常的监控方法的示例示意图;
[0022]图6是本发明第一实施例提供的注意程序一种的监控装置的结构示意图;
[0023]图7是本发明第二实施例提供的一种程序异常的监控装置的结构示意图;
[0024]图8是图7中获取|旲块的结构不意图;
[0025]图9是本发明第三实施例提供的一种程序异常的监控装置的结构示意图。

【具体实施方式】
[0026]下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0027]本发明实施例提供的程序异常的监控方法可以应用于软件测试、软件调试或软件维护的场景,例如,使被监控程序处于正常工作环境,不间断的运行被监控程序程序,向被监控程序关联的通信窗口发送探测消息,如果预设时长内未接收到通信窗口根据探测消息返回的响应消息,确定被监控程序发生异常,此时获取被监控程序当前的堆栈消息,根据堆栈信息生成异常日志文件。这样可以自动监控被监控程序发生的异常,并在发生异常时获取被监控程序的现场数据,便于分析和确定被监控程序的异常原因,为被监控程序的改进提供依据。
[0028]本发明实施例涉及的监控装置可以包括:计算机、平板电脑、智能手机、笔记本电脑、掌上电脑以及移动互联网设备(MID)等终端设备。
[0029]参见图1,为本发明实施例一提供的一种程序异常的监控方法的流程示意图,在本发明实施例中,所述方法包括:
[0030]S101、向被监控程序关联的通信窗口发送探测消息。
[0031]具体的,被监控程序预先关联有一个通信窗口,监控装置向通信窗口发送探测消息,通信窗口可以为被监控程序主窗口之外设置的一个后台的窗口,不影响被监控程序正常运行。可选的,监控装置可以根据预设的时间周期向通信窗口发送探测消息,探测消息的类型本发明不作限制。
[0032]S102、若预设时间内未收到通信窗口反馈的响应消息,确定被监控程序运行异常。
[0033]具体的,如果被监控程序运行正常,被监控程序关联的通信窗口在接收到探测消息后,会在预设时间内向监控装置反馈响应消息;如果被监控程序运行异常,被监控程序关联的通信窗口在接收到探测消息后,无法向监控装置反馈响应消息或反馈响应消息超时,监控装置在预设时长被未接收到响应消息,则确定被监控程序运行异常。
[0034]S103、获取被监控程序的堆栈信息。
[0035]具体的,堆栈信息中包括被监控程序调用函数的调用记录和当前的程序指针地址,监控装置在确定被监控程序发生异常时,获取被监控程序当前的堆栈信息。
[0036]S104、根据堆栈信息生成异常日志文件。
[0037]具体的,监控装置根据获取的堆栈信息生成异常日志文件,日常日志文件中保存有被监控程序发生异常时的堆栈信息,软件分析人员可以根据异常日志文件分析被监控程序的异常原因。
[0038]实施本发明的实施例,通过向被监控程序关联的通信窗口发送探测消息,在预设的时长内未收到通信窗口反馈的响应消息,确定被监控程序发生异常,获取被监控程序的堆栈信息并根据堆栈信息生成异常日志文件,这样可以自动监控被监控程序发生的异常,并在发生异常时获取被监控程序的现场数据,便于分析和确定被监控程序的异常原因。
[0039]参见图2-图4,为本发明第二实施例提供的一种程序异常的监控方法的流程示意图,包括:
[0040]S201、生成动态链接库DLL,并向被监控程序注入DLL。
[0041]具体的,DLL(Dynamic Link Library,动态链接库,简称DLL)是一个可由多个程序同时使用的代码和数据的库,这样有助于不同程序间共享数据和资源。如图3所示,监控装置生成DLL,并向被监控程序注入DLL,DLL包括已被编译和链接的通信窗口创建函数,通信窗口创建函数不属于被监控程序的可执行代码,被监控程序的进程可以在DLL中调用通信窗口创建函数。
[0042]S202、加载DLL以创建与被监控程序关联的通信窗口。
[0043]具体的,监控装置加载S201创建的DLL后,调用DLL中的通信窗口创建函数以创建与被监控程序关联的通信窗口。优选的,通信窗口为透明的通信窗口。
[0044]S203、校验被监控程序是否完整。
[0045]具体的,如果被监控程序的代码发生篡改时(如代码新增或删除或更改),被监控程序就无法保证其功能的完整性,在运行时会发生无法预测的异常,因此在被监控程序运行之前需要校验其完整性,在本发明的实施例中,校验的方法可以是:采用哈希算法计算被监控程序的哈希值,将计算得到的哈希值与被监控程序的初始哈希值进行比较,初始哈希值是指被监控程序处于完整状态时计算得到的哈希值,如果二者相等,则表明被监控程序是完整的,否则,表明被监控程序发生篡改。需要说明的是,哈希算法可以是MD5、MD4和SHA-1等算法,本发明不作限制。
[0046]S204、创建监控线程,监控线程用于监控被监控程序的运行过程。
[0047]具体的,监控装置在被监控线程的主线程下创建一个监控线程,监控线程用于监控被监控程序的运行过程。
[0048]示例性的是,被监控程序在运行时主线程为thread main,监控装置在thread A下创建一个监控线程thread monitor, thread monitor用于监控和记录被监控程序运行过程中产生的数据。
[0049]S205、指示监控线程向被监控程序关联的通信窗口发送探测消息。
[0050]具体的,监控装置指示监控线程向被监控程序关联的通信窗口发送探测消息,监控装置可以指示监控线程根据预设的时间周期向被监控程序关联的通信窗口发送探测消肩、O
[0051]S206、若预设时间内未收到通信窗口反馈的响应消息,确定被监控程序运行异常。
[0052]具体的,如图4所示,监控装置与通信窗口之间建立跨进程连接,如果被监控程序运行正常,被监控程序关联的通信窗口在接收到探测消息后,会在预设时间内向监控装置反馈响应消息;如果被监控程序运行异常,被监控程序关联的通信窗口在接收到探测消息后,无法向监控装置反馈响应消息或反馈响应消息超时,监控装置在预设时长被未接收到响应消息,则确定被监控程序运行异常。
[0053]示例性的,预设时间为0.5ms,监控装置向被监控程序关联的通信窗口发送探测消息后,若监控装置在0.5ms内未接收到通信窗口根据探测消息反馈的响应消息,表明被监控程序发生异常,无法正常工作。
[0054]S207、查询被监控程序的调试接口并调用性能分析工具通过调试接口获取被监控程序的堆栈信息。
[0055]具体,被监控程序预先设置有一个调试接口,监控装置查询被监控程序的调试接口并调用性能分析工具通过调试接口获取被监控程序的堆栈信息,堆栈信息中包括被监控程序调用函数的调用记录和当前的程序指针地址,监控装置在确定被监控程序发生异常时,获取被监控程序当前的堆栈信息。需要说明的是,性能分析工具根据操作系统的类型选择,例如,在Windows操作系统中,性能分析工具包括xperf或其他性能分析工具,在Linux操作系统中,性能分析工具包括vmstat。
[0056]S208、根据堆栈信息生成异常日志文件。
[0057]具体的,监控装置根据堆栈信息生成预设格式的异常日志文件,并将异常日志文件保存至指定的路径,异常日志文件的格式可以是事件追踪日志ETL格式或Dump格式。
[0058]S209、解析异常日志文件,获取被监控程序的异常信息。
[0059]具体的,监控装置从指定的路径中获取并解析异常日志文件,异常日志文件中存储有被监控程序发生异常时的堆栈信息,堆栈信息中包括被监控程序调用函数的顺序记录和被监控程序发生异常时的程序指针地址。
[0060]示例性的,监控装置确定被监控程序发生异常时,监控装置将发生异常时被监控程序调用的函数的调用记录打印出来,其中,最后调用的函数最先打印出来,最先调用的最后打印出来,最新打印出来的函数为被监控程序发生异常时调用的函数,这样软件分析人员根据调用记录很容易定位到发生异常的函数。
[0061]例如,被监控程序的main O函数依次调用了 a()函数和b()函数,其中b()函数又调用了 c()函数,如果被监控程序在调用c O函数时发生异常,则打印出来的调用记录如下:
[0062]c()函数:被监控程序发生异常时调用的函数;
[0063]b ()函数:c ()函数方法调用的函数;
[0064]main O函数:b()函数调用的函数。
[0065]S210、根据被监控程序的异常信息,定位被监控程序的发生异常时的代码行。
[0066]具体的,监控装置根据异常信息中的调用记录定位到被监控程序发生异常是调用的函数,并根据程序指针地址定位到该函数中的代码行。实施本发明的实施例,通过向被监控程序关联的通信窗口发送探测消息,在预设的时长内未收到通信窗口反馈的响应消息,确定被监控程序发生异常,获取被监控程序的堆栈信息并根据堆栈信息生成异常日志文件,这样可以自动监控被监控程序发生的异常,并在发生异常时获取被监控程序的现场数据,便于分析和确定被监控程序的异常原因。
[0067]下面结合图5以一个具体的实例对图2提供的程序异常的监控方法进行说明。图2的被监控软件为即时聊天软件,即时聊天软件可以为文本聊天软件或语音聊天软件,标号3的窗口为即时聊天软件的聊天窗口,标号4对应的窗口为与即时聊天软件关联的通信窗口,通信窗口可以在后台运行或为一个透明的窗口,对用户不可见。当即时通信软件接收到开启指定联系人的聊天窗口的指令时,生成并显示聊天窗口。
[0068]监控装置生成动态链接库DLL,向即时通信软件注入DLL,监控装置加载DLL创建与被监控窗口关联的通信窗口 4。监控装置校验即时通信软件是否完整,校验的方法可以为采用哈希值算法来校验,当校验通过后,监听程序在即时通信软件的主线程main thread下创建监控线程monitor thread,监控线程用于监控即时通信软件的运行过程,监控装置指示监控线程向通信窗口 4发送sounding message探测消息,假设预设时间为1ms,监控装置若在1ms内未收到通信窗口 4根据探测消息返回的响应消息response message,确定即时通信软件发生异常(例如:聊天窗口 3发生卡顿现象,无法及时响应操作指令)。监控装置查询即时聊天软件的调试接口并调用性能分析工具通过调试接口获取即时聊天软件当前的堆栈信息,堆栈信息中包括即时通信软件调用的函数的顺序列表,这个堆栈信息即为即时通信软件发生异常时的现场数据,监控装置根据堆栈信息生成异常日志文件供后续查询,监控装置解析异常日志文件,获得即时通信软件的异常信息,定位到监控软件发生异常时的代码行。
[0069]参加图6,为本发明第一实施例提供的一种程序异常的监控装置的结构示意图,在本发明实施例中,所述监控装置包括发送模块10、确定模块11、获取模块12和生成模块13。
[0070]发送模块10,用于向被监控程序关联的通信窗口发送探测消息。
[0071]具体的,被监控程序预先关联有一个通信窗口,发送模块10向通信窗口发送探测消息,通信窗口可以为被监控程序主窗口之外设置的一个后台的窗口,不影响被监控程序正常运行。可选的,发送模块10可以根据预设的时间周期向通信窗口发送探测消息,探测消息的类型本发明不作限制。
[0072]确定模块11,用于若预设时间内未收到所述通信窗口反馈的响应消息,确定所述被监控程序运行异常。
[0073]具体的,如果被监控程序运行正常,被监控程序关联的通信窗口在接收到探测消息后,会在预设时间内向确定模块11反馈响应消息;如果被监控程序运行异常,被监控程序关联的通信窗口在接收到探测消息后,无法向确定模块11反馈响应消息或反馈响应消息超时,确定模块11在预设时长被未接收到响应消息,则确定被监控程序运行异常。
[0074]获取模块12,用于获取所述被监控程序的堆栈信息。
[0075]具体的,堆栈信息中包括被监控程序调用函数的调用记录和当前的程序指针地址,获取模块12在确定被监控程序发生异常时,获取被监控程序当前的堆栈信息。
[0076]生成模块13,用于根据所述堆栈信息生成异常日志文件。
[0077]具体的,生成模块13根据获取的堆栈信息生成异常日志文件,日常日志文件中保存有被监控程序发生异常时的堆栈信息,软件分析人员可以根据异常日志文件分析被监控程序的异常原因。
[0078]实施本发明的实施例,通过向被监控程序关联的通信窗口发送探测消息,在预设的时长内未收到通信窗口反馈的响应消息,确定被监控程序发生异常,获取被监控程序的堆栈信息并根据堆栈信息生成异常日志文件,这样可以自动监控被监控程序发生的异常,并在发生异常时获取被监控程序的现场数据,便于分析和确定被监控程序的异常原因。
[0079]进一步的,参见图7和图8,为本发明第二实施例提供的一种程序异常的监控装置的结构示意图,在本发明实施例中,所述监控装置除包括发生模块10、确定模块11、获取模块12和生成模块13之外,还包括:注入模块15、加载模块14、校验模块16、解析模块17和定位模块18。
[0080]注入模块15,用于生成动态链接库DLL,并向所述被监控程序注入所述DLL。
[0081]加载模块14,用于加载所述DLL以创建与所述被监控程序关联的通信窗口。
[0082]校验模块16,用于校验所述被监控程序的完整性,若校验完整性成功,执行所述向被监控程序关联的通信窗口发送探测消息。
[0083]解析模块17,用于解析所述异常日志文件,获得所述被监控程序的异常信息。
[0084]定位模块18,用于根据所述被监控程序的异常信息,定位所述被监控程序的发生异常时的代码行。
[0085]可选的,获取模块12包括查询单元121和调用单元122。
[0086]查询单元121,用于查询所述被监控程序的调试接口。
[0087]调用单元122,用于调用性能分析工具通过所述调试接口获取所述被监控程序的堆栈信息。
[0088]本发明实施例和方法实施例二属于同一构思,其带来的技术效果也相同,具体请参照方法实施例二的描述,此处不再赘述。
[0089]参见图9,本发明第三实施例提供了一种监控装置的结构示意图。如图8所示,所述软件测试设备1000可以包括:至少一个处理器1001,例如CPU,至少一个网络接口 1004,用户接口 1003,存储器1005,至少一个通信总线1002。其中,通信总线1002用于实现这些组件之间的连接通信。其中,用户接口 1003可以包括显示屏(Display)、键盘(Keyboard),可选用户接口 1003还可以包括标准的有线接口、无线接口。网络接口 1004可选的可以包括标准的有线接口、无线接口(如W1-FI接口)。存储器1005可以是高速RAM存储器,也可以是非不稳定的存储器(non-volatile memory),例如至少一个磁盘存储器。存储器1005可选的还可以是至少一个位于远离前述处理器1001的存储装置。如图8所示,作为一种计算机存储介质的存储器1005中可以包括操作系统、网络通信模块、用户接口模块以及应用程序。
[0090]在图8所示的监控装置1000中,处理器1001可以用于调用存储器1005中存储的软件测试应用程序,并具体执行以下步骤:
[0091]向被监控程序关联的通信窗口发送探测消息;
[0092]若预设时间内未收到所述通信窗口反馈的响应消息,确定所述被监控程序运行异常;
[0093]获取所述被监控程序的堆栈信息;
[0094]根据所述堆栈信息生成异常日志文件。
[0095]在本发明的一些实施例中,处理器1001还用于执行:
[0096]生成动态链接库DLL,并向所述被监控程序注入所述DLL ;
[0097]加载所述DLL以创建与所述被监控程序关联的通信窗口。
[0098]在本发明的一些实施例中,处理器1001执行所述向被监控程序关联的通信窗口发送探测消息包括:
[0099]创建监控线程,所述监控线程用于监控所述被监控程序的运行过程;
[0100]指示所述监控线程向所述被监控程序关联的通信窗口发送探测消息。
[0101]在本发明的一些实施例中,处理器1001还用于执行:
[0102]校验所述被监控程序的完整性,若校验完整性成功,执行所述向被监控程序关联的通信窗口发送探测消息。
[0103]在本发明的一些实施例中,处理器1001执行所述获取所述被监控程序的堆栈信息包括:
[0104]查询所述被监控程序的调试接口 ;
[0105]调用性能分析工具通过所述调试接口获取所述被监控程序的堆栈信息。
[0106]在本发明的一些实施例中,处理器1001还用于执行:解析所述异常日志文件,获得所述被监控程序的异常信息;
[0107]根据所述被监控程序的异常信息,定位所述被监控程序的发生异常时的代码行。
[0108]在本发明的一些实施例中,所述通信窗口为透明的通信窗口。
[0109]在本发明的一些实施例中,所述异常日志文件的格式包括事件追踪日志ETL格式或Dump格式。
[0110]实施本发明的实施例,通过向被监控程序关联的通信窗口发送探测消息,在预设的时长内未收到通信窗口反馈的响应消息,确定被监控程序发生异常,获取被监控程序的堆栈信息并根据堆栈信息生成异常日志文件,这样可以自动监控被监控程序发生的异常,并在发生异常时获取被监控程序的现场数据,便于分析和确定被监控程序的异常原因。
[0111]本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory, ROM)或随机存储记忆体(Random AccessMemory, RAM)等。
[0112]以上所揭露的仅为本发明一种较佳实施例而已,当然不能以此来限定本发明之权利范围,本领域普通技术人员可以理解实现上述实施例的全部或部分流程,并依本发明权利要求所作的等同变化,仍属于发明所涵盖的范围。
【权利要求】
1.一种程序异常的监控方法,其特征在于,包括: 向被监控程序关联的通信窗口发送探测消息; 若预设时间内未收到所述通信窗口反馈的响应消息,确定所述被监控程序运行异常; 获取所述被监控程序的堆栈信息; 根据所述堆栈信息生成异常日志文件。
2.如权利要求1所述的方法,其特征在于,所述向被监控程序关联的通信窗口发送探测消息之前,还包括: 生成动态链接库DLL,并向所述被监控程序注入所述DLL ; 加载所述DLL以创建与所述被监控程序关联的通信窗口。
3.如权利要求1或2所述的方法,其特征在于,所述向被监控程序关联的通信窗口发送探测消息包括: 创建监控线程,所述监控线程用于监控所述被监控程序的运行过程; 指示所述监控线程向所述被监控程序关联的通信窗口发送探测消息。
4.如权利要求3所述的方法,其特征在于,所述向被监控程序关联的通信窗口发送探测消息之前,还包括: 校验所述被监控程序的完整性,若校验完整性成功,执行所述向被监控程序关联的通信窗口发送探测消息。
5.如权利要求4所述的方法,其特征在于,所述获取所述被监控程序的堆栈信息包括: 查询所述被监控程序的调试接口; 调用性能分析工具通过所述调试接口获取所述被监控程序的堆栈信息。
6.如权利要求5所述的方法,其特征在于,所述根据所述堆栈信息生成异常日志文件之后,还包括: 解析所述异常日志文件,获得所述被监控程序的异常信息; 根据所述被监控程序的异常信息,定位所述被监控程序的发生异常时的代码行。
7.如权利要求1-6任意一项所述的方法,其特征在于,所述通信窗口为透明的通信窗□。
8.如权利要求7所述的方法,其特征在于,所述异常日志文件的格式包括事件追踪日志ETL格式或Dump格式。
9.一种程序异常的监控装置,其特征在于,包括: 发送模块,用于向被监控程序关联的通信窗口发送探测消息; 确定模块,用于若预设时间内未收到所述通信窗口反馈的响应消息,确定所述被监控程序运行异常; 获取模块,用于获取所述被监控程序的堆栈信息; 生成模块,用于根据所述堆栈信息生成异常日志文件。
10.如权利要求9所述的装置,其特征在于,还包括: 注入模块,用于生成动态链接库DLL,并向所述被监控程序注入所述DLL ; 加载模块,用于加载所述DLL以创建与所述被监控程序关联的通信窗口。
11.如权利要求10所述的装置,其特征在于,还包括: 校验模块,用于校验所述被监控程序的完整性,若校验完整性成功,执行所述向被监控程序关联的通信窗口发送探测消息。
12.如权利要求4所述的装置,其特征在于,所述获取模块包括: 查询单元,用于查询所述被监控程序的调试接口 ; 调用单元,用于调用性能分析工具通过所述调试接口获取所述被监控程序的堆栈信肩、O
13.如权利要求12所述的装置,其特征在于,还包括: 解析模块,用于解析所述异常日志文件,获得所述被监控程序的异常信息; 定位模块,用于根据所述被监控程序的异常信息,定位所述被监控程序的发生异常时的代码行。
14.如权利要求9-13任意一项所述的装置,其特征在于,所述通信窗口为透明的通信窗P。
15.如权利要求14所述的装置,其特征在于,所述异常日志文件的格式包括事件追踪日志ETL格式或Dump格式。
【文档编号】G06F11/30GK104268055SQ201410440651
【公开日】2015年1月7日 申请日期:2014年9月1日 优先权日:2014年9月1日
【发明者】欧瑞清 申请人:腾讯科技(深圳)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1