[0029] 以下通过特定的具体实例说明本发明的实施方式,本领域技术人员可由本说明书所揭露的内容轻易地了解本发明的其他优点与功效。本发明还可以通过另外不同的具体实施方式加以实施或应用,本说明书中的各项细节也可以基于不同观点与应用,在没有背离本发明的精神下进行各种修饰或改变。
[0030] 本实施例的目的在于提供一种异常调试方法及系统,用于解决现有技术中若堆栈被破坏便无法对相应的异常进行定位的问题。以下将详细阐述本实施例的一种异常调试方法及系统的原理及实施方式,使本领域技术人员不需要创造性劳动即可理解本实施例的一种异常调试方法及系统。
[0031] 本实施例提供一种异常调试方法及系统,主要是通过记录任务的堆栈,并提供命令dump出异常的任务堆栈信息,结合objdump的函数地址段信息,能在堆栈被破坏的情况下,进行相应的异常定位分析。
[0032] 具体地,如图1所示,本实施例提供一种异常调试方法,用于对VxWorks操作系统中出现异常时的调试过程中,所述异常调试方法包括以下步骤。
[0033] 步骤S11,在VxWorks操作系统中出现异常时,调用预设的异常处理函数并通过所述异常处理函数获取当前任务的ID值。
[0034] 其中,在本实施例中,所述异常处理函数为hook函数。在使用本实施例中的异常调试方法之前,需要预先注册hook函数,以供使用时调用。在VxWorks操作系统中出现异常时,调用hook函数并通过所述hook函数获取当前任务的ID值,即taskID。
[0035] 步骤S12,根据所述当前任务的ID值获取所述当前任务的任务信息并根据所述当前任务的任务信息获取任务的堆栈信息。
[0036] 具体地,在本实施例中,所述异常调试方法还包括:在获取到所述当前任务的任务信息和所述任务的堆栈信息后,通过指定文件格式和文件名称的文件将所述当前任务的任务信息和所述任务的堆栈信息保存到flash中。
[0037] 其中,在本实施例中,所述文件为txt格式;所述文件名称中包含保存文件时的时间戳。例如,保存有当前任务的任务信息和所述任务的堆栈信息文件以“EXCEPTION_【时间戳】.txt”命名。
[0038] 此外,在本实施例中,在所述flash中,保存所述当前任务的任务信息和所述任务的堆栈信息的所述文件的最大数量不超过预设值,其中,所述预设值可自定义,在本实施例中,所述预设值的选取范围为5~15,例如为10。
[0039] 当所述flash中保存所述当前任务的任务信息和所述任务的堆栈信息的文件的数量达到预设值时,在保存新的包含所述当前任务的任务信息和所述任务的堆栈信息的文件时,按所述文件的保存时间先后顺序,删除保存时间最早的文件。
[0040] 具体地,在本实施例中,例如所述预设值选为10,那也就是说,保存所述当前任务的任务信息和所述任务的堆栈信息的所述文件最多为10个,假如已经存在10个保存所述当前任务的任务信息和所述任务的堆栈信息的文件,按保存时间来说,保存时间最早的那个文件会被删除。
[0041] 步骤S13,提取所述任务的堆栈信息中的异常任务堆栈信息并镜像所述异常任务堆栈信息。具体地,在本实施例中,需要提供一个用于镜像的dumpExcInfo的命令,可以从保存所述当前任务的任务信息和所述任务的堆栈信息的文件中把这些异常相关的任务信息dump出来。dump为备份工具程序,可将目录或整个文件系统备份至指定的设备,或备份成一个大文件。dump检查文件系统上的文件,并确定哪些文件需要备份。这些文件将出于安全保护而被复制到给定的磁盘、磁带或其他存储媒体上,大于输出媒体容量的转储将被划分到多个卷。Dump文件是进程的内存镜像。可以把程序的执行状态通过调试器保存到dump文件中。Dump文件是用来给驱动程序编写人员调试驱动程序用的,这种文件必须用专用工具软件打开,比如使用WinDbg打开。当我们的程序发布出去之后,一般是无法跟踪自己代码的bug的,所以Dump(扩展名是.dmp)文件对于我们来说特别有用。我们可以通过.dmp文件把出现bug的情况再现,然后根据再现的状况(包括堆栈调用等情况),可以找到出现bug的行号,甚至是出现bug的点。
[0042] 步骤S14,根据镜像的异常任务堆栈信息和将所述镜像的异常任务堆栈信息反汇编的结果,对所述异常任务堆栈信息中的异常进行定位分析。
[0043] 具体地,在本实施例中,dump出任务信息后,可以结合将程序objdump的结果,对任务的堆栈信息进行分析,从分析定位问题。其中,所述objdump命令是反汇编目标文件或者可执行文件的命令,objdump有点像那个快速查看之类的工具,就是以一种可阅读的格式让你更多地了解二进制文件可能带有的附加信息。
[0044] 为使本领域技术人员进一步理解本实施例中的异常调试方法,以下将进一步说明本实施例中异常调试方法的实施过程。
[0045] 首先预设异常处理函数hook函数,在VxWorks操作系统中出现异常时,调用相应的异常处理函数hook函数,通过所述异常处理函数获取当前任务的taskID。通过taskID获取当前任务的信息并根据所述当前任务的任务信息获取任务的堆栈信息。保存当前任务基本信息以及相应的堆栈信息到flash中的文件中,文件以“EXCEPTION_【时间戳】.txt”命名,其中,文件最多为10个,假如已经存在10个,最早保存的一个文件会被删除。之后,提供一个dumpExcInfo的命令,可以从文件中把这些异常相关的任务信息dump出来。dump出任务信息后,可以结合将程序objdump的结果,对任务的堆栈信息进行分析,从分析定位问题。
[0046] 此外,本实施例还提供一种异常调试系统,用于对VxWorks操作系统中出现异常时的调试过程中,所述异常调试系统1包括:调用模块11,任务ID值获取模块12,堆栈信息获取模块13,文件保存模块14,提取镜像模块15以及异常进行定位分析模块16。
[0047] 所述调用模块11用于在VxWorks操作系统中出现异常时,调用预设的异常处理函数。其中,在本实施例中,所述异常处理函数为hook函数。在使用本实施例中的异常调试方法之前,需要预先注册hook函数,以供所述调用模块11使用时调用。在VxWorks操作系统中出现异常时,所述调用模块11调用hook函数。
[0048] 所述任务ID值获取模块12与所述调用模块11相连,用于通过所述异常处理函数获取当前任务的ID值;具体地,通过所述hook函数获取当前任务的ID值,即taskID。
[0049] 所述堆栈信息获取模块13与所述任务ID值获取模块12相连,用于根据所述当前任务的ID值获取所述当前任务的任务信息并根据所述当前任务的任务信息获取任务的堆栈信息。
[0050] 所述文件保存模块14与所述堆栈信息获取模块13相连,用于在获取到所述当前任务的任务信息和所述任务的堆栈信息后,通过指定文件格式和文件名称的文件将所述当前任务的任务信息和所述任务的堆栈信息保存到flash中。
[0051] 在所述文件保存模块14中,所述文件为txt格式;所述文件名称中包含保存文件时的时间戳。例如,保存有当前任务的任务信息和所述任务的堆栈信息文件以“EXCEPTION_【时间戳】.txt”命名。
[0052] 此外,在本实施例中,在所述flash中,保存所述当前任务的任务信息和所述任务的堆栈信息的所述文件的最大数量不超过预设值,所以,在本实施例中,所述文件保存模块14包括文件数量控制单元,用于控制在所述flash中保存所述当前任务的任务信息和所述任务的堆栈信息的所述文件的最大数量不超过预设值。其中,所述预设值可自定义,在本实施例中,所述预设值的选取范围为5~15,例如为10。
[0053] 此外,在本实施例中,当所述flash中保存所述当前任务的任务信息和所述任务的堆栈信息的文件的数量达到预设值时,在保存新的包含所述当前任务的任务信息和所述任务的堆栈信息的文件时,按所述文件的保存时间先后顺序,删除保存时间最早的文件。
[0054] 为实现上述功能,在本实施例中,所述文件保存模块14中还包括与所述文件数量控制单元相连的删除单元,用于当所述flash中保存所述当前任务的任务信息和所述任务的堆栈信息的文件的数量达到预设值时,在保存新的包含所述当前任务的任务信息和所述任务的堆栈信息的文件时,按所述文件的保存时间先后顺序,删除保存时间最早的文件。
[0055] 具体地,在本实施例中,例如所述预设值选为10,那也就是说,保存所述当前任务的任务信息和所述任务的堆栈信息的所述文件最多为10个,假如已经存在10个保存所述当前任务的任务信息和所述任务的堆栈信息的文件,按保存时间来说,保存时间最早的那个文件会被所述删除单元删除。
[0056] 所述提取镜像模块15与所述堆栈信息获取模块13相连,用于提取所述任务的堆栈信息中的异常任务堆栈信息并镜像所述异常任务堆栈信息。
[0057] 具体地,在本实施例中,所述提取镜像模块15需要提供一个用于镜像的dumpExcInfo的命令,可以从保存所述当前任务的任务信息和所述任务的堆栈信息的文件中把这些异常相关的任务信息dump出来。
[0058] 所述异常进行定位分析模块16与所述提取镜像模块15相连,用于根据镜像的异常任务堆栈信息和将所述镜像的异常任务堆栈信息反汇编的结果,对所述异常任务堆栈信息中的异常进行定位分析。
[0059] 具体地,在本实施例中,dump出任务信息后,可以结合将程序objdump的结果,对任务的堆栈信息进行分析,从分析定位问题。其中,所述objdump命令是反汇编目标文件或者可执行文件的命令,objdump有点像那个快速查看之类的工具,就是以一种可阅读的格式让你更多地了解二进制文件可能带有的附加信息。
[0060] 为使本领域技术人员进一步理解本实施例中的异常调试系统1,以下将进一步说明本实施例中异常调试系统1的工作过程。
[0061] 首先预设异常处理函数hook函数,在VxWorks操作系统中出现异常时,所述调用模块11调用相应的异常处理函数hook函数,所述任务ID值获取模块12通过所述异常处理函数获取当前任务的taskID。所述堆栈信息获取模块13通过taskID获取当前任务的信息并根据所述当前任务的任务信息获取任务的堆栈信息。所述文件保存模块14保存当前任务基本信息以及相应的堆栈信息到flash中的文件中,文件以“EXCEPTION_【时间戳】.txt”命名,其中,所述文件数量控制单元控制文件最多为10个,假如已经存在10个,最早保存的一个文件会被所述删除单元删除。之后,所述提取镜像模块15提供一个dumpExcInfo的命令,从文件中把这些异常相关的任务信息dump出来。dump出任务信息后,所述异常进行定位分析模块16可以结合将程序objdump的结果,对任务的堆栈信息进行分析,从分析定位问题。
[0062] 综上所述,本发明在VxWorks操作系统中出现异常时,调用预设的异常处理函数获取当前任务的ID值,然后根据所述当前任务的ID值获取所述当前任务的任务信息,从而分析出任务的堆栈信息,之后提取所述任务的堆栈信息中的异常任务堆栈信息并镜像所述异常任务堆栈信息,最后根据镜像的异常任务堆栈信息和将所述镜像的异常任务堆栈信息反汇编的结果,对所述异常任务堆栈信息中的异常进行定位分析,所以本发明能在堆栈被破坏的情况下,进行相应的异常进行定位分析。本发明简单高效,具有较强的通用性和实用性。所以,本发明有效克服了现有技术中的种种缺点而具高度产业利用价值。
[0063] 上述实施例仅例示性说明本发明的原理及其功效,而非用于限制本发明。任何熟悉此技术的人士皆可在不违背本发明的精神及范畴下,对上述实施例进行修饰或改变。因此,举凡所属技术领域中具有通常知识者在未脱离本发明所揭示的精神与技术思想下所完成的一切等效修饰或改变,仍应由本发明的权利要求所涵盖。