当前位置: 首页 > 专利查询>微软公司专利>正文

探测具有限制性调用约定代码的方法技术

技术编号:2849437 阅读:235 留言:0更新日期:2012-04-11 18:40
揭示了一种在其中可使用探头函数探测待测程序的计算机程序的开发环境。通过其结构遵守开发所述计算机程序用的平台的限制性调用约定的包装函数来调用所述探头函数。通过遵守所述调用约定,即使在调用异常处理程序或者依赖于遵守所述调用约定的其他程序元素的情况下,也能在测试期间完成对所述计算机程序的正确操作。一旦被探测,就可测试所述计算机程序以确定它是否执行所希望的逻辑功能从而确定该程序的或用于其他测试功能的性能。

【技术实现步骤摘要】

本专利技术大体涉及软件开发,尤其涉及测试软件的工具。
技术介绍
随着软件程序的发展,通常希望测试程序以确定它们是否如所期望的运行。随着软件程序越来越大并且越来越复杂,使得软件执行过慢、占用过多内存或者即使在程序所有的部分都生成了期望输出时也无法交付一个希望的性能水平的可能性越来越大。通常希望测试程序以确定其是否交付一个希望的性能水平。在软件程序无法交付一个希望性能水平的情况下,性能工程师就可在该程序运行时对其进行分析以识别可修改用于改进性能的部分。为了便于性能设计,软件开发系统包括能够“探测”程序的工具。“探测”程序通常包括插入被称作“探头”的特定函数的调用。每个探头记录关于在每次执行时其中插入探头的程序的操作状态的信息。例如,可以将一探头插入该程序在程序调用特定函数之前的地方,并且把第二探头也插入该程序中在该程序调用该函数之后的地方。当执行这些探头时,每次都会将其执行的时间写入日志文件。通过分析该日志文件,性能工程师能够确定执行该函数所需的时间量。作为另一个实例,可以在每个函数的起始处和结尾处插入探头。由这些探头收集的信息可用于分析每一函数的执行次数或者每次调用该函数的执行时间。在分析相对复杂的程序时该性能信息尤为重要。为了使通过分析所探测的程序所获取的结果能够可靠表示该程序在实际操作中的性能,添加的探头就应该尽可能少的中断该程序的运行。因此,通常将探头插入含有待分析程序的二进制或可执行文件中。在所述二进制文件被充分优化和编译之后该二进制文件才包含所述程序。因此,插入探头不会改变优化或编译过程。为了将探头插入二进制文件,可以反汇编该二进制文件以识别希望该探头所在的程序内的具体位置。例如函数表通常被包括作为二进制文件的一部分以指定表示每个函数的指令的起始点。探头也不应该将错误引入运行中的程序,诸如通过改变变量的存储或者破坏存储执行程序所依赖信息的格式。在其中编写应用程序的软件系统能够施加各种编程约定,特别是关于改变函数内寄存器的值的约定。例如,业已使用特定的调用约定为X86处理器系列开发了许多广泛可用的应用程序。为了遵守该调用约定,处理在X86处理器上运行的程序的编译器可以使用序言(prologue)和尾部(epilogue)部分来实现每个函数。在序言中,函数将其中函数改变的每个寄存器的值压入堆栈。在结尾部分,通过将这些寄存器值的弹出堆栈使得该函数恢复这些寄存器的值。编写与这一函数交互的任何其他例程或工具会假定依据所述调用约定来存储信息。如果没有依据所述调用约定来存储信息,则会导致出错。可以预期为在其上运行该程序的处理器定制特定的调用约定。例如,可以设计一个使用处理器快速执行的指令的调用约定。因此,由软件系统和旨在其上运行该软件系统的处理器的结合所形成的每个平台都可具有不同的调用约定。例如,某些平台结合了包括X86处理器系列的64位扩展的处理器。这些处理器在诸如AMD64或EMT64T的名称下可用。这些处理器统称为具有X64扩展。基于带有X64扩展的处理器的平台可以使用与基于不带扩展的X86处理器的类似平台不同的调用约定。所以希望探测一种被开发用于其中传统探测方法会引入错误的X64平台或其他使用调用约定的应用的软件。
技术实现思路
本专利技术涉及一种探测被开发用于在其中传统探测方法会引入错误的平台的程序的方法。根据该过程,可以从包装函数内调用探头。这些包装函数允许调用探头函数而不违反该平台的调用约定。本专利技术在一个方面涉及探测软件程序的方法,所述软件程序带有适于至少一个在该软件内某位置记录操作信息的探头函数。本方法包括修改该软件程序以将控制传输给一个包装函数,所述包装函数包括至少一个调用该探头函数的计算机可执行指令。本专利技术在另一个方面涉及测试在具有寄存器的平台上的软件程序,其中所述寄存器具有值和调用约定,其中在至少一个寄存器内的值在函数调用后仍保持。本方法具有了包括在该函数内的某个被探测位置执行至少一个探头函数的类型。根据本方法,执行该软件程序并且该程序在所述被探测位置处将控制传递给包装函数。在该包装函数内,保持该平台的状态,调用所述探头函数并且重新储存该平台的状态。本专利技术在又一个方面涉及带有为实现用于一软件程序的开发环境的计算机可执行指令的计算机可读介质。所述计算机可执行指令修改含有该软件程序可执行版本的二进制文件以包括一探头函数和调用该探头函数的包装函数;在所述二进制文件中识别要执行一探头函数的被识别位置;并且在所述被识别位置将传递控制的控制指令的传递提供给所述包装函数。附图说明附图并未按比例画出。附图中,用类似的编号表示在各图中示出的每一相等或接近相等的组件。为了简明起见,并未在每张附图中标出每一组件。在附图中图1是要探测的程序的部分的表示;图2A是根据本专利技术一个实施例的加入了一探头函数的被修改程序的表示;图2B是根据本专利技术第二实施例的加入了一探头函数的被修改程序的表示;图3是根据本专利技术又一个实施例加入了探头函数的被修改程序的表示;图4是根据本专利技术实现一程序的过程的流程图。具体实施例方式我们已经认识到在探测为使用限制性调用约定的平台而编写的计算机程序的问题。在一平台上使用这一调用约定的一个实例,该平台包括用于带有X64扩展的处理器的MicrosoftWindows操作系统。图1给出了对该平台生成的代码的汇编级版本的实例。例如图1可表示通过反汇编可执行文件的某部分所创建的显示。示出了调用程序110的一部分。调用程序110包括调用了在此表示为“OriginalFunction.”的函数的指令112。在此实例中,被调用函数150表示“OriginalFunction”。被调用函数150由返回指令156结束。返回指令156在函数调用112之后的指令处将程序控制返回给调用程序110。根据在此实例中使用的调用约定,使用处理器内某些寄存器来把参数传递给被调用函数。所述被调用函数可以修改这些寄存器内的值而不违反该调用约定。一般说来,能将被修改的值从被调用函数返回给调用函数的寄存器可表示为“易失寄存器”。作为函数调用的一部分,由该函数使用的参数值通过调用程序110被载入易失寄存器。在此实例中,预调用指令114将送给所述函数的参数值存储在易失寄存器内。如果要求的参数量多于能被存储在易失寄存器内的量,则另外的参数可以存储在与调用程序110相关联的堆栈框架的已定义位置内。预调用指令115表示存储在堆栈上的参数的指令。调用程序110也包括在函数调用112之后把表示函数结果的值从易失寄存器中卸载的后调用指令116。如果要返回的结果多于易失寄存器能够接收的量,则这些结果可以存储在与调用程序110相关联的堆栈框架的预定义位置内。根据此约定,被调用函数150可以修改易失寄存器而无需中断调用程序110的操作。其他寄存器被认为是易失寄存器。如果被调用函数150修改任何非易失寄存器,它就必须存储在这些寄存器内的值并且在返回到调用程序110之前恢复它们。因此,被调用函数150包括了存储在被调用函数150内可以修改的任何非易失寄存器状态的序言部分152。被调用函数150还包括了恢复被存储在序言152内存储的任何非易失寄存器状态的尾部部分154。当编译被调用函数150时,必须为存储所有的被请求非易失寄存器分配足够的存储器空间。在许多本文档来自技高网
...

