CN115705250A - 监测堆栈使用量以优化程序 - Google Patents
监测堆栈使用量以优化程序 Download PDFInfo
- Publication number
- CN115705250A CN115705250A CN202210902064.5A CN202210902064A CN115705250A CN 115705250 A CN115705250 A CN 115705250A CN 202210902064 A CN202210902064 A CN 202210902064A CN 115705250 A CN115705250 A CN 115705250A
- Authority
- CN
- China
- Prior art keywords
- stack
- program
- computer
- function
- usage
- 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.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/30—Monitoring
- G06F11/34—Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment
- G06F11/3409—Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment for performance assessment
- G06F11/3433—Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment for performance assessment for load management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
- G06F8/4434—Reducing the memory space required by the program code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/30—Monitoring
- G06F11/3003—Monitoring arrangements specially adapted to the computing system or computing system component being monitored
- G06F11/3037—Monitoring arrangements specially adapted to the computing system or computing system component being monitored where the computing system component is a memory, e.g. virtual memory, cache
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3688—Test management for test execution, e.g. scheduling of test suites
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3692—Test management for test results analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/72—Code refactoring
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Quality & Reliability (AREA)
- Software Systems (AREA)
- Computer Hardware Design (AREA)
- Computing Systems (AREA)
- Mathematical Physics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明涉及监测堆栈使用量以优化程序。本发明实施例提供一种确定堆栈使用量的方法、***和计算机程序产品。该方法包括:执行截获函数以在堆栈中存储堆栈标记,其中,当程序进入或退出程序的多个函数的每个函数时调用截获函数;在程序执行期间识别堆栈中的多个堆栈标记并确定每个堆栈标记的内存地址,以获取多个内存地址;分析所述多个内存地址以识别与最大堆栈深度相关联的特定内存地址;基于最大堆栈深度确定程序的堆栈使用量。
Description
技术领域
本发明实施例涉及基于堆栈的内存分配,更具体地说,涉及监测由程序使用的堆栈内存量并相应地优化程序。
背景技术
堆栈是程序的特定内存区域,其中的数据是以先进后出方式管理的,当程序进入函数时,向堆栈添加数据;当程序退出函数时,删除该数据。通常用堆栈来存储当前活动的函数的局部定长变量。也可将堆栈也用于调用方自变量(caller arguments)、局部变量、寄存器保存区域、返回地址、保存的堆栈指针、对齐填充(alignment padding)和/或其他数据,具体取决于使用的编译器和调用协议。
程序需要的堆栈量可能是事先未知的,但可以使用各种技术根据经验确定。一般来说,程序员寻求在不分配过多堆栈的情况下分配足以满足程序需求的堆栈量,从而确保程序可以正确执行,同时避免不必要的计算资源消耗。
发明内容
根据本发明的一个实施例,计算机***确定堆栈使用量。执行截获函数(intercept function),以在堆栈中存储堆栈标记,其中,当程序进入或退出程序的多个函数的每个函数时调用截获函数。在程序执行期间识别堆栈中的多个堆栈标记并确定每个堆栈标记的内存地址,以获取多个内存地址。分析所述多个内存地址以识别与最大堆栈深度相关联的特定内存地址。基于最大堆栈深度确定程序的堆栈使用量。本发明的实施例还包括用于以与上述基本相同的方式确定堆栈使用量的方法和程序产品。
附图说明
一般来说,不同附图中的相似标号用来表示相似的部件。
图1是描述根据本发明实施例的用于确定堆栈使用量的计算环境的框图;
图2是描述根据本发明实施例的运行时程序的框图;
图3是描述根据本发明实施例的堆栈的框图;
图4是描述根据本发明实施例的堆栈使用量数据的收集的框图;
图5是描述根据本发明实施例的确定堆栈使用量的方法的流程图;
图6是描述根据本发明实施例的收集堆栈跟踪的方法的流程图;
图7是描述根据本发明实施例对堆栈跟踪树的框图;
图8是描述根据本发明实施例的计算设备的框图。
具体实施方式
本发明实施例涉及基于堆栈的内存分配,更具体地说,涉及监测由程序使用的堆栈内存量并相应地优化程序。堆栈内存,也称为堆栈,是由程序的当前执行的函数使用的内存区域,以便这些函数可以存储数据。存储在堆栈中的数据,以后进先出的方式存储,并且,随着在特定时间执行的函数数量和/或每个函数存储的数据量的增加,堆栈从内存中的起点地址(origin address)增长。从堆栈起点到存储最近存储的数据所在的内存地址的内存地址范围,表示程序的当前堆栈使用量(stack usage)。如果最大堆栈使用量是已知的,则可以保留与最大堆栈使用量相等的内存量,从而确保程序有足够的内存用于执行,而无需不必要地保留超过必需的内存。
然而,程序的最大堆栈使用量,可能是事先未知的;相反,确定堆栈使用量可能需要在运行时分析程序。确定程序堆栈使用量的常规方法,要求在监测程序下运行程序,在编译或后处理过程中将附加的繁琐的代码链接到程序中,或者以短时间隔检查堆栈水平。这些方法通常会影响或中断程序执行,并且可能非常乏味,因为一个程序可能包含数以干计的函数。因此,测量堆栈使用量的常规技术在客户生产环境中是不可行的。
相反,本发明实施例可以以不需要仪器(或基于计时器的分析的方式来确定程序的最大堆栈使用量和每函数层(per-function level)的堆栈使用量。本发明实施例可以在不影响程序执行的情况下确定堆栈使用量,从而提供了一种使得能够在生产环境或其他用例(use-cases)中确定堆栈使用量的实用方法。具体而言,本发明实施例利用在大多数编程语言中实现的预先存在的函数跟踪***,使得每当程序进入和/或退出函数时都能够自动捕获堆栈使用量数据。此外,本发明实施例可以完全地收集对应于程序的所有用例的数据,包括代表程序状态的变量和数据,从而通过使用户能够快速找到与其自己的堆栈跟踪密切匹配的代码来改进调试过程。
因此,本发明实施例提供了用于确定程序堆栈使用量的改进技术。一旦知道最大堆栈使用量,就可以对程序进行优化,使程序只使用执行所需的堆栈量,同时还可以避免潜在的堆栈溢出错误或堆栈用尽故障。此外,本发明实施例可以收集通常不可获得的与程序执行有关的数据,包括说明变量或程序状态的执行路径,这改进了调试,因为可以获取程序执行的详尽概述。因此,本发明实施例通过减少程序消耗的计算资源量、通过增加程序的稳定性以及通过提供改进的调试技术,提供了改进计算领域的实际应用。
应当注意,本说明书中对特征、优点或类似语言的提及,并不意味着通过本文所公开的实施例可以实现的所有特征和优点,均存在于或应当存在于本发明的任何单个实施例中。相反,应当理解,提及特征和优点的语言意味着结合实施例描述的特定特征、优点或特性,包括在本发明的至少一个实施例中。因此,贯穿本说明书对特征、优点和类似语言的讨论,可能但不一定涉及同一实施例。
此外,可以在一个或多个实施例中以任何适当的方式组合本发明的所述特征、优点和特征。相关领域的技术人员将认识到,可以在没有特定实施例的一个或多个特定特征或优点的情况下实施本发明。在其他情况下,在某些实施例中可识别出可能未在本发明的所有实施例中出现的其他特征和优点。
这些特征和优点将更显见于以下附图、描述和所附权利要求,或者可以通过实践下文所述的本发明实施例而习得。
现在将参考附图详细描述本发明实施例。图1是描述根据本发明实施例的用于确定堆栈使用量的计算环境100的框图。如图所示,计算环境100包括客户端设备105、调试服务器140和网络160。应当理解,计算环境100的组件之间的功能划分是为了解释本发明实施例而选择的,不应被解释为限制性示例。
客户端设备105包括网络接口(I/F)106、至少一个处理器107、存储器110和数据库135。存储器110可以包括编译器模块115、程序120、标记分析模块125和测试模块130。客户端设备105可以包括膝上型计算机、平板计算机、笔记本计算机、个人计算机(PC)、台式计算机、个人数字助理(PDA)、智能电话、瘦客户端或能够执行计算机可读程序指令的任何可编程电子设备。网络接口106使得客户端设备105的组件能够通过网络(例如网络160)发送和接收数据。一般而言,客户端设备105支持软件应用程序的开发、应用程序堆栈使用量的确定和应用程序的优化。客户端设备105可以包括如关于图8进一步详细示出和描述的内部和外部硬件组件。
编译器模块115、程序120、标记分析模块125和测试模块130可以包括用以执行下面描述的本发明实施例的各种功能的一个或多个模块或单元。编译器模块115、程序120、标记分析模块125和测试模块130可以由任意数量的软件和/或硬件模块或单元的任何组合来实现,并且可以驻留在客户端设备105的存储器110中,以供诸如处理器107的处理器执行。
编译器模块115可以包括用于将用一种编程语言编写的计算机代码翻译成另一种语言的任何常规或其他计算机程序。编译器模块115可以将源代码从高级编程语言翻译为低级语言(例如,汇编语言、目标代码或机器代码),以创建可执行程序。例如,编译器模块115可以编译用Java或C编程语言编写的源代码,以生成可执行应用程序。
程序120模块可以包括通过将跟踪函数***程序120的函数以在执行期间获取堆栈跟踪而实现的跟踪***。因此,当程序进入或退出每个函数时,跟踪函数被调用,获取堆栈跟踪。堆栈跟踪(stacktrace)是程序执行期间某个时间点的活动堆栈帧的报告。每个堆栈帧被视为堆栈上与特定函数调用有关的所有信息的集合,可以包括局部变量、可能需要恢复的被函数修改的寄存器的保存副本(saved copies)、参数(argument parameters)和(使返回语句能返回到正确位置的)返回地址。因此,堆栈跟踪表示程序在特定执行时刻的快照(snapshot),并且由于堆栈跟踪指示当前活动的函数,因此堆栈跟踪可以对调试或其他目的来说是有用的。
在编译器模块115编译的任何程序的运行时,可以用由跟踪******的跟踪函数来调用截获函数。特别地,程序(例如程序120)的运行时设置,可以指定跟踪函数调用截获函数和/或记录测试用例的堆栈帧。此外,不可提供程序的运行时参数,在这种情况下,跟踪***可以不影响程序的执行。因此,当调用特定函数时,跟踪函数被调用,跟踪函数进而可以调用截获函数。
截获函数可以在堆栈中***堆栈标记(stack marker),其可包括一个用于标记堆栈内存中的特定位置的变量。截获函数可以获取堆栈标记的内存地址,并可以保存该内存地址和程序的当前函数的相应名称。由于堆栈沿特定方向(内存地址升序或降序方向)增长的,对于给定函数来说,堆栈标记的内存地址可以表示程序当时的堆栈使用量。此外,截获函数可以与堆栈标记的内存地址和函数名称一起存储与执行函数对应的线程标识符和/或进程标识符。
程序120可以包括根据本发明实施例由编译器模块115编译的任何软件应用程序。因此,程序120可以包括***到程序120的每个函数中的跟踪函数,并且跟踪函数自己可以调用截获函数。程序120可以执行源代码语言支持的任何期望操作。关于图2更详细地示出和描述了程序120。
标记分析模块125可以分析通过***程序120的截获函数所获取的堆栈标记数据。标记分析模块125可以分析在程序120的执行期间实时接收的堆栈标记数据,或者可以分析在程序120的执行之后提供的堆栈标记数据。在一些实施例中,标记分析模块125通过将每个堆栈标记的内存地址与对应于堆栈起点(origin)的基准地址进行比较来确定峰值或最大堆栈使用量。由于堆栈仅在一个特定方向上增长,内存地址离基准地址最远的堆栈标记指示程序120消耗堆栈最多的点。由于每个内存地址存储已知数量的位(bit),因此确定堆栈标记的内存地址与基准地址之间的差异与准确的位数相关。从堆栈中的特定内存地址到基准地址的距离称为堆栈深度,在程序执行期间具有最大堆栈深度的堆栈标记对应于程序的峰值或最大堆栈使用量。
在一些实施例中,标记分析模块125通过比较第一函数与被第一函数调用的第二个函数的堆栈标记的内存地址,来确定每函数堆栈使用量(per-function stack usage)。特别地,当一个函数调用另一个函数时,堆栈的增加量等于或近似等于被调用函数的堆栈内存使用量。因此,通过确定堆栈中相邻的堆栈标记(例如,某堆栈标记及其紧邻的堆栈标记)之间的内存地址的差异,可以在每个函数级别上确定堆栈使用量。
测试模块130可以包括回归测试套件,其可以对程序执行功能和非功能测试,以测试程序的性能。在一些实施例中,测试模块130执行测试以确保软件在软件变更后仍按预期执行。具体而言,测试模块130可以在内部故障(bug)或客户问题被修复时或者在向程序添加新特性时执行测试,以测试对程序的变更。测试模块130可以运行诸如程序120的程序的所有代码路径以确保实现最大的代码覆盖率,程序的所有函数的数据都被收集。
在一些实施例中,当测试模块130测试程序(如程序120)时,函数的入口和/或出口调用截获函数,并导致在该时刻获取堆栈跟踪。在一些实施例中,将堆栈跟踪和相应的测试用例号(例如,与该代码路径相关联的测试用例的测试用例号)存储在数据库中,例如数据库135中。在一些实施例中,将堆栈跟踪和测试用例号存储到由测试模块130生成的测试日志中,然后处理结果测试日志,以获取并存储堆栈跟踪和相应的测试用例号。测试模块130可以为程序生成测试数据集,其包括堆栈跟踪、堆栈跟踪标识符(即每个唯一性堆栈跟踪的唯一性标识符)和能再现(reproduce)每个堆栈跟踪的测试用例的测试用例编号的列表。可以将测试模块130生成的测试数据集上传到服务器,例如调试服务器140,使得其他开发人员和用户能执行诸如问题再现的调试任务。
在一些实施例中,通过生成树结构来存储测试数据集,树结构中的每个节点表示一个函数:根节点对应于主函数,子节点对应于主函数调用的函数。因此,n级节点表示深度为n个函数的堆栈跟踪。可以在每个节点上存储调用该节点所代表的当前函数的测试用例的列表。在一些实施例中,该列表可以是覆盖该特定函数的测试用例的压缩列表,并且可以用位向量或其他合适的压缩存储方法来表示该列表。
数据库135可以包括本领域已知的任何非易失性存储介质。例如,数据库135可以通过磁带库、光盘库、一个或多个独立硬盘驱动器或独立磁盘冗余阵列(RAID)中的多个硬盘驱动器来实现。类似地,数据库135中的数据可以符合本领域已知的任何合适的存储架构,例如文件、关系数据库、面向对象数据库和/或一个或多个表。在一些实施例中,数据库135可以存储包括源代码、编译的程序数据、程序峰值堆栈使用量和每函数堆栈使用量数据、测试数据集、堆栈跟踪数据等的数据。
调试服务器140包括网络接口(I/F)141、至少一个处理器142、存储器145和数据库155。存储器145可以包括查询处理模块150。调试服务器140可以包括膝上型计算机、平板计算机、笔记本计算机、个人计算机(PC)、台式计算机、个人数字助理(PDA)、智能电话、瘦客户端或能够执行计算机可读程序指令的任何可编程电子设备。网络接口141使调试服务器140的组件能够通过网络(例如网络160)发送和接收数据。一般而言,调试服务器140存储程序的测试数据集,使得开发人员和用户能执行诸如问题再现的调试任务。调试服务器140可包括如关于图8进一步详细示出和描述的内部和外部硬件组件。
查询处理模块150可以包括用以执行下面描述的本发明实施例的各种功能的一个或多个模块或单元。查询处理模块150可以由任意数量的软件和/或硬件模块或单元的任意组合来实现,并且可以驻留在调试服务器140的存储器145中,以供处理器(例如处理器142)执行。
查询处理模块150可以接收和处理来自远程计算设备的查询,诸如来自客户端设备105和/或其他计算设备的查询。特别地,查询可以包括从程序中获取的错误报告,技术人员可以使用该报告来尝试复制错误,以识别根本原因并制定错误修复方案。因此,查询可以包括与程序遇到的错误相对应的堆栈跟踪。查询处理模块150可以分析接收到的堆栈跟踪,以识别存储在数据库155中的相同或类似堆栈跟踪,数据库155中可以填充堆栈跟踪和测试模块130生成的其他测试数据(例如,堆栈跟踪标识符(即每个唯一性堆栈跟踪的唯一性标识符),以及可以再现每个堆栈跟踪的测试用例的测试用例号列表)。查询处理模块150通过提供包括测试用例号和/或再现所识别的堆栈跟踪的测试用例的数据来响应查询,该数据可能在再现其对应的堆栈跟踪包括在查询中的错误时有用。
查询处理模块150可以通过将所查询的堆栈跟踪的堆栈帧与数据库155中每个堆栈跟踪的堆栈帧进行比较以找到最接近的匹配,来识别与查询中提供的堆栈跟踪相同或相似的堆栈跟踪。在一些实施例中,基于所查询的堆栈跟踪与数据库155中的堆栈跟踪之间匹配的最大堆栈帧数,来确定最接近的匹配。因此,查询处理模块150可以迭代地将所查询的堆栈跟踪的堆栈帧与给定程序在数据库155中的堆栈跟踪中的每个进行比较,直到可以识别出最接近或精确的匹配。
在一些实施例中,查询处理模块150利用测试模块130生成的树结构来执行查询处理。特别地,可以使用常规或其他最大子树识别技术来识别与查询的堆栈跟踪最匹配的特定子树,从而识别相关联的测试用例。
数据库155可以包括本领域已知的任何非易失性存储介质。例如,数据库155可以使用磁带库、光盘库、一个或多个独立硬盘驱动器或独立磁盘冗余阵列(RAID)中的多个硬盘驱动器来实现。类似地,数据库155中的数据可以符合本领域已知的任何合适的存储架构,例如文件、关系数据库、面向对象数据库和/或一个或多个表。在一些实施例中,数据库155可以存储与程序的测试数据集相关的数据,包括堆栈跟踪数据、堆栈跟踪标识符(即每个唯一性堆栈跟踪的唯一性标识符)、可再现每个堆栈跟踪的测试用例的测试用例号列表、堆栈跟踪树等。
网络160可以包括局域网(LAN)、广域网(WAN)(如互联网)或二者的组合,并包括有线、无线或光纤连接。一般来说,网络160可以是本领域已知的连接和协议的任意组合,根据本发明的实施例,这些连接和协议将支持客户端设备105、调试服务器140和/或其他计算设备之间通过其各自的网络接口进行通信。
图2是描述根据本发明实施例的运行时程序120的框图。如图所示,程序120包括多个函数205A-205N和***每个函数中的截获函数210。在程序120的执行期间,每个函数205A-205N都可以调用一个或多个其他函数,以便实现特定的编程目标。每当函数205A-205N中的任何一个被调用时,都可以调用截获函数210。当调用截获函数210时,截获函数210可以在堆栈中存储堆栈标记,获取堆栈标记的内存地址,并将该内存地址与当前函数的名称、线程标识符和进程标识符一起存储起来。截获函数210在每次调用时存储的数据(例如,内存地址、函数名、线程标识符和/或进程标识符),可以存储在堆栈之外的位置,例如非易失性存储器(例如,数据库135)。
图3是描述根据本发明实施例的堆栈300的框图。如图所示,堆栈300向上增长,每个新函数被调用时,新函数将数据存储在堆栈300的顶部。堆栈300包括多个堆栈帧,包括一个或多个在前函数(preceding functions)的堆栈帧,即名为“FUNCTION_1”的函数的堆栈帧和名为“FUNCTION_2”的函数的堆栈帧。每个堆栈帧对应于给定函数存储在堆栈中的数据。
每个堆栈帧可以包括作为传递给函数的自变量值的参数。在所示的示例中,FUNCTION_1存储参数310,FUNCTION_2存储参数340。除参数外,函数还存储指向函数的调用方的返回地址。在所示的示例中,由于FUNCTION_2的堆栈帧在FUNCTION_1的堆栈帧之上,因此FUNCTION_1是调用了FUNCTION_2的调用方函数,因此,返回地址350指向FUNCTION_1的地址。依次地,返回地址320指向FUNCTION_1的调用方函数。
函数的本地(locals)对应于局部变量(如果有的话)的存储空间。截获函数为每个函数存储的堆栈标记,被存储在本地。在所示的示例中,FUNCTION_2的堆栈标记被存储在本地360,FUNCTION_1的堆栈标记被存储在本地330。由于函数的局部变量存储在函数堆栈帧的顶部,因此从一个堆栈标记到另一个堆栈标记的距离对应于函数的跨度(span),从而对应于堆栈使用量。特别地,可以通过确定内存中从函数2的堆栈标记到函数1的堆栈标记的距离来获得函数2的堆栈使用量。
图4是描述根据本发明实施例的堆栈使用量数据的收集的框图400。如图所示,名为“function1”的第一函数405调用名为“function2”的第二函数410,第二函数410依次又调用名为“function3”的第三函数415。每个函数的示例代码包括对应于截获函数的traceEntry函数;因此,截获函数被函数405、410和415中的每一个调用。示例代码中也示出,截获函数创建一个变量(这里是一个名为“marker”的整数型变量),获取该变量的内存地址,并获取当前函数的名称。可以将函数及其堆栈标记的相应内存地址汇集成表420,可以对该表进行分析以识别堆栈使用量。特别地,可以根据函数堆栈标记的内存地址来确定函数每次进入时的堆栈使用量。可以用使用量提要425的形式,提供每个函数进入时的堆栈使用量,可以对使用量提要进行排序,生成指示在程序执行期间实现的最大堆栈使用量的表430。
图5是描述根据本发明实施例的确定堆栈使用量的方法500的流程图。
在操作510处,编译程序,并启动编译后程序的执行。可以使用本机支持堆栈跟踪***的编译器来编译程序。在运行时,程序的设置可以指定堆栈跟踪***调用截获函数以启用对堆栈使用量的监测,和/或该设置可以指定堆栈跟踪***记录测试用例的堆栈跟踪(如图6进一步示出和描述的那样)。因此,当执行程序进入和/或退出每个函数时,可以调用跟踪函数来选择性地获取堆栈跟踪,和/或跟踪函数可以调用截获函数。
在操作520处,当程序进入和/或退出每个函数时,存储堆栈标记,并获取堆栈标记的内存地址以及每个函数的名称、线程标识符和/或进程标识符。可以将获取每个堆栈标记的内存地址的操作作为创建堆栈标记的后续操作,因为每个特定堆栈标记都可能不会在内存中驻留很长时间,这是因为,函数可能会退出,出栈(pop)操作可能会导致堆栈标记不再是可检索的。截获函数可以包括将堆栈标记的内存地址以及函数的名称、线程标识符和函数的进程标识符写入诸如非易失性存储位置或堆栈外的其他位置的特定位置的代码。
在操作530处,分析所获取的信息,以确定峰值堆栈使用量和每函数堆栈使用量。对于被另一个函数调用的每个函数,可以通过比较被调用函数的堆栈标记内存地址与调用方函数的堆栈标记内存地址来确定被调用函数的堆栈使用量。因此,通过确定内存地址的差异,就可以确定单个函数的堆栈使用量。此外或者作为替代,也可以将内存地址与代表堆栈底部的基准内存地址进行比较,以确定给定函数被调用时的当前堆栈使用量,以及程序的最大堆栈使用量。在一些实施例中,用一个向量存储当前堆栈使用量的值,并且,响应于截获函数所获取的内存地址比当前存储的值离基准地址更远,向量用新值覆盖该值。因此,向量可始终存储迄此遇到的最高堆栈使用量相关联的值,并且,当程序完成执行时,向量存储的值应当对应于程序的最大堆栈使用量。
在一些实施例中,可以处理所获取的信息以去除异常值或不良数据。此外或者替代地,可以多次执行程序,以识别异常值或不良数据,然后将其删除。每函数堆栈使用量可以按使用量进行排序并呈示,使得按特定的使用量顺序,例如按从最大到最小或从最小到最大的顺序,排列函数。还可以一并呈示最大堆栈使用量连同和与最大堆栈使用量和/或最大堆栈使用量发生时的堆栈跟踪相关联的函数的指示一并呈现。可以根据堆栈使用量数据,建议每个线程的堆栈大小或每个进程的堆栈大小。
在操作540处,对程序进行优化。在一些实施例中,可以通过重新编译程序,使得程序分配给堆栈的内存不会超过最大堆栈使用量期间使用的内存量,以优化程序。在一些实施例中,可以执行代码重构(code refactoring)操作来修改函数被调用的顺序,使得在堆栈使用量峰值时活动的一个或多个函数,转而在另一个执行点被调用,从而减少堆栈使用量峰值。这些代码优化可以相互结合起来执行和/或与其他常规或新型优化技术结合起来执行,并且可以自动执行以生成优化的程序。
图6是示出根据本发明实施例收集堆栈跟踪的方法600的流程图。
在操作610处,用回归套件(regression suite)来测试程序。回归套件可以通过执行大量测试来测试程序,以检查程序的完整性,这些测试使程序执行每个可能的代码路径,包括功能测试和非功能测试。
在操作620处,获取程序的堆栈跟踪。在测试期间,堆栈跟踪可以在每个函数进入和/或退出时被获取,并且可以包括与每个特定时间的当前堆栈帧相对应的数据。此外,跟踪函数每次被调用(即函数进入/退出)时,数据可包括变量和/或程序状态。
在操作630处,接收包括与错误相关联的堆栈跟踪的请求。由于程序遇到错误,堆栈跟踪可由在请求实体的计算设备或另一计算设备上执行的程序生成。
在操作640处,将所接收的堆栈跟踪与程序的其他堆栈跟踪进行比较,以确定最接近的匹配。数据库可以存储程序的堆栈跟踪,其包括在每个执行分支处活动的函数以及用于获取每个堆栈跟踪的一个或多个测试用例(即,回归测试套件执行的特定测试)。在一些实施例中,堆栈跟踪树由对应于调用方函数的根节点和对应于被调用函数的子节点构成;每个节点可以包括一个或多个与该节点的函数相关联的测试用例。因此,可以用所接收的堆栈跟踪来执行最大的公共子树搜索,并且可以获取与最底层节点相关联的一个或多个测试用例。
在操作650处,将与最接近的匹配堆栈跟踪对应的测试用例提供回请求实体。这些测试用例对应于由回归测试套件确定的该程序的与请求实体遇到的错误相关联的状态最接近的状态。因此,可以使用测试用例来复制问题,以便可以执行调试。
图7是描述根据本发明实施例的堆栈跟踪树700的框图。如图所示,堆栈跟踪树700包括多个节点,每个节点对应于程序的一个函数。由于使用回归测试套件对程序进行了多次测试,因此可以获取每个函数的堆栈跟踪;可以将堆栈跟踪与通过的测试(passedtests)或失败的测试(failed tests)关联。此外,每个节点存储一个或多个与堆栈跟踪相关联的测试用例,以便可以复制与每个堆栈跟踪对应的状态。在一些实施例中,堆栈跟踪树700可用于快速识别特别是需要额外测试的函数。
当接收到包括堆栈跟踪的请求时,可以将该请求与堆栈跟踪树700的每个子树进行比较,以确定最接近的匹配。例如,如果请求包括堆栈跟踪DoFailed、DoX和RunX,则将基于最大子树识别技术选择子树705,并将向请求实体提供与DoFailed节点相关联的测试用例。
图8是示出适用于执行本文所述方法的计算机10的组件的框图。根据本发明的实施例,计算机10可以实现客户端设备105和/或调试服务器140。应当理解,图8仅提供了一个实施例的示例,并不意味着对可以实现不同实施例的环境的任何限制。可以对所示环境进行许多修改。
如图所示,计算机10包括通信结构12,其提供计算机处理器14、存储器16、持久存储器18、通信单元20和输入/输出(I/O)接口22之间的通信。通信结构12可以使用设计用于在处理器(例如微处理器、通信和网络处理器等)、***存储器、***设备和***内的任何其他硬件组件之间传递数据和/或控制信息的任何架构来实现。例如,通信结构12可以用一个或多个总线实现。
存储器16和持久存储器18是计算机可读存储介质。在所示实施例中,存储器16包括随机存取存储器(RAM)24和高速缓冲存储器26。一般而言,存储器16可以包括任何合适的易失性或非易失性计算机可读存储介质。
可以将一个或多个程序存储在持久存储器18中,供一个或多个相应的计算机处理器14通过存储器16中的一个或多个存储器执行。持久存储器18可以是硬盘驱动器、固态硬盘驱动器、半导体存储设备、只读存储器(ROM)、可擦除可编程只读存储器(EPROM)、闪存或能够存储程序指令或数字信息的任何其他计算机可读存储介质。
持久存储器18使用的介质也可以是可移动的。例如,可移动硬盘驱动器可用于持久存储器18。其他示例包括***驱动器以传输到另一计算机可读存储介质(也是持久存储器18的一部分)的光盘和磁盘、拇指驱动器和智能卡。
在这些示例中,通信单元20提供与其他数据处理***或设备的通信。在这些示例中,通信单元20包括一个或多个网络接口卡。通信单元20可以通过使用物理和无线通信链路之一或两者来提供通信。
输入/输出接口22允许与可能连接到计算机10的其他设备进行数据输入和输出。例如,输入/输出接口22可以提供到诸如键盘、小键盘、触摸屏的外部设备28和/或一些其他合适的输入设备的连接。外部设备28还可以包括便携式计算机可读存储介质,例如拇指驱动器、便携式光盘或磁盘以及存储卡。
用于实施本发明实施例的软件和数据,可存储在此类便携式计算机可读存储介质上,并可通过I/O接口22加载到持久存储器18上。输入/输出接口22也可以连接到显示器30。显示器30提供向用户显示数据的机制,可以是例如计算机监视器。
本文中描述的程序是基于在本发明的特定实施例中为其实现的应用来标识的。然而,应当理解,本文中的任何特定程序命名法仅是为了方便,因此不应将本发明仅限于在此类命名法标识和/或暗示的任何特定应用中使用。
与确定堆栈内存使用量以优化程序有关的数据(例如,程序数据、内存地址数据、堆栈使用量数据、堆栈跟踪数据等),可以存储在任何常规或其他数据结构(例如,文件、阵列、列表、堆栈、队列、记录等)中,也可以存储在任何所需的存储单元(例如,数据库、数据或其他存储库、队列等)中。在客户端设备105和/或调试服务器140之间传输的数据,可以包括任何期望的格式和排列,并且可以包括任何数量的任何大小的任何类型的字段,用来存储数据。任何数据集的定义和数据模型可以以任何期望的方式(例如,计算机相关语言、图形表示、列表等)指示整体结构。
与确定堆栈内存使用量以优化程序有关的数据(例如,程序数据、内存地址数据、堆栈使用量数据、堆栈跟踪数据等),可以包括提供给客户端设备105和/或调试服务器140或由客户端设备105和/或调试服务器140生成的任何信息。与确定堆栈内存使用量以优化程序有关的数据,可以包括任何期望的格式和排列,并且可以包括任何数量的任何大小的任何类型的字段,用来存储任何期望的数据。与确定堆栈内存使用量以优化程序有关的数据,可以包括通过任何收集机制收集的关于实体的任何数据、所收集的信息的任何组合以及通过分析所收集的信息而导出的任何信息。
本发明实施例可以使用任意数量的任何类型的用户界面(例如,图形用户界面(GUI)、命令行、提示等)来获取或提供信息(例如,与确定堆栈内存使用量以优化程序有关的数据),其中,界面可以包括以任何方式排列的任何信息。界面可以包括在任何位置布置的任何数量的任何类型的输入或驱动机制(例如按钮、图标、字段、框、链接等),用以通过任何合适的输入设备(例如鼠标、键盘等)输入/显示信息并启动所需的动作。界面屏幕可以包括任何合适的执行器(例如,链接、选项卡等),用以任何方式在屏幕之间导航。
应当理解,以上描述的和附图所示的实施例仅代表监测程序的堆栈内存使用量的多种方式中的一部分。
本发明实施例的环境可以包括任何数量的计算机或其他处理***(例如,客户端或终端用户***、服务器***等)以及以任何期望方式布置的数据库或其他存储库,其中,本发明实施例可应用于任何期望类型的计算环境(例如,云计算、客户端-服务器、网络计算、大型机、独立***等)。本发明实施例使用的计算机或其他处理***可以由任意数量的任何个人或其他类型的计算机或处理***(例如,台式机、笔记本电脑、PDA、移动设备等)实现,并且可以包括任何商用操作***以及商用软件和定制软件(例如,通信软件、服务器软件、编译器模块115、程序120、标记分析模块125、测试模块130、查询处理模块150等)的任何组合。这些***可以包括用于输入和/或查看信息的任何类型的监视器和输入设备(例如,键盘、鼠标、语音识别等)。
应当理解,本发明实施例的软件(例如,通信软件、服务器软件、编译器模块115、程序120、标记分析模块125、测试模块130、查询处理模块150等)可以用任何期望的计算机语言来实现,并且可以由计算机领域的普通技术人员基于说明书中包含的功能说明和附图中所示的流程图来开发。此外,本文中对执行各种功能的软件的任何提及一般指在软件控制下执行这些功能的计算机***或处理器。本发明实施例的计算机***可替代地由任何类型的硬件和/或其他处理电路实现。
计算机或其他处理***的各种功能可以任何方式分布在任何数量的软件和/或硬件模块或单元、处理***或计算机***和/或电路中,其中,计算机或处理***可以彼此本地或远程地布置,并通过任何合适的通信介质(例如,LAN、WAN、内联网、因特网、硬导线、调制解调器连接、无线等)进行通信。例如,本发明实施例的功能可以以任何方式分布在各种终端用户/客户端和服务器***和/或任何其他中间处理设备之间。可以以实现本文所述功能的任何方式修改以上描述的以及流程图中所示的软件和/或算法。此外,流程图或说明中的功能可以按实现所需操作的任何顺序执行。
本发明实施例的软件(例如,通信软件、服务器软件、编译器模块115、程序120、标记分析模块125、测试模块130、查询处理模块150等)可以在固定或便携式程序产品装置或设备的非瞬态计算机可用介质(例如,磁性或光学介质、磁光介质、软盘、CD-ROM、DVD、内存设备等)上提供,用于独立***或通过网络或其他通信介质连接的***。
通信网络可以由任意数量的任何类型的通信网络(例如LAN、WAN、内部网、因特网、VPN等)实现。本发明实施例的计算机或其他处理***可以包括通过任何常规或其他协议在网络上通信的任何常规或其他通信设备。计算机或其他处理***可以利用任何类型的连接(例如,有线、无线连接等)来访问网络。本地通信介质可以由任何合适的通信介质(例如,局域网(LAN)、硬导线、无线链路、内部网等)实现。
***可以使用任意数量的任何传统或其他数据库、数据存储或存储结构(例如,文件、数据库、数据结构、数据或其他存储库等)来存储信息(例如,与确定堆栈使用量以优化程序有关的数据)。数据库***可以由任意数量的任何传统或其他数据库、数据存储器或存储结构(例如,文件、数据库、数据结构、数据或其他存储库等)来实现,以存储信息(例如,与确定堆栈使用量以优化程序有关的数据)。数据库***可以包括在服务器和/或客户端***内,或耦合到服务器和/或客户端***。数据库***和/或存储结构可以远离计算机或其他处理***或位于计算机或其他处理***本地,并且可以存储任何期望的数据(例如,与确定堆栈使用量以优化程序有关的数据)。
本发明实施例可以使用任意数量的任何类型的用户界面(例如,图形用户界面(GUI)、命令行、提示等)来获取或提供信息(例如,与确定堆栈内存使用量以优化程序有关的数据),其中,界面可以包括以任何方式排列的任何信息。界面可以包括在任何位置布置的任何数量的任何类型的输入或驱动机制(例如按钮、图标、字段、框、链接等),用以通过任何合适的输入设备(例如鼠标、键盘等)输入/显示信息并启动所需的动作。界面屏幕可以包括任何合适的执行器(例如,链接、选项卡等),用以任何方式在屏幕之间导航。
本发明实施例不限于上述特定任务或算法,但可用于相关领域中的任何数量的应用,包括但不限于分析执行期间程序的堆栈使用量并相应地优化程序。
本文使用的术语仅用于描述特定实施例,并不旨在限制本发明。如本文所用的,除非上下文另有明确指示,否则单数形式“一”、“一个”和“该”也旨在包括复数形式。将进一步理解,术语“包括”、“包含”、“含有”、“含”、“有”、“具有”、“带有”等在本说明书中使用时,指定所述特征、整数、步骤、操作、元素和/或组件的存在,但不排除一个或多个其他特征、整数、步骤、操作、元素、组件和/或其组合的存在或添加。
以下权利要求中的所有装置或步骤加功能元件的对应结构、材料、动作和等效物旨在包括用于与如具体要求保护的其他要求保护的元件组合来执行功能的任何结构、材料或动作。已经出于说明和描述的目的给出了本发明的描述,但所述描述并不旨在是穷尽的或限于所公开本发明的形式。在不脱离本发明的范围和精神的情况下,许多修改和变化对于本领域普通技术人员来说是显而易见的。选择和描述实施例以便最好地解释本发明的原理和实际应用,并且使本领域的其他普通技术人员能够理解本发明的具有适合于预期的特定用途的各种修改的各种实施例。
已经出于说明的目的给出了本发明的各个实施例的描述,但这些并不旨在是穷尽的或限于所披露的实施例。在不脱离所描述的实施例的范围和精神的情况下,许多修改和变化对本领域普通技术人员将是显而易见的。这里使用的术语被选择来最好地解释实施例的原理、实际应用或对在市场中找到的技术的技术改进,或者使得本领域普通技术人员能够理解这里公开的实施例。
本发明可以是任何可能的技术细节集成水平的***、方法、和/或计算机程序产品。计算机程序产品可包括其上具有用于使处理器执行本发明的各方面的计算机可读程序指令的计算机可读存储介质。
计算机可读存储介质可以是可保留和存储供指令执行设备使用的指令的有形设备。计算机可读存储介质可以是,例如但不限于,电子存储设备、磁存储设备、光存储设备、电磁存储设备、半导体存储设备、或者上述的任意合适的组合。计算机可读存储介质的更具体示例的非穷尽列表包括以下各项:便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、静态随机存取存储器(SRAM)、便携式紧凑盘只读存储器(CD-ROM)、数字通用盘(DVD)、记忆棒、软盘、诸如穿孔卡或具有记录在其上的指令的槽中的凸出结构之类的机械编码设备、以及上述各项的任何合适的组合。如本文所使用的计算机可读存储介质不应被解释为暂时性信号本身,例如无线电波或其他自由传播的电磁波、通过波导或其他传输介质传播的电磁波(例如,穿过光纤电缆的光脉冲)或通过电线发射的电信号。
本文所述的计算机可读程序指令,可以从计算机可读存储介质下载到相应的计算/处理设备,或者通过网络(例如,互联网、局域网、广域网和/或无线网络)下载到外部计算机或外部存储设备。网络可以包括铜传输电缆、光传输纤维、无线传输、路由器、防火墙、交换机、网关计算机和/或边缘服务器。每个计算/处理设备中的网络适配器卡或网络接口接收来自网络的计算机可读程序指令,并转发计算机可读程序指令以存储在相应计算/处理设备内的计算机可读存储介质中。
用于执行本发明的操作的计算机可读程序指令可以是汇编指令、指令集架构(ISA)指令、机器指令、机器相关指令、微代码、固件指令、状态设置数据、或以一种或多种编程语言的任何组合编写的源代码或目标代码,这些编程语言包括面向对象的编程语言(如Java、Smalltalk、C++等)和常规的过程编程语言(如“C”编程语言或类似的编程语言)。计算机可读程序指令可以完全地在用户计算机上执行、部分在用户计算机上执行、作为独立软件包执行、部分在用户计算机上部分在远程计算机上执行或者完全在远程计算机或服务器上执行。在后一种情况下,远程计算机可通过任何类型的网络(包括局域网(LAN)或广域网(WAN))连接至用户计算机,或者可连接至外部计算机(例如,使用互联网服务提供商通过互联网)。在一些实施例中,包括例如可编程逻辑电路、现场可编程门阵列(FPGA)或可编程逻辑阵列(PLA)的电子电路可以通过利用计算机可读程序指令的状态信息来使电子电路个性化来执行计算机可读程序指令,以便执行本发明的各方面。
本文参照根据本发明实施例的方法、装置(***)和计算机程序产品的流程图和/或框图来描述本发明的各个方面。应当理解,流程图和/或框图的每个框以及流程图和/或框图中各框的组合,都可以通过计算机可读程序指令实现。
这些计算机可读程序指令可被提供给通用计算机、专用计算机或其他可编程数据处理装置的处理器以产生机器,使得经由计算机或其他可编程数据处理装置的处理器执行的指令创建用于实现在流程图和/或框图的或多个框中指定的功能/动作的装置。也可以把这些计算机可读程序指令存储在计算机可读存储介质中,这些指令使得计算机、可编程数据处理装置、和/或其他设备以特定方式工作,从而,其中存储有指令的计算机可读存储介质包括包含实现流程图和/或框图的框中规定的功能/动作的方面的指令的制造品。
也可将计算机可读程序指令加载到计算机、其他可编程数据处理装置、或其他设备上,使得在计算机、其他可编程装置或其他设备上执行一系列操作步骤,以产生计算机实现的处理,使得在计算机、其他可编程装置或其他设备上执行的指令实现流程图和/或框图中的或多个方框中规定的功能/动作。
附图中的流程图和框图示出了根据本发明的各种实施例的***、方法和计算机程序产品的可能实现方式的架构、功能和操作。对此,流程图或框图中的每个框可表示指令的模块、段或部分,其包括用于实现指定的逻辑功能的一个或多个可执行指令。在一些备选实现中,框中标注的功能可以不按照图中标注的顺序发生。例如,取决于所涉及的功能,连续示出的两个框实际上可以基本上同时执行,或者这些框有时可以以相反的顺序执行。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作或执行专用硬件与计算机指令的组合的专用的基于硬件的***来实现。
Claims (9)
1.一种用于监测堆栈使用量的计算机实现方法,该方法包括:
执行截获函数以在堆栈中存储堆栈标记,其中,当程序进入或退出程序的多个函数的每个函数时调用截获函数;
在程序执行期间识别堆栈中的多个堆栈标记并确定每个堆栈标记的内存地址,以获取多个内存地址;
分析所述多个内存地址以识别与最大堆栈深度相关联的特定内存地址;和
基于最大堆栈深度确定程序的堆栈使用量。
2.根据权利要求1所述的计算机实现方法,还包括:
将特定函数的堆栈标记的第一内存地址与与特定函数的调用方函数相关联的第二堆栈标记的第二内存地址进行比较,以确定特定函数的每函数堆栈使用量。
3.根据权利要求2所述的计算机实现方法,还包括:
确定所述多个函数中每个函数的每函数堆栈使用量。
4.根据权利要求1所述的计算机实现方法,其中,调用截获函数使截获函数获取以下的一个或多个:函数名、线程标识符和进程标识符。
5.根据权利要求1所述的计算机实现方法,还包括:
生成与程序对应的优化程序,其中,基于所确定的程序堆栈使用量向优化程序分配堆栈内存。
6.根据权利要求1所述的计算机实现的方法,其中,调用截获函数导致获取程序的堆栈跟踪和相应的测试用例号。
7.根据权利要求6所述的计算机实现的方法,其中,获取了程序的多个堆栈跟踪和相应的测试用例号,其中,将多个堆栈跟踪和相应的测试用例号与与错误相关联的堆栈跟踪进行比较,以识别与错误对应的测试用例。
8.一种用于监测堆栈使用量的计算机***,该计算机***包括:
一个或多个计算机处理器;
一个或多个计算机可读存储介质;
存储在一个或多个计算机可读存储介质上以供一个或多个计算机处理器中的至少一个执行的程序指令,所述程序指令包括配置用于执行根据权利要求1至7中任何一项所述的方法的指令。
9.一种用于确定堆栈使用量的计算机程序产品,该计算机程序产品具有包含在其中的程序指令,所述程序指令可由计算机执行,以使计算机执行根据权利要求1至7中任何一项所述的方法。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US17/397261 | 2021-08-09 | ||
US17/397,261 US11720471B2 (en) | 2021-08-09 | 2021-08-09 | Monitoring stack memory usage to optimize programs |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115705250A true CN115705250A (zh) | 2023-02-17 |
Family
ID=85153026
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210902064.5A Pending CN115705250A (zh) | 2021-08-09 | 2022-07-28 | 监测堆栈使用量以优化程序 |
Country Status (3)
Country | Link |
---|---|
US (1) | US11720471B2 (zh) |
JP (1) | JP2023024966A (zh) |
CN (1) | CN115705250A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN118034705A (zh) * | 2024-03-19 | 2024-05-14 | 北京壁仞科技开发有限公司 | 编译方法、编译***、电子设备、介质、程序产品 |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116506340A (zh) * | 2023-06-27 | 2023-07-28 | 云账户技术(天津)有限公司 | 流量链路的测试方法、装置、电子设备及存储介质 |
Family Cites Families (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5928369A (en) | 1996-06-28 | 1999-07-27 | Synopsys, Inc. | Automatic support system and method based on user submitted stack trace |
US7519867B2 (en) * | 2004-12-21 | 2009-04-14 | National Instruments Corporation | Test executive which provides heap validity checking and memory leak detection for user code modules |
US9519571B2 (en) | 2007-07-13 | 2016-12-13 | International Business Machines Corporation | Method for analyzing transaction traces to enable process testing |
CN101661425B (zh) | 2008-08-26 | 2012-03-21 | 国际商业机器公司 | 测试覆盖分析方法和装置 |
US9189363B2 (en) * | 2010-10-07 | 2015-11-17 | Mcafee, Inc. | System, method, and computer program product for monitoring an execution flow of a function |
FR2994290B1 (fr) * | 2012-08-06 | 2018-04-06 | Rambus Inc. | Systeme de detection de modification d'une pile d'appel de sous-programme |
US9471237B1 (en) * | 2015-02-04 | 2016-10-18 | Amazon Technologies, Inc. | Memory consumption tracking |
US10534643B2 (en) * | 2016-05-09 | 2020-01-14 | Oracle International Corporation | Correlation of thread intensity and heap usage to identify heap-hoarding stack traces |
FR3068149B1 (fr) * | 2017-06-26 | 2019-11-22 | Continental Automotive France | Procede de surveillance de l’espace libre d’une pile memoire |
US10552296B2 (en) * | 2017-10-20 | 2020-02-04 | Google Llc | Human-readable, language-independent stack trace summary generation |
JP2019180200A (ja) * | 2018-03-30 | 2019-10-17 | 日本電産株式会社 | モータ及び送風装置 |
US10761965B2 (en) | 2018-09-28 | 2020-09-01 | Atlassian Pty Ltd. | Detecting method calls based on stack trace data |
US11256603B2 (en) * | 2019-10-14 | 2022-02-22 | Microsoft Technology Licensing, Llc | Generating and attributing unique identifiers representing performance issues within a call stack |
US20220291962A1 (en) * | 2021-03-10 | 2022-09-15 | Texas Instruments Incorporated | Stack memory allocation control based on monitored activities |
US11422880B1 (en) * | 2021-04-30 | 2022-08-23 | Intuit Inc. | Methods and systems for determining crash similarity based on stack traces and user action sequence information |
-
2021
- 2021-08-09 US US17/397,261 patent/US11720471B2/en active Active
-
2022
- 2022-07-28 CN CN202210902064.5A patent/CN115705250A/zh active Pending
- 2022-08-09 JP JP2022126811A patent/JP2023024966A/ja active Pending
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN118034705A (zh) * | 2024-03-19 | 2024-05-14 | 北京壁仞科技开发有限公司 | 编译方法、编译***、电子设备、介质、程序产品 |
Also Published As
Publication number | Publication date |
---|---|
US20230044935A1 (en) | 2023-02-09 |
US11720471B2 (en) | 2023-08-08 |
JP2023024966A (ja) | 2023-02-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8516444B2 (en) | Debugging a high performance computing program | |
WO2018072493A1 (zh) | 编译方法和编译*** | |
US20240045850A1 (en) | Systems and methods for database orientation transformation | |
CN109564540B (zh) | 用于jit编译器的调试的***、方法和设备 | |
US11675575B2 (en) | Checking source code validity at time of code update | |
US20080313208A1 (en) | Apparatus, system, and method for automated context-sensitive message organization | |
Kirbas et al. | The relationship between evolutionary coupling and defects in large industrial software | |
US9588872B2 (en) | Discovery of code paths | |
CN115705250A (zh) | 监测堆栈使用量以优化程序 | |
US11580228B2 (en) | Coverage of web application analysis | |
JP2020119348A (ja) | 解析プログラム、解析方法および解析装置 | |
US11755458B2 (en) | Automatic software behavior identification using execution record | |
US8819626B2 (en) | Sharable development environment bookmarks for functional/data flow | |
US11182272B2 (en) | Application state monitoring | |
CN116578282A (zh) | 代码生成方法、装置、电子设备及介质 | |
US11947966B2 (en) | Identifying computer instructions enclosed by macros and conflicting macros at build time | |
Kozak et al. | Three-module framework for automated software testing | |
CN114047923A (zh) | 错误代码定位方法、装置、存储介质以及电子设备 | |
CN113220586A (zh) | 一种自动化的接口压力测试执行方法、装置和*** | |
Andrzejak et al. | Confguru-A system for fully automated debugging of configuration errors | |
CN113760307A (zh) | 获取应用代码的差异化覆盖率的方法和装置 | |
Islam et al. | PyMigBench and PyMigTax: A benchmark and taxonomy for Python library migration | |
US11106522B1 (en) | Process memory resurrection: running code in-process after death | |
US20240103853A1 (en) | Code maintenance system | |
Troost | A testing tool visualizing and ensuring data-flow coverage |
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 |