CN103034484A - 本机堆分配的运行时类型标识 - Google Patents

本机堆分配的运行时类型标识 Download PDF

Info

Publication number
CN103034484A
CN103034484A CN2012103808656A CN201210380865A CN103034484A CN 103034484 A CN103034484 A CN 103034484A CN 2012103808656 A CN2012103808656 A CN 2012103808656A CN 201210380865 A CN201210380865 A CN 201210380865A CN 103034484 A CN103034484 A CN 103034484A
Authority
CN
China
Prior art keywords
storer
instruction
address
type
user type
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.)
Granted
Application number
CN2012103808656A
Other languages
English (en)
Other versions
CN103034484B (zh
Inventor
C·施米希
A·R·鲁滨逊
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.)
Microsoft Technology Licensing LLC
Original Assignee
Microsoft Corp
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 Microsoft Corp filed Critical Microsoft Corp
Publication of CN103034484A publication Critical patent/CN103034484A/zh
Application granted granted Critical
Publication of CN103034484B publication Critical patent/CN103034484B/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/30Monitoring
    • G06F11/34Recording 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/3466Performance evaluation by tracing or monitoring
    • G06F11/3471Address tracing
    • 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/3636Software debugging by tracing the execution of the program
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3664Environments for testing or debugging software
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2201/00Indexing scheme relating to error detection, to error correction, and to monitoring
    • G06F2201/865Monitoring of software

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明涉及本机堆分配的运行时类型标识。在编译期间,创建了将本机语言程序的存储器分配指令的相对虚拟地址映射到实例的用户类型的表。在程序的执行期间,被插入到进程中的模块截取对存储器分配函数的调用并记录调用存储器分配函数的指令的虚拟地址和所创建的实例的虚拟地址。当请求进程堆的快照时,对应编译时指令的用户类型被分配给所创建的实例。用户类型和堆信息可被用于计算存储器分配的大小并聚集用户类型实例的计数和大小。使用静态调试信息,可计算和显示引用图,该引用图显示活实例中的对象的嵌套。

Description