【技术保护点】
一种探测软件程序的方法,其中所述软件程序在执行时具有多个位置和操作状态,其中至少一个探头函数适于将关于操作状态的信息记录于所述软件程序内的一位置处,所述方法包括修改所述软件程序用于引发包装函数的执行,而所述包装函数包括引发所述探头函数的执行的至少一个计算机可执行指令。

【技术特征摘要】
US 2005-3-24 11/088,4521.一种探测软件程序的方法,其中所述软件程序在执行时具有多个位置和操作状态,其中至少一个探头函数适于将关于操作状态的信息记录于所述软件程序内的一位置处,所述方法包括修改所述软件程序用于引发包装函数的执行,而所述包装函数包括引发所述探头函数的执行的至少一个计算机可执行指令。2.如权利要求1所述的方法,其特征在于,所述探头函数包括将关于所述软件程序的操作状态的信息写入一日志文件的至少一个计算机可执行指令,并且所述包装函数包括存储表示所述软件程序的操作状态的信息的包装函数。3.如权利要求1所述的方法,其特征在于,所述软件程序由至少一个可执行文件表示,并且修改所述软件程序包括a)反汇编至少一个可执行文件的至少一部分;b)在所述可执行文件的反汇编部分识别引发第三函数执行的指令;c)在至少一个可执行文件内使用引发所述包装函数执行的指令来代替引发所述第三函数执行的所述指令;以及d)在所述包装函数内包括引发所述第三函数执行的指令。4.如权利要求3所述的方法,其特征在于,在至少一个可执行文件内使用引发所述包装函数执行的指令来代替引发所述第三函数执行的所述指令包括使用对所述包装函数的调用来代替对所述第三函数的调用。5.如权利要求4所述的方法,其特征在于,在所述包装函数内包括引发所述第三函数执行的指令包括在所述包装函数内包括以所述第三函数作为其目标的跳转指令。6.如权利要求1所述的方法,其特征在于,所述软件程序由至少一个可执行文件表示,并且修改所述软件程序包括a)反汇编至少一个可执行文件的至少一部分;b)在所述可执行文件的反汇编部分识别在第三函数内并且引发在目标位置处一指令执行的指令;c)在至少一个可执行文件内使用引发所述包装函数执行的指令来代替所述被识别指令;以及d)在所述包装函数内包括引发在目标位置处的指令执行的指令。7.如权利要求1所述的方法,其特征在于,所述软件程序由至少一个可执行文件表示,并且修改所述软件程序包括a)在所述至少一个可执行文件内插入一在探头位置处执行以引发所述包装函数执行的指令;b)在所述包装函数内包括一引发在所述软件程序内邻近所述探头位置处的指令执行的指令。8.如权利要求1所述的方法,其特征在于,所述可执行文件实质上是由可以被带有X64扩展的处理器所处理的指令组成的。9.如权利要求1所述的方法,其特征在于,所述包装函数包括在调用所述探头函数后从所存储信息中恢复所述软件程序的操作状态的至少一个计算机可执行指令。10.一种测试在具有各寄存器的平台上具有多个位置的软件程序的方法,所述寄存器具有值和调用约定,...

【专利技术属性】
技术研发人员:IB阿龙亚
申请(专利权)人:微软公司
类型:发明
国别省市:US[美国]

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1