本机堆分配的运行时类型标识
技术领域
本发明涉及存储器管理技术,更具体地,涉及本机堆分配的运行时类型标识。
背景技术
存储器管理包括根据请求将存储器的各部分分配给各程序,以及当程序不再需要所分配的存储器时释放该存储器以供重新使用。对存储器的低效或不正确的使用会降低程序性能或导致程序崩溃。类似的,无法释放已分配的存储器或不正确地释放存储器会降低程序性能或导致程序崩溃。
术语“垃圾回收”常被用来表示一种自动存储器管理形式,其中垃圾回收器重新声明不再是使用中的存储器。垃圾回收是一种被频繁用于虚拟机环境中的技术。与之相比,手动存储器管理依赖于在程序中使用用于请求操作系统分配存储器和取消分配未被使用的存储器的指令。普遍使用的用于手动地管理存储器的语言包括本机语言,诸如C和C++。
手动存储器管理会将几个常见类的错误引入程序中。例如,如果当程序使用完所分配的存储器部分时其没有被释放,则会发生存储器泄露。存储器泄露可以是相对无害的(例如,在短时运行的程序中,其中程序结束时操作系统取消分配程序资源),或者如果存储器泄露用尽了可用存储器则会导致程序崩溃。即使存储器泄露没有用尽可用存储器并且没有导致程序崩溃,程序性能会被降低,因为例如缺少足够的可用存储器使数据被强制交换出到磁盘。当分配的空间被释放不止一次时或者如果释放了指向未分配存储器的指针,会发生另一种类型的存储器管理错误。这类错误会损坏数据结构或者会不正确地释放后来已由另一程序构造使用的部分存储器。如果在存储器被释放后使用了指向被释放的存储器的指针,则接着会发生无法预料的结果。当程序中的指令分配过多存储器使得没有剩余足够的存储器以供程序高效运行时,会发生存储器过度使用。
发明内容
可请求执行中的本机程序的快照并且可提供对快照请求时所分配的用户类型的存储器分配统计。通过使用静态调试信息和动态运行时分配信息,活(live)存储器堆分配可使用用户类型信息来增强。用户类型和堆信息可被用于计算存储器分配的大小并聚集用户类型实例的计数和大小。使用静态调试信息,可计算和显示引用图,该引用图显示活实例中的对象的嵌套。可提供源文件的名称以及调用存储器分配函数的指令的行号。
提供发明内容述以便以简化形式介绍将在以下详细描述中进一步描述的一些概念。本发明内容并不旨在标识所要求保护主题的关键特征或必要特征,也不旨在用于限制所要求保护主题的范围。
附图说明
在附图中:
图1a示出了根据此处所公开的主题的各方面的捕捉相对虚拟地址(RVA)至类型信息的系统100的示例;
图1b示出了根据此处所公开的主题的各方面的将RVA映射成类型的表110的示例;
图1c示出了根据此处所公开的主题的各方面的捕捉运行时存储器分配信息的系统101的示例;
图1d示出了根据此处所公开的主题的各方面的将分配的实例的地址映射成调用存储器分配函数的指令的虚拟地址的表134的示例;
图1e示出了根据此处所公开的主题的各方面的潜在的实例参考信息的表140的示例,其中潜在的实例参考中的一些已被标识为非指针;
图1f示出了根据此处所公开的主题的各方面的包括类型信息的潜在的实例参考信息的表176的示例;
图2a示出了根据此处所公开的主题的各方面的计算目标进程的存储器分配统计的的方法200的示例;
图2b示出了根据此处所公开的主题的各方面的目标进程的经计算出的存储器分配统计的的显示230的示例;
图3是根据本文所公开主题的各方面的计算环境的示例的框图;以及
图4是根据此处所公开的主题的各方面的集成开发环境的示例的框图。
具体实施方式
概览
用于用本机代码编写的程序的已知工具可提供诸如“在点A处,进程B已分配了起始于地址D的C个字节的存储器”之类的信息。然而,已知工具不能够提供与所分配的存储器块相关联的用户类型信息。即,已知工具不能提供诸如“在点A处,进程B已为用户类型为F的对象的E个实例分配了起始于地址D1、…Dn的C个字节的存储器”之类的信息。根据此处所描述的主题的各方面,提供了可将用户类型信息与存储器中特定位置处分配的存储器块相关联的工具。信息可被聚集和概括,并被提供在显示中。所提供的信息可帮助用户确定多少存储器被分配给哪些用户类型。这进而可帮助用户诊断存储器过度使用以及本机源代码中的其它存储器分配模式。
想要用户类型存储器分配统计的本机源程序可被编译以生成二进制文件(例如,可执行文件或动态链接库)。根据此处所描述的主题的各方面,其执行导致分配存储器的二级制文件中的指令的相对虚拟地址(RVA)可被映射到该RVA处的指令所分配的实例的类型或与该类型相关联。当执行该二级制文件时,截取对存储器分配的请求的程序模块可被插入到二进制文件正执行于的目标进程中。所插入的程序模块可截取对发生在目标进程内的已知存储器分配函数的调用。当程序运行及分配发生时,可记录调用存储器分配函数的指令的虚拟地址(在此称为调用点)。新创建的实例的虚拟存储器地址也可被记录并被映射到调用了存储器分配函数的指令的虚拟地址或与该虚拟地址相关联。
响应于接收到对堆快照的请求,可通过走查与进程相关联的一个或多个堆来标识目前为止在该进程中所作出的所有存储器分配。调用存储器分配函数的每个指令的虚拟地址可以被转换成RVA。这一RVA可以被匹配于之前创建的(例如,在编译期间)RVA/类型表中对应的RVA,以确定在二级制文件的执行期间所分配的实例的用户类型。与所分配的实例的虚拟存储器地址相关联的实例的类型可通过将调用点(曾调用存储器分配函数的指令的虚拟地址)转换成其执行导致分配存储器的二级制文件中的指令的RVA来确定。为了将调用点转换成RVA,进程存储器中加载二级制文件所位于的基地址可从调用点减去。与前一步骤(例如编译步骤)中的匹配RVA相关联的用户类型可被分配给调用点。特定用户类型的信息可被聚集、概括并显示。所显示的信息可包括类型、所分配的实例的总数以及特定类型的实例的经聚集的大小、以及该类型的定义的位置。所显示的信息可还包括一种类型的每个实例的分解、实例的大小、创建该实例的模块、该实例的分配点、以及源文件的名称以及分配该实例的指令的行号。
可提供描述引用关系的引用图。引用图信息可通过扫描进程堆以查找潜在的指针来获取,其中扫描通过查找并记录所有的指针大小的字段来进行。可通过使用用来确定每个潜在指针的类型的静态调试信息并且删除非指针类型来删除被记录的非指针字段。即,根据此处所描述的主题的各方面,响应于接收对快照的请求,进程堆可被扫描以查找潜在的指针的实例。任何具有指针大小的长度的虚拟地址可被记录。可以理解的是不是所有指针大小的实体都有可能是真正的指针。提供对象布局的符号调试信息可被用于移除不是指针的被记录的指针大小的偏移。例如,假设程序包括对象Foo,其包括另一对象Bar。从编译中产生的调试文件中获取的对象Foo的布局可因此包括指向对象Bar的指针。显示对象Foo和Bar之间的嵌套关系的引用图可随后被显示。
本机堆分配的运行时类型标识
图1a示出了根据此处所公开的主题的各方面的捕捉RVA至类型匹配信息的系统100的示例。系统100的全部或某些部分可以驻留在诸如下面参考图3所描述的计算机之类的一个或多个计算机上。系统100可在诸如参考图4所描述的软件开发计算机之类的软件开发计算机上执行。系统100或其部分可在诸如IDE 104之类的IDE内执行或者在IDE之外执行。IDE可以是诸如参考图4所描述的IDE之类的IDE,或者可以是支持本机语言的任何其它IDE。系统100的全部或部分可被实现为插件或扩展。
系统100可包括诸如计算机102之类的一个或多个计算机或计算设备,其包括:诸如处理器142等之类的一个或多个处理器、诸如存储器144之类的存储器、和/或诸如映射模块116之类的一个或多个模块。系统100可还包括诸如编译器106之类的编译器。编译器106可以是C或C++编译器或其中实现手动存储器分配的任何其他本机编程语言编译器。根据此处所公开的主题的各方面,映射模块11 6可以是编译器106的一部分或者可以是独立的模块(未示出)。映射模块116可收集诸如RVA/类型信息110之类的RVA至类型信息。映射模块116可在源程序114的编译期间将诸如RVA/类型信息110之类的RVA至类型信息收集到动态链接库或诸如可执行文件108之类的可执行文件中。可替换地,映射模块116可在编译进程之外执行。
当编译进行时,可收集诸如调试信息112之类的调试信息。调试信息可包括程序模块中的所有符号的列表。调试信息可包括符号的地址、其中声明了该符号的源文件的名称以及其中声明了该符号的源文件中的行的行号。调试信息可以存储在程序数据库文件中,这是一种由微软公司开发的、用于存储关于程序的、通常具有.pdb扩展名的调试信息的专有文件格式。可替换地,调试信息可以存储在二级制文件本身中。
典型编译器的前端执行语法和语义检查并报告错误。前端可生成源代码的中间表示或IR以供中间端处理。在中间端,可进行优化转换并生成第二IR。后端通常将来自中间端的IR转换成汇编码。在前端编译期间,通常创建抽象语法树(AST)。AST是源代码的抽象语法结构的树形表示,其中树的每个节点表示源代码中的一个构造。根据此处所公开的主题的各方面,后端代码生成器可使用AST来将存储器分配指令的相对虚拟地址(RVA)映射到那些指令所分配的类型。因此,将RVA映射成类型的信息可由编译器在编译期间计算,并且被包括作为程序的调试数据库的一部分(例如,在.PDB文件中或在二进制文件本身中)。当在运行时发生存储器分配时,这一信息允许基于地址的类型查找,如以下更全面描述的。
例如,在以下的C++代码中,创建从编译器生成的汇编指令的RVA到类型Foo的(静态)符号调试信息的映射。
Figure BDA00002231376100051
Figure BDA00002231376100061
通过走查AST并且将RVA到类型的映射写入分开的文件(即,不是写入调试文件),映射信息可与编译分开地出现。可替换地,可进行从源文件和分配存储器的指令的行号到所分配的对象的类型的映射。在稍后的分析阶段之中,二进制文件的指令的运行时存储器位置可被映射至源文件中的指令的行号,该行号可随后与类型信息相关。图1b示出RVA/类型信息110的示例,其中例如0x0F15的RVA 117被映射到类型Foo 119,等等。
还可收集动态运行时信息,该动态运行时信息包括关于进行分配时的存储器分配的位置的信息以及关于进程的存储器堆的信息。图1 c示出了根据此处所公开的主题的各方面的收集动态分配信息以及存储器堆信息的系统101的示例。系统101的全部或某些部分可以驻留在诸如下面参考图3所描述的计算机之类的一个或多个计算机上。系统100可在诸如参考图4所描述的软件开发计算机之类的软件开发计算机上执行。系统100或其部分可在IDE内执行或者可在IDE之外执行。IDE可以是诸如参考图4所描述的IDE之类的IDE,或者可以是支持本机语言的任何其它IDE。系统100的全部或部分可被实现为插件或扩展。
系统101可包括诸如计算机102之类的一个或多个计算机或计算设备,其包括:诸如处理器142等之类的一个或多个处理器、诸如存储器144之类的存储器、以及诸如追踪模块130之类的一个或多个模块。系统101可以是与系统100相同的计算机或者可以是与系统1 00不同的计算机。目标进程可执行想要其存储器分配信息的程序的二进制文件。例如,目标进程120可执行诸如可执行文件108之类的程序模块,系统100为其收集RVA/类型信息110。为了截取并追踪分配,诸如追踪模块130之类的追踪模块可存在于目标进程中。追踪模块130可通过以下手段插入到目标进程中:通过经由仪器添加对追踪模块130的静态依赖性、通过创建强制追踪模块130被加载的远程线程、或通过启动处于暂停状态的进程并且修改导入地址表以包括追踪模块130作为其首次加载时依赖性。一旦被加载,追踪模块1 30可寻找已知的存储器分配方法并且可通过重写函数或通过重定向来截取对已知存储器分配方法的所有调用。进程120还可包括用于诸如一个或多个编程语言模块132之类的本机编程语言。
当用户程序运行时,可由执行中的程序请求存储器分配并且可由操作系统准许存储器分配。这种存储器分配是动态的并且发生在被称为“堆”或者“进程存储器堆”(不与堆数据结构相混淆)的存储器区域。存储器是从被称为堆或空闲存储的未使用存储器区域的池中分配的。由于分配的精确位置预先是未知的,存储器通常经由指针引用来间接访问。诸如对象的实例等之类的分配可被存储在诸如进程存储器堆122之类的进程存储器堆。进程存储器堆122可包括诸如空闲部分126之类的空闲存储器的多个部分以及诸如已使用部分124之类的已使用的存储器的多个部分。可通过数个函数调用来促进分配,函数包括但不限于malloc、operator new、HeapAlloc、GlobalAlloc、CoTaskMemAlloc等等。可检查由追踪模块130所截取到的任何分配函数追踪模块130可将调用转发给分配函数,使得分配仍然进行并且可通过检查函数的返回地址来确定调用分配方法的指令的虚拟地址(VA)。  (调用分配方法的指令的VA在此被称为调用点或调用点地址。)为实例新分配的存储器部分的地址可被映射到发起调用的VA,并且可存储在表中的私有帐户堆128中。图1d示出了将实例地址与调用点地址相互映射的表的示例。例如,在实例地址/调用点表134中,调用在0xa022136处分配实例的存储器分配函数的指令的虚拟地址位于0x2104 138处,以此类推至发生的分配函数所分配的所有实例。诸如私有帐户堆128的私有堆可被用于由追踪模块130所分配的所有存储器,使得由追踪模块所分配的存储器不被包括在被考虑的程序(例如,为其生成可执行文件108的源程序114)的分配统计中。
当程序执行时,可响应于用户手势来请求堆快照,或者可响应于检测到诊断事件(例如,当遇到调试断点)来自动启动堆快照。当摄取堆的快照时,标识存储器的各部分的活实例(即存储器的已分配并且还未被释放的部分)以及与分配的存储器部分相关联的类型和对该存储器部分的引用。为了标识活实例,根据此处所公开的主题的一些方面,访问进程堆和走查进程堆的应用程序接口(API)可被用于确定当前被分配在进程的堆上的存储器部分。然后,实例地址-到-调用点的映射表(例如,图1d中的实例地址/调用点表134)可被用于将活实例映射到调用分配该实例的存储器分配函数的指令的虚拟地址。接着,调用点VA可通过使用指定二进制文件的基本加载地址的模块加载信息被转换成RVA。RVA可通过从VA减去二进制文件的基本加载地址来确定。最后,使用在编译时创建的静态调试信息和调用点RVA,分配的实例可被映射到其底层的类型。
实例引用图还可在堆快照处理期间被计算。当走查进程的堆时,可检查每个实例。由于实例类型是未知的,所有潜在的对活存储器的引用可被记录。任何指针大小的字段是一种潜在的引用并且可被记录。图1e示出了在引用图的信息收集的第一阶段中收集的信息的示例。图1e示出了类型Foo 168的表140,其包括具有从Foo对象的起始开始的偏移0 154的字段的位置0x2404 148、具有偏移4 156的字段的位置0x3022 150以及具有偏移8 158的字段的位置0x0001 152。表140中所记录的每个字段都是指针大小的,但是因为该字段的类型信息此时不可用,因此每个字段的类型是未知的,用问号146来表示。位置0x2404 148是具有起始地址0x2424 160的Bar对象的第一实例的位置。因此,偏移0 154是有效位置,因此开始于偏移0的字段是潜在的指针。位置0x3022150也是一个有效位置,即具有地址0x3022 162的Bar对象的第二实例的位置,因此开始于偏移4 156的字段是潜在指针。位置0x0001 152不是有效位置,因为它在Bar对象的范围164之外,因此开始于偏移8 158的字段不是引用并且可被丢弃。
类型Foo 168的每个字段的类型信息可根据编译期间收集的调试信息来确定。当实例的类型已知时,符号调试信息可被用于确定类型的布局以及其包含的字段的类型。潜在的引用图可通过移除类型中不是指针字段的任何所记录的指针大小的字段来删除。例如,类型可包含存储指针状的值(即字段具有要成为指针的正确长度并且指向存储器中的有效地址)的整数字段(例如,用于起始于偏移4 156的字段的int16 170,以及用于起始于偏移8 158的字段的int16172)。在确定实例的用户类型以及确定字段类型(整数)之后,具有非指针类型的潜在的引用可被移除或切除,因为那些潜在的引用实际上不是对其它实例的引用。图1f示出之前的表140的示例,其中增加了类型Foo 168的字段的类型信息,并被显示在表176中。起始于偏移0 154的字段的类型是指向对象Bar 169的指针。起始于偏移4 156的字段的类型是int16 170并且其不是指针,因此这一字段不是引用166。起始于偏移8 158的字段的类型是int16 172并且其不是指针,因此这一字段不是引用174。因此,表176中的第二和第三条目可被移除。
最后,可基于包括但不限于类型、模块、源文件、名字空间或类名的某些方面来概括并聚集以上信息。可为活实例计算并显示统计,包括但不限于实例计数、聚集类型大小、以及引用计数。引用图可被显示为树。循环引用可被缩短。
图2a示出了根据此处所公开的主题的各方面的计算并显示目标进程的存储器分配的统计的的方法200的示例。图2中所述的方法可由诸如但不限于图1a和/或图1c中所述的系统来实践。尽管方法200描述了顺序执行的一系列动作,但能够理解,该方法200不受该顺序的次序的限制。例如,一些动作能以与所描述的不同的次序发生。另外,一个动作可以与另一动作并发发生。在一些实例中,不是所有的动作都要被执行。
在第一阶段,在202,二进制文件中请求存储器分配的指令的RVA可被映射到该指令所分配的类型。可为二进制文件中分配存储器的每个指令重复202。从RVA到类型的映射可在源程序的编译期间执行。编译器的后端代码生成器可使用源程序的AST来将RVA映射到类型,并且映射信息可被存储在调试文件中。可替换的,AST可被走查,并且类型信息可被分开存储。在第二阶段,在204,二进制文件可在其中插入了追踪模块的进程中执行。在206,当目标进程在运行时,追踪模块可截取在该进程中执行的已知的存储器分配函数。在208,分配的调用点的地址可被记录在进程存储器堆中。存储实例的存储器位置也可被记录。截取(206)和记录(208)可继续,直到在210接收对进程堆的快照的请求。响应于接收到对快照的请求,在212,可标识进程堆中的所有存储器分配。在214,可通过扫描并记录分配内的指针大小的偏移来标识潜在的实例引用。在216,存储在进程堆中的分配地址可被转换成RVA。在218,202处的RVA-到-类型的映射可被用来解析分配类型。在220,来自阶段一的符号调试信息可被用于移除非指针类型的指针状字段以如以上更全面地描述的确定真正的引用。在222,所聚集的统计和引用图可被显示在显示设备上。
图2b示出根据在此所公开的主题的各方面的存储器分配显示230的示例。存储器分配显示可从类型、模块、源文件、名字空间或类名的角度提供存储器分配信息,并且可包含信息,包括但不限于类型、实例的数量、类型的总大小、模块的总大小、源文件的总大小、名字空间的总大小或类的总大小、定义位置、源、实例大小、模块名称、分配大小以及引用及被引用信息。存储器分配显示可包括一个或多个信息窗格。一个信息窗格的示例——信息窗格1 240可显示存储器分配统计,包括但不限于类型232、实例计数234、该类型的全部实例的聚集大小235、以及该类型被定义的位置233。诸如信息窗格2 242之类的另一信息窗格可包括但不限于实例标识符号250、实例大小251、模块252、分配大小253、以及源254。诸如信息窗格3 244之类的另一信息窗格包括被引用信息(例如,sym.cpp 255被SYMITERPRIVATE 256所引用,SYMITERPRIVATE256被SYMTBL 257所引用,等等),并且可包括被引用的实体(例如,无258)。图2b的信息窗格240从类型232的视角提供了存储器分配信息。例如,在信息窗格240中,类型SYM 236的实例234的数量是3 238。类型SYM 236的3个实例的总大小是8.69MB 246。
合适的计算环境的示例
为了提供有关本文所公开主题的各方面的上下文,图3以及以下讨论旨在提供其中可以实现本文所公开主题的各实施例的合适计算环境510的简要概括描述。尽管本文所公开的主题是在诸如程序模块等由一个或多个计算机或其它计算设备执行的计算机可执行指令的通用上下文中描述的,但本领域技术人员将认识到,本文所公开的主题的各部分还能够结合其它程序模块和/或硬件和软件的组合来实现。通常,程序模块包括执行特定任务或实现特定数据类型的例程、程序、对象、物理人为产物、数据结构等。通常,程序模块的功能可在各个实施例中按需进行组合或分布。计算环境510只是合适的操作环境的一个示例,并且不旨在对此处所公开的主题的使用范围或功能提出任何限制。
参考图3,描述了计算机512形式的计算设备。计算机512可包括至少一个处理单元514、系统存储器516和系统总线518。至少一个处理单元514可执行被存储在诸如但不限于系统存储器516之类的存储器中的指令。处理单元514可以是各种可用处理器中的任何一种。例如,处理单元514可以是GPU。这些指令可以是用于实现被描述为由上述一个或多个组件或模块所执行的功能的指令或用于实现上述方法中的一个或多个的指令。也可以使用双微处理器及其他多处理器体系结构作为处理单元514。计算机512可被用于支持在显示屏上呈现图形的系统中。在另一示例中,计算设备512的至少一部分可以用在包括图形处理单元的系统中。系统存储器516可包括易失性存储器520和非易失性存储器522。非易失性存储器522可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)或闪存。易失性存储器520可包括可充当外高速缓冲存储器的随机存取存储器(RAM)。系统总线518将包括系统存储器516的系统物理人为产物耦合到处理单元514。系统总线518可以是几种类型的总线结构中的任何一种,包括存储器总线、存储控制器、外围总线、外总线或局部总线,并且可以使用各种可用总线体系结构中的任一种。计算机512可包括处理单元514可通过系统总线518访问的数据存储。数据存储可包括用于图形呈现的可执行指令、3D模型、素材、材质等。
计算机512通常包括各种计算机可读介质,诸如易失性和非易失性介质、可移动和不可移动介质。计算机存储介质可以通过用于存储诸如计算机可读指令、数据结构、程序模块或其它数据等信息的任何方法或技术来实现。计算机存储介质包括但不限于,RAM、ROM、EEPROM、闪存或其它存储器技术、CDROM、数字多功能盘(DVD)或其它光盘存储、磁盒、磁带、磁盘存储或其它磁存储设备、或可以用来储存所期望的信息并可由计算机512访问的任何其他瞬态或非瞬态介质。
将理解,图3描述了可充当用户与计算机资源之间的媒介的软件。该软件可以包括可存储在盘存储524上的操作系统528,该操作系统可分配计算机512的资源。盘存储524可以是通过诸如接口526的不可移动存储器接口连接到系统总线518的硬盘驱动器。系统应用530利用由操作系统528通过存储在系统存储器516或者存储在盘存储524上的程序模块532和程序数据534对资源的管理。可以理解,计算机可用各种操作系统或操作系统的组合来实现。
用户可通过输入设备536向计算机512输入命令或信息。输入设备536包括但不限于定点设备,诸如鼠标、跟踪球、指示笔、触摸垫、键盘、话筒等。这些及其他输入设备通过系统总线518经由接口端口538连接到处理单元514。接口端口538可表示串行端口、并行端口、通用串行总线(USB)等。输出设备540可与输入设备使用相同类型的端口。提供输出适配器542以举例说明存在像监视器、扬声器、以及打印机的需要特定适配器的一些输出设备540。输出适配器542包括但不限于,在输出设备540和系统总线518之间提供连接的视频卡和声卡。其他设备和/或系统和/或设备,诸如远程计算机544,可提供输入和输出两种能力。
计算机512可以使用到诸如远程计算机544之类的一个或多个远程计算机的逻辑连接来在联网环境中操作。远程计算机544可以是个人计算机、服务器、路由器、网络PC、对等设备或其它常见的网络节点,并且通常包括许多或所有以上相对于计算机512所描述的元件,尽管在图3中仅示出了存储器存储设备546。远程计算机544可经由通信连接550逻辑地连接。网络接口548涵盖诸如局域网(LAN)和广域网(WAN)这样的通信网络,但也可包括其他网络。通信连接550是指用来将网络接口548连接到总线518的硬件/软件。通信连接550可以在计算机512内或外并且包括诸如调制解调器(电话、电缆、DSL和无线)和ISDN适配器、以太网卡等内和外技术。
可以理解,所示网络连接仅是示例,并且可以使用在计算机之间建立通信链路的其它手段。本领域的普通技术人员可以理解,计算机512或其它客户机设备可作为计算机网络的一部分来部署。在这一点上,本文所公开的主题涉及具有任意数量的存储器或存储单元以及在任意数量的存储单元或卷上发生的任意数量的应用和进程的任何计算机系统。本文所公开的主题的各方面可应用于具有部署在网络环境中的具有远程或本地存储的服务器计算机和客户计算机的环境。本文所公开的主题的各方面也可应用于具有编程语言功能、解释和执行能力的独立计算设备。
图4示出集成开发环境(IDE)600和通用语言运行时环境602。IDE 600可允许用户(例如,开发者、程序员、设计者、编码者等)在计算机系统中设计、编码、编译、测试、运行、编辑、调试或构建程序、程序集、网站、web应用和web服务。软件程序可包括以一种或多种源代码语言(例如,VisualBasic、Visual J#、C++、C#、J#、Java Script、APL、COBOL、Pascal、Eiffel、Haskell、ML、Oberon、Perl、Python、Scheme、Smalltalk等)创建的源代码(组件610)。IDE 600可提供本机代码开发环境,或者可提供在虚拟机上运行的托管代码开发,或者可提供其组合。IDE 600可提供使用.NET框架的托管代码开发环境。可使用语言专用源编译器620从源代码组件610和本机代码组件611创建中间语言组件650,并且在执行应用时使用中间语言编译器660(例如,即时(JIT)编译器)从中间语言组件650创建本机代码组件611(例如,机器可执行指令)。即,当IL应用被执行时,其在被执行的同时被编译成适合正在其上执行它的平台的合适机器语言,藉此使代码能跨若干平台便携。替代地,在其他实施例中,程序可被编译成适合其目标平台的本机代码机器语言(未示出)。
用户可根据已知软件编程技术以及与特定源语言相关联的特定逻辑和句法规则经由IDE 600中的用户接口640和源代码编辑器651来创建和/或编辑源代码组件。此后,源代码组件610可经由源编译器620被编译,藉此可创建该程序的中间语言表示,诸如汇编630。汇编630可包括中间语言组件650和元数据642。
应用设计可以能够在部署前被验证。
本文所述的各种技术可结合硬件或软件,或在适当时以其组合来实现。由此,本文所公开的方法和装置或其特定方面或部分可采取包含在诸如软盘、CD-ROM、硬盘驱动器或任何其它机器可读存储介质等有形介质中的程序代码(即,指令)的形式,其中当程序代码被加载到诸如计算机等机器内并由其执行时,该机器成为用于实现本文所公开的主题的各方面的装置。如此出所用的,术语“机器可读介质”应被用来排除提供(即存储和/或传输)任何形式的传播信号的任何机制。在程序代码在可编程计算机上执行的情况下,计算设备通常将包括处理器、该处理器可读的存储介质(包括易失性和非易失性的存储器和/或存储元件)、至少一个输入设备、以及至少一个输出设备。可例如通过使用数据处理API等来利用域专用编程模型各方面的创建和/或实现的一个或多个程序可用高级过程语言或面向对象的编程语言来实现以与计算机系统通信。然而,如果需要,该程序可以用汇编语言或机器语言来实现。在任何情形中,语言可以是编译语言或解释语言,且与硬件实现相结合。
尽管用结构特征和/或方法动作专用的语言描述了本主题,但可以理解,所附权利要求书中定义的主题不必限于上述具体特征或动作。更确切而言,上述具体特征和动作是作为实现权利要求的示例形式公开的。

Claims (10)

1.一种系统,包括:
计算设备的至少一个处理器;
所述计算设备的存储器;以及
加载到所述存储器中的至少一个模块,所述模块使所述至少一个处理器:
响应于接收对堆快照的请求,通过以下步骤提供本机语言程序的存储器分配统计:
接收将所述本机语言程序的二进制文件中的指令的相对虚拟地址映射到用户类型的信息,所述指令在被执行时请求存储器分配;
将进程中执行的指令的虚拟存储器地址映射到所述指令所请求的存储器分配的实例的地址;
将所述指令的虚拟存储器地址匹配于所述指令的对应的相对虚拟地址;
将被映射到对应的相对虚拟地址的用户类型分配给所述指令的虚拟存储器地址;以及
聚集用户类型实例计数和大小。
2.如权利要求1所述的系统,其特征在于,还包括:
加载到所述存储器中的至少一个模块,所述模块使所述至少一个处理器:
通过以下步骤显示引用图:
扫描所述进程的进程堆以查找指针大小的字段的实例;
移除非指针的指针大小的字段;以及
显示所述引用图中的存储器分配实例之间的关系。
3.如权利要求1所述的系统,其特征在于,还包括:
加载到所述存储器中的至少一个模块,所述模块使所述至少一个处理器:
在编译期间将所述本机语言程序的二进制文件中的指令的相对虚拟地址映射到所述用户类型。
4.如权利要求2所述的系统,其特征在于,在编译期间生成的符号调试信息提供实例的布局,其中所述布局被用于移除被记录的指针大小的、但不是指针的字段。
5.如权利要求2所述的系统,其特征在于,用户类型和进程堆信息被用于计算存储器分配的大小并聚集用户类型实例计数和大小。
6.一种方法,包括:
将本机语言程序的指令的相对虚拟地址映射到用户类型,所述指令调用存储器分配函数;
将追踪模块插入目标进程,所述目标进程在计算设备的处理器上执行所述指令;
截取对所述存储器分配函数的调用并记录所述存储器分配函数的返回地址;
记录由所述存储器分配函数在存储器中分配的实例的地址;
将所述返回地址转换成对应的相对虚拟地址;
将所记录的返回地址分配给所述用户类型;以及
提供聚集的存储器分配的大小以及用户类型实例计数和大小。
7.如权利要求6所述的方法,其特征在于,还包括:
通过以下步骤显示引用图:
扫描所述实例的进程堆以查找指针大小的字段的实例;
移除非指针的指针大小的字段;以及
显示所述引用图中的实例之间的关系。
8.如权利要求6所述的方法,其特征在于,通过走查抽象语法树以及将相对虚拟地址/用户类型映射信息写入与编译期间生成的静态调试文件分开的文件中,所述指令的相对虚拟地址到用户类型的映射与编译分开地进行。
9.如权利要求6所述的方法,其特征在于,存储器分配和用户类型实例计数和大小按照类型、模块、源文件、名字空间或类名来提供。
10.一种包括当执行时使计算设备的至少一个处理器执行下列操作的计算机可执行指令的计算机可读存储介质:
接收静态调试信息,所述静态调试信息包括将本机程序的二进制文件的指令的相对虚拟地址映射到与所述指令相关联的用户类型的表,所述指令在执行时请求存储器分配;
在进程中执行所述本机程序;
将所述进程的进程堆中的指令的虚拟存储器地址映射到所述存储器分配的实例的地址;
将所述指令的虚拟存储器地址匹配于所述指令的对应的相对虚拟地址;
将被映射到对应的相对虚拟地址的用户类型分配给所述指令的虚拟地址;
响应于接收对进程堆快照的请求,通过以下步骤创建引用图:
扫描进程堆以查找指针大小的字段的实例;
移除非指针的指针大小的字段;以及
显示所述引用图,聚集用户类型实例计数和大小。
CN201210380865.6A 2011-10-10 2012-10-09 本机堆分配的运行时类型标识 Active CN103034484B (zh)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US13/269,626 US8566559B2 (en) 2011-10-10 2011-10-10 Runtime type identification of native heap allocations
US13/269,626 2011-10-10

Publications (2)

Publication Number Publication Date
CN103034484A true CN103034484A (zh) 2013-04-10
CN103034484B CN103034484B (zh) 2016-01-20

Family

ID=48021410

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201210380865.6A Active CN103034484B (zh) 2011-10-10 2012-10-09 本机堆分配的运行时类型标识

Country Status (4)

Country Link
US (1) US8566559B2 (zh)
EP (1) EP2766807A4 (zh)
CN (1) CN103034484B (zh)
WO (1) WO2013055635A1 (zh)

Cited By (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109344045A (zh) * 2018-07-27 2019-02-15 阿里巴巴集团控股有限公司 业务系统切换方法、装置、电子设备及存储介质
CN110383247A (zh) * 2017-04-28 2019-10-25 伊纽迈茨有限公司 由计算机执行的方法、计算机可读介质与异构计算系统
CN111309449A (zh) * 2020-03-17 2020-06-19 上海蓝载信息科技有限公司 面向元编程、交互式编程和区块链互操作的与编程语言无关的虚拟机
CN111552539A (zh) * 2014-07-14 2020-08-18 甲骨文国际公司 变量句柄
CN112789602A (zh) * 2018-10-01 2021-05-11 微软技术许可有限责任公司 软件故障的反向调试
CN113805971A (zh) * 2021-09-23 2021-12-17 武汉深之度科技有限公司 一种应用程序运行方法、计算设备及存储介质
CN113821272A (zh) * 2021-09-23 2021-12-21 武汉深之度科技有限公司 一种应用程序运行方法、计算设备及存储介质

Families Citing this family (21)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20140047423A1 (en) * 2012-08-09 2014-02-13 Filip J. Pizlo Runtime State Based Code Re-Optimization
US9292422B2 (en) 2012-10-12 2016-03-22 Vmware, Inc. Scheduled software item testing
US10387294B2 (en) 2012-10-12 2019-08-20 Vmware, Inc. Altering a test
US8839202B2 (en) * 2012-10-12 2014-09-16 Vmware, Inc. Test environment managed within tests
US8949794B2 (en) 2012-10-12 2015-02-03 Vmware, Inc. Binding a software item to a plain english control name
US9069902B2 (en) 2012-10-12 2015-06-30 Vmware, Inc. Software test automation
US8839201B2 (en) 2012-10-12 2014-09-16 Vmware, Inc. Capturing test data associated with error conditions in software item testing
US9292416B2 (en) 2012-10-12 2016-03-22 Vmware, Inc. Software development kit testing
US9684587B2 (en) 2012-10-12 2017-06-20 Vmware, Inc. Test creation with execution
US10067858B2 (en) 2012-10-12 2018-09-04 Vmware, Inc. Cloud-based software testing
US9569234B2 (en) * 2014-10-27 2017-02-14 Qualcomm Innovation Center, Inc. Dynamic bit-width modification of internal pointers of a virtual machine
US20160323160A1 (en) * 2015-04-29 2016-11-03 AppDynamics, Inc. Detection of node.js memory leaks
US9852046B1 (en) * 2015-05-07 2017-12-26 Cadence Design Systems, Inc. Method and system for automated debugging memory allocation and memory release
US9858059B2 (en) 2015-09-14 2018-01-02 International Business Machines Corporation System module deployment optimization
US11003428B2 (en) 2016-05-25 2021-05-11 Microsoft Technolgy Licensing, Llc. Sample driven profile guided optimization with precise correlation
US10635578B1 (en) * 2017-11-10 2020-04-28 Amdocs Development Limited System, method, and computer program for periodic memory leak detection
CN110580527B (zh) * 2018-06-08 2022-12-02 上海寒武纪信息科技有限公司 通用机器学习模型的生成方法、装置和存储介质
KR20210017985A (ko) 2018-06-08 2021-02-17 상하이 캠브리콘 인포메이션 테크놀로지 컴퍼니 리미티드 범용 기계학습 모델, 모델 파일의 생성 및 분석방법
US10846202B2 (en) * 2018-07-17 2020-11-24 Oracle International Corporation Multi-language heap analyzer
CN112052256A (zh) * 2020-09-02 2020-12-08 平安资产管理有限责任公司 多版本请求返回方法、装置、计算机设备及可读存储介质
CN113010453A (zh) * 2021-04-12 2021-06-22 杭州和利时自动化有限公司 一种内存管理的方法、系统、设备及可读存储介质

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101221536A (zh) * 2008-01-25 2008-07-16 中兴通讯股份有限公司 嵌入式系统的内存管理方法及装置
CN101470665A (zh) * 2007-12-27 2009-07-01 Tcl集团股份有限公司 一种无mmu平台的应用系统内存管理的方法及系统
CN101763308A (zh) * 2009-12-25 2010-06-30 中国科学院计算技术研究所 在运行时对堆数据进行池分配的方法
CN101853210A (zh) * 2010-05-25 2010-10-06 惠州华阳通用电子有限公司 一种内存管理方法及装置
US20100287538A1 (en) * 2009-05-07 2010-11-11 Soundararajan Suresh Method and system for data centric heap profiling
US20110145536A1 (en) * 2009-12-11 2011-06-16 Guenter Zachmann Memory leak detection during dynamic memory allocation

Family Cites Families (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5408650A (en) * 1993-06-29 1995-04-18 Digital Equipment Corporation Memory analysis system for dynamically displaying memory allocation and de-allocation events associated with an application program
US6817011B1 (en) 1999-12-14 2004-11-09 International Business Machines Corporation Memory allocation profiling to discover high frequency allocators
US6658653B1 (en) 2000-06-08 2003-12-02 International Business Machines Corporation Debugging methods for heap misuse
US7434020B2 (en) 2003-12-31 2008-10-07 Microsoft Corporation Overwrite detection diagnostic for memory heap
CN101615143B (zh) 2008-06-27 2013-04-17 国际商业机器公司 用于内存泄漏诊断的方法和装置
WO2010093996A1 (en) 2009-02-13 2010-08-19 Peter Anthony Crosby Memory utilization analysis
US8490061B2 (en) * 2009-05-07 2013-07-16 International Business Machines Corporation Profiling application performance according to data structure
US8359584B2 (en) 2009-12-18 2013-01-22 Microsoft Corporation Debugging from a call graph

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101470665A (zh) * 2007-12-27 2009-07-01 Tcl集团股份有限公司 一种无mmu平台的应用系统内存管理的方法及系统
CN101221536A (zh) * 2008-01-25 2008-07-16 中兴通讯股份有限公司 嵌入式系统的内存管理方法及装置
US20100287538A1 (en) * 2009-05-07 2010-11-11 Soundararajan Suresh Method and system for data centric heap profiling
US20110145536A1 (en) * 2009-12-11 2011-06-16 Guenter Zachmann Memory leak detection during dynamic memory allocation
CN101763308A (zh) * 2009-12-25 2010-06-30 中国科学院计算技术研究所 在运行时对堆数据进行池分配的方法
CN101853210A (zh) * 2010-05-25 2010-10-06 惠州华阳通用电子有限公司 一种内存管理方法及装置

Cited By (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111552539A (zh) * 2014-07-14 2020-08-18 甲骨文国际公司 变量句柄
CN111552539B (zh) * 2014-07-14 2023-07-07 甲骨文国际公司 变量句柄
CN110383247A (zh) * 2017-04-28 2019-10-25 伊纽迈茨有限公司 由计算机执行的方法、计算机可读介质与异构计算系统
CN110383247B (zh) * 2017-04-28 2023-04-28 伊纽迈茨有限公司 由计算机执行的方法、计算机可读介质与异构计算系统
CN109344045A (zh) * 2018-07-27 2019-02-15 阿里巴巴集团控股有限公司 业务系统切换方法、装置、电子设备及存储介质
CN112789602A (zh) * 2018-10-01 2021-05-11 微软技术许可有限责任公司 软件故障的反向调试
CN111309449A (zh) * 2020-03-17 2020-06-19 上海蓝载信息科技有限公司 面向元编程、交互式编程和区块链互操作的与编程语言无关的虚拟机
CN111309449B (zh) * 2020-03-17 2023-09-08 上海蓝载信息科技有限公司 面向元编程、交互式编程和区块链互操作的与编程语言无关的虚拟机
CN113805971A (zh) * 2021-09-23 2021-12-17 武汉深之度科技有限公司 一种应用程序运行方法、计算设备及存储介质
CN113821272A (zh) * 2021-09-23 2021-12-21 武汉深之度科技有限公司 一种应用程序运行方法、计算设备及存储介质
CN113821272B (zh) * 2021-09-23 2023-09-12 武汉深之度科技有限公司 一种应用程序运行方法、计算设备及存储介质
CN113805971B (zh) * 2021-09-23 2023-10-13 武汉深之度科技有限公司 一种应用程序运行方法、计算设备及存储介质

Also Published As

Publication number Publication date
EP2766807A1 (en) 2014-08-20
US8566559B2 (en) 2013-10-22
US20130091337A1 (en) 2013-04-11
CN103034484B (zh) 2016-01-20
WO2013055635A1 (en) 2013-04-18
EP2766807A4 (en) 2015-03-25

Similar Documents

Publication Publication Date Title
CN103034484B (zh) 本机堆分配的运行时类型标识
US7730464B2 (en) Code compilation management service
US10353679B2 (en) Collecting profile data for modified global variables
JP5139987B2 (ja) 拡張可能メタデータ
US9558055B2 (en) System level memory leak detection
US9588872B2 (en) Discovery of code paths
US20080244531A1 (en) Method and system for generating a hierarchical tree representing stack traces
CN102222012A (zh) 针对外部数据源的静态类型检查
CN109154908B (zh) 具有精确垃圾收集报告的动态大小的局部
US9003240B2 (en) Blackbox memory monitoring with a calling context memory map and semantic extraction
US20130054925A1 (en) Memory allocation tracking
US20130054923A1 (en) Automatic memory leak detection
US10120655B2 (en) Seamless high performance interoperability between different type graphs that share a garbage collector
CN101361058A (zh) 经定性化注释的代码
US8615743B2 (en) Adaptive compiled code
US9164872B2 (en) Tracking of program objects during request processing
US10809985B2 (en) Instrumenting program code
US20160170724A1 (en) Inter-procedural type propagation for devirtualization
US10572275B2 (en) Compatible dictionary layout
US20080163009A1 (en) Method and system for providing enhanced memory error messages
CN111797025B (zh) 一种针对应用的数据处理方法及装置
US20180260304A1 (en) Mapping dynamic analysis data to source code
Jibaja et al. Deferred gratification: Engineering for high performance garbage collection from the get go
CN108121602B (zh) 一种确定垃圾收集触发点的方法、电子设备及存储介质
US20170083298A1 (en) Resilient format for distribution of ahead-of-time compiled code components

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
ASS Succession or assignment of patent right

Owner name: MICROSOFT TECHNOLOGY LICENSING LLC

Free format text: FORMER OWNER: MICROSOFT CORP.

Effective date: 20150730

C41 Transfer of patent application or patent right or utility model
TA01 Transfer of patent application right

Effective date of registration: 20150730

Address after: Washington State

Applicant after: Micro soft technique license Co., Ltd

Address before: Washington State

Applicant before: Microsoft Corp.

C14 Grant of patent or utility model
GR01 Patent grant