CN114144764A - 使用影子栈的栈跟踪 - Google Patents
使用影子栈的栈跟踪 Download PDFInfo
- Publication number
- CN114144764A CN114144764A CN202080037709.2A CN202080037709A CN114144764A CN 114144764 A CN114144764 A CN 114144764A CN 202080037709 A CN202080037709 A CN 202080037709A CN 114144764 A CN114144764 A CN 114144764A
- Authority
- CN
- China
- Prior art keywords
- stack
- call
- shadow
- shadow stack
- traceback
- 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
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4482—Procedural
- G06F9/4484—Executing subprograms
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/38—Concurrent instruction execution, e.g. pipeline, look ahead
- G06F9/3802—Instruction prefetching
- G06F9/3804—Instruction prefetching for branches, e.g. hedging, branch folding
- G06F9/3806—Instruction prefetching for branches, e.g. hedging, branch folding using address prediction, e.g. return stack, branch history buffer
-
- 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/362—Software debugging
- G06F11/3636—Software debugging by tracing the execution of the program
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/52—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow
-
- 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/3604—Software analysis for verifying properties of programs
- G06F11/3612—Software analysis for verifying properties of programs by runtime analysis
-
- 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/3664—Environments for testing or debugging software
Abstract
使用调用栈和影子栈来执行程序。调用栈包括具有各自的返回地址的帧。这些帧还可以存储变量和/或参数。影子栈存储调用栈中的返回地址的副本。调用栈和影子栈通过以下方式来维护:(i)每当调用函数时,向调用栈添加相应的栈帧,并向影子栈添加相应的返回地址,以及(ii)每当退出函数时,从调用栈移除相应的帧,并从影子栈移除相应的返回地址。通过访问影子栈中的返回地址,生成程序当前调用链的回溯跟踪。输出的回溯跟踪包括来自影子栈的返回地址和/或关于从影子栈的返回地址导出的被跟踪函数的信息。
Description
背景技术
大多数编程语言支持模块化构建和执行软件。典型地,程序具有可执行代码模块或单元,例如方法、子程序、函数等(在此统称为“函数”)。编译程序通常包括许多这样的函数,每个函数都具有一个名称或句柄,可以通过该名称或句柄来引用函数。函数将具有可执行指令,并且通常具有用于交换数据的参数和用于内部计算的局部声明变量。程序可以由许多这样的函数组成,在许多情况下,函数调用其他函数,例如的a()调用b(),然后调用c()。执行程序可能具有很长的这种函数调用链。
为了管理函数的调用和执行,大多数编译器会编译程序以在执行时使用某种形式的调用栈。每当调用函数(例如,a()调用b())时,相应的新栈帧被推送到调用栈(在这种情况下,b()的帧被推送到a()的帧的顶部)。新帧包含返回地址,即程序中调用相应函数的点(在本例中,是a()中调用b()的位置)。每当函数退出时,函数的帧都会从调用栈中弹出,并且控制流会传递到帧中的任何一个返回地址。帧还可以用来存储传入/传出其函数的参数以及在其函数中声明的局部数据。
在任何给定时间,调用栈上的帧顺序反映了链式函数调用的当前顺序,其中每个帧代表一个尚未退出的函数。当程序执行时,通常希望知道当前的函数调用链。这些信息(有时称为栈跟踪或回溯跟踪(backtrace))在调试和性能分析等方面非常有用。如下面所讨论,有不同的方法可以使用调用栈来构建回溯跟踪,但是所有现有的回溯跟踪方法都会导致计算开销,以至于在某些情况下回溯跟踪是不实用的。例如,在许多生产系统和用户设备中,即使所导致的延迟的略微增加,都会使回溯跟踪变得令人无法接受。
一种用于回溯跟踪的现有方法包括将调用者的帧地址保存在被调用者的栈帧中,并使用专用寄存器(例如x86EBP寄存器)来指向当前被调用者的帧。专用寄存器用于获取当前栈帧,从当前栈帧中获取调用者的栈帧地址,从当前栈帧中获取调用者的栈帧地址。在每一帧中,相应函数的返回地址以固定的偏移量存储。因此,要获取栈回溯跟踪,需要找到并转存每个帧的返回地址。
另一种方法涉及不将调用者的栈帧地址保存在被调用者的栈帧中。相反,通过反向执行函数序言来计算栈帧大小。栈回溯跟踪首先从计算栈大小开始,然后从栈指针中减去栈大小来获取返回地址。通过使用返回地址,可以计算调用者的栈帧大小,从而获取调用者的返回地址,依此类推。与第一种方法相比,这种方法在不进行回溯跟踪时效率更高(更低的支持开销),但在执行栈回溯跟踪时效率较低。
另一种方法是使用特殊的硬件支持,例如英特尔的最后分支记录(LBR)。如果将LBR配置为调用栈模式,则其将记录活动调用。此类活动调用信息可以作为栈回溯跟踪进行转储。
虽然这些现有方法可以产生期望的输出,但是所产生的开销是不可忽略的。第一种方法需要额外的指令来将调用者的栈帧地址保存在被调用者的栈帧中,并且在“遍历栈”时必须计算调用者的帧地址。第二种方法需要大量的存储器查找来查找帧大小信息。第三种方法强调线程上下文切换,因为每个上下文切换都需要保存和恢复许多额外的寄存器。
下面讨论的是使用影子栈来促进回溯跟踪的技术,其开销可忽略不计。
发明内容
以下概述仅用于介绍在下面的详细描述中讨论的一些概念。该概述并不全面,并且不旨在描绘所要求保护的主题的范围,该范围由结尾给出的权利要求来阐述。
使用调用栈和影子栈来执行程序。调用栈包括具有各自的返回地址的帧。这些帧还可以存储变量和/或参数。影子栈存储调用栈中返回地址的副本。调用栈和影子栈通过以下方式来维护:(i)每当调用函数时,向调用栈添加对应的栈帧,并向影子栈添加对应的返回地址,以及(ii)每当退出函数时,从调用栈移除对应的帧,并从影子栈移除对应的返回地址。通过访问影子栈中的返回地址,生成程序当前调用链的回溯跟踪。输出的回溯跟踪包括来自影子栈的返回地址和/或关于从影子栈的返回地址导出的被跟踪函数的信息。
下面将参考附图考虑,结合以下详细描述来解释许多伴随的特征。
附图说明
结合附图,根据以下详细描述,将更好地理解本描述,其中在所附描述中,相同的附图标记表示相同的部件。
图1示出了一个执行程序,以及相应的调用栈和影子栈。
图2示出了由编译器编译生成可执行程序的源代码示例。
图3示出了调用栈和影子栈的细节。
图4示出了如何维护调用栈和影子栈。
图5示出了基于软件的影子栈实现。
图6示出了基于硬件的影子栈实现。
图7示出了如何使用影子栈来满足回溯跟踪请求。
图8示出了使用影子栈的过程。
图9示出了将影子栈内容与其他信息结合使用来生成回溯跟踪。
图10示出了可以实现回溯跟踪逻辑的各种上下文。
图11示出了回溯跟踪输出示例。
图12示出了计算设备的细节。
具体实施方式
下面讨论的实施例涉及使用影子栈来实现有效的栈回溯跟踪。首先对调用栈和影子栈进行概述。然后描述实现影子栈的各种方式,接着描述使用影子栈来促进栈回溯跟踪的方法的细节。
图1示出了执行程序100以及相应的调用栈102和影子栈104。程序100可以是编译的机器指令、字节码、由解释器执行的源代码等等。程序100包括各种函数和对这些函数的调用。可以以多种已知方式中的任何一种来实现调用栈102。如背景技术中所提到的,分别根据函数调用和退出/返回来推送和弹出帧。
影子栈104也可以以已知的方式使用软件、硬件或两者来实现。如背景技术中所提到的,在几乎所有的调用栈实现中,当函数退出时,其栈帧被弹出调用栈,并且执行控制传递到帧的返回地址所指向的任何代码位置,通常是调用退出函数的函数中的位置。调用栈在流控制中的作用(即,提供返回地址)是众所周知的安全弱点。通过使用各种技术,可以改变或破坏调用栈来改变返回地址,从而使执行指向恶意代码的位置。
影子栈是返回地址漏洞的一种解决方案。简而言之,影子栈是与调用栈分离的栈,并且与调用栈同步,使得每当向调用栈添加帧时,该帧的返回地址都被添加到影子栈。每当从调用栈顶部弹出一个帧,影子栈顶部的返回地址就会相应地从影子栈中弹出。如果弹出的返回地址与弹出帧中的返回地址不匹配,则发生了错误,可以采取补救措施。
图2示出了由编译器112编译产生可执行程序114的源代码110的示例。源代码110包含各种函数和函数调用。编译器112将源代码翻译成可执行程序114,可执行程序114可以是机器代码、字节代码、中间代码、目标代码等形式。编译的可执行程序114具有分别与源代码中的函数对应的代码/指令单元。或许除了在一些托管运行时环境中,编译器还向可执行程序114添加用于实现调用栈的指令。如下文详细讨论,在使用基于软件的影子栈的实施例中,编译器112还添加用于实现影子栈的插桩(instrumentation)代码。
图3示出了调用栈102和影子栈104的细节。调用栈102由帧120组成,每个帧用于一个仍然挂起的函数调用。每个帧120包括返回地址122,以及用于局部变量124和参数126的存储器,视情况而定。图3的示例包括函数main()、bar()和foo()。main()函数编码为调用foo(),foo()编码为调用bar()。图3中所示的调用栈102反映了当foo()已经被调用并且仍在执行时的可执行程序114。如图3所示,假设调用栈102没有被破坏,影子栈104应当包含调用栈中各个帧中的返回地址的副本126,并且顺序相同。
图4示出了如何维护调用栈102和影子栈104。如下文详细讨论,图4中的影子栈管理步骤可以由处理器的特殊影子栈硬件、由软件或两者来执行。当执行程序100在步骤130调用函数时,在步骤132,将新帧134推送到调用栈102。新帧134包括与调用被调用函数的点对应的返回地址。在步骤136,基于相同的函数调用,将新的返回地址138(新帧134中的相同返回地址)推送到影子栈104上。可以以任何顺序或并行执行添加到栈的步骤。
在步骤140,执行程序100正在执行被调用的函数,并且该函数返回(例如退出)。在步骤142,从调用栈中弹出返回自函数的帧,并且在步骤144,从影子栈中弹出影子栈上的顶部返回地址。如同本文描述的大多数步骤一样,用于从栈移除的步骤可以以任何顺序执行或并行执行。此外,移除/退出过程包括一些逻辑(无论是硬件还是软件),以将弹出帧中的返回地址与从影子栈弹出的返回地址进行比较,并且如果二者不匹配,则相应地做出响应。但是,对于回溯跟踪来说,不一定需要比较,如果可以在没有任何比较/补救步骤的情况下实现影子栈,则可以进一步降低小的回溯跟踪开销。
如上所述,影子栈可以通过硬件或软件来实现。图5示出了基于软件的影子栈实现。在该实施例中,编译器将实现影子栈的插桩代码插入到其转换后的输出中。通常,插桩代码150将放置在每个函数调用152附近。插桩代码150可以包括进入逻辑154和退出逻辑156。进入逻辑154可以将相关的返回地址推送到影子栈上,等等。退出逻辑156可以弹出影子栈的顶部,并对照相应调用帧中的返回地址检查弹出的返回地址。
图6示出了基于硬件的影子栈实现。处理器160具有实现处理器指令集中各种指令的电路。在一个实施例中,处理器对调用指令的实现包括普通调用逻辑164以及影子栈逻辑166。普通调用逻辑164是存在于典型处理器中的调用指令控制流逻辑,而不管处理器是否实现影子栈。影子栈逻辑166执行上述影子栈函数,但是与调用指令162相关联。一些处理器可以具有用于控制影子栈逻辑是否活跃的寄存器,该寄存器可以控制影子栈逻辑166的实现和/或回溯跟踪使用等。可执行程序可能看不到影子栈,影子栈是在无插桩代码的情况下实现的。换句话说,相同的可执行文件可以在(i)一个缺乏影子栈支持的处理器(并且执行将不具有影子栈)和(ii)另一个具有影子栈支持的处理器(并且将具有影子栈)上运行而无需修改。
在硬件和软件实现中,当线程或程序正在执行时,无论是由影子栈正在跟踪其调用的程序/线程读取,还是由诸如调试器或运行时环境的另一组件读取,都假定影子栈可随时读取。
图7示出了如何使用影子栈来满足回溯跟踪请求170。编译后的程序100正在执行。如上所述,程序调用函数内的函数,从而形成函数调用链,而相应的状态则反映在调用栈和影子栈中。可以在任意执行点期间接收回溯跟踪请求170。回溯跟踪请求170可以是应用编程接口(API)调用、对可执行程序100中包括的回溯跟踪函数的调用等。回溯跟踪请求也可以由异常处理程序、由外部信号调用的信号处理程序等发出。
基于回溯跟踪请求170,通过程序100中的代码(或者链接到程序100的代码)、通过由处理器实现的影子栈指令或者通过其组合来访问和读取影子栈104。捕获影子栈104的完整或部分副本172(如本文所使用,影子栈的“副本”是指完整副本或选择性/部分副本)。在一些实施例中,可将从影子栈复制的返回地址限制为可用地址的前N个子集。这种限制可能来自硬件约束(例如,缓冲器大小)、程序中设置的变量、传递到回溯跟踪请求中的参数等。
最后,将影子栈副本172合并到跟踪或调试输出174中。用于捕获诊断信息的许多已知手段中的任何一种都可以以这种方式用影子栈回溯跟踪数据来进行补充。在一个实施例中,可以通过修改这种方法来使用用于请求和存储回溯跟踪的任何已知方法,从而除了从调用栈获取返回地址数据之外,还从影子栈获取返回地址数据,或者从影子栈而非从调用栈获取返回地址数据。例如,返回地址(其只是一个数字),可以从符号信息转换成函数名、行号、文件号等。然后可将这种完整的栈跟踪存储在日志文件中,输出到屏幕上,或者通过网络作为遥测发送,用于崩溃分析等。
图8示出了使用影子栈的过程。在步骤200,在程序执行期间,通过程序的内部逻辑或与程序通信的组件请求栈跟踪或回溯跟踪。在步骤202,可以可选地获取关于影子栈的信息,例如影子栈是否存在、其位置、当前大小(或元素数量)、影子栈的元素格式、安全信息、影子栈的属性(例如,其是用硬件还是软件实现的)等等。
在步骤204,如果获取了影子栈信息,则可以使用影子栈信息来决定如何或是否执行回溯跟踪请求。例如,除非影子栈可用(或具有某种特定特征),否则回溯跟踪请求可能不会生成回溯跟踪。影子栈的属性(如大小、位置、元素的大小/数量、权限等)也可用于访问和复制影子栈。
在步骤206,使用影子栈来生成回溯跟踪。如上所述,在一些实施例中,回溯跟踪是影子栈或其一部分的逐字副本。在其他实施例中,影子栈中的返回地址用于标识相关的对应函数、源代码模块和定义返回地址的行号、被调用函数的名称、进行调用的函数中的行号、关于相关函数的信息(例如,返回类型、参数类型/名称)等等。
图9示出了影子栈内容220与其他信息结合使用以生成回溯跟踪222。在一些实施例中,影子栈内容222中的返回地址可以与调用栈102和/或程序/模块元数据224结合使用,以导出丰富的回溯跟踪222。程序/模块元数据224是存在于目标文件、符号表、源代码文件等中的元数据。回溯跟踪生成函数226接收影子栈内容220。回溯跟踪生成函数226还接收或访问程序/模块元数据226和/或调用栈102。这些信息可以以各种方式合成/组合。通过将影子栈内容中的返回地址与调用栈中的帧和返回地址相关联,可以获取参数和局部变量的值,可以找到函数和模块的名称,可以获取调用的行号等。概念上,影子栈内容220中的返回地址可以用作附加数据的索引;影子栈允许以接近零成本重构调用链,并且可以用来自其他来源的附加诊断信息来充实调用链。无论以何种形式,都可能通过现有的诊断/调试/遥测方案来输出回溯跟踪222,这可能涉及使用API来输出诊断数据、收集日志文件中的格式化输出、将日志文件发送给收集服务等。
另一个示例是常规栈上是否有数据损坏。这很常见,因为局部变量也存储在常规栈上,所以代码中的错误可能会导致常规栈上的返回地址被重写。因为影子栈没有局部变量,所以程序应该需要接触影子栈上的任何存储器,因此其被破坏的可能性要小得多。在硬件的情况下,硬件可以强制影子栈为只读,而在软件的情况下,操作系统也可以使其对除其自身之外的所有人都是只读的(用于推送和弹出返回地址)。在任何情况下,如果常规栈上的返回地址被破坏,则影子栈上的返回地址的额外副本可以被换入,以纠正问题。然后,如果没有其他损坏,程序可能会继续运行。如果还有其他损坏,那么至少我们仍然可以获取成功的栈跟踪来捕获导致损坏的罪魁祸首。
此外,当展开栈时,如果栈中间有损坏,则损坏位置处会展开失败,并且由于栈上的数据是错误的,因此无法进一步展开,因此下一个返回地址的位置是未知的。但是,如果影子栈可用,即使影子栈本身有一些损坏的条目,也可以跳过损坏的返回地址条目,并继续展开,因为已知返回地址在存储器中是连续的。
图10示出了可以实现回溯跟踪逻辑的各种上下文。在图10顶部所示的一个实施方式中,程序100包括对用于捕获回溯跟踪的API的调用。该API可以是任何已知的用于调试或捕获回溯跟踪的API。然而,实现该API的逻辑使用影子栈。该API还可以具有与使用影子栈相关的附加函数/方法。例如,该API可以定义用于设置满足回溯跟踪请求的先决条件的函数(例如,影子栈可用,影子栈可用并由硬件支持等)。该API还可以促进向后兼容。回溯跟踪函数也可以完全包含在程序中,如图10中间所示。在另一个实施例中,诸如调试器、托管代码环境、解释器等环境230既执行程序又提供回溯跟踪函数。
图11示出了回溯跟踪输出示例240。该示例包括基于影子栈数据生成的字符串242。可以使用任何已知样式的回溯跟踪格式和内容。设置、不同的回溯跟踪函数(例如backtrace_raw()或backtrace_symbols())或回溯跟踪函数参数可用于控制回溯跟踪的样式和内容,其范围可为从裸存储器地址列表到回溯跟踪中出现的函数的详细信息和图形。
尽管上述实施例涉及编译程序,但是大多数技术可以很容易地应用于解释程序。在这种情况下,解释器可以配置为以类似的方式使用影子栈。从程序的角度来看,解释器应该是相同的;编译程序和解释程序都有由处理器执行的调用/ret指令。
一些调用栈实现使用链接在一起的多个调用栈。在这种情况下,相应的影子栈被链接,并且展开回溯跟踪的当前调用链可能涉及展开链接的影子栈。
本文使用的术语“程序”也视为是指线程。通常,每个线程都有自己的调用栈和影子栈。
图12示出了可以在其上实现上述实施例的计算设备300的细节。本文的技术公开将足以供程序员编写软件,和/或配置可重新配置的处理硬件(例如,现场可编程门阵列(FPGA)),和/或设计专用集成电路(ASIC)等以在计算设备或主机300上运行(可能通过云API)以实现本文描述的实施例。
计算设备或主机300可以具有一个或多个显示器322、网络接口324(或几个)以及存储硬件326和处理硬件328,其可以是以下任何一个或多个的组合:中央处理单元、图形处理单元、模数转换器、总线芯片、FPGA、ASIC、专用标准产品(ASSP)或复杂可编程逻辑器件(CPLD)等。存储硬件326可以是磁存储器、静态存储器、易失性存储器、非易失性存储器、光学或磁性可读物质等的任意组合。本文使用的术语“存储”的含义不是指信号或能量本身,而是指用于读取和/或存储信息的物理装置和物质状态。计算设备或主机300的硬件元件可以以机器计算领域中公知的方式协作。此外,输入设备可以与计算设备或主机300集成或通信。计算设备或主机300可以具有任何形状因素,或者可以用在任何类型的包含设备中。计算设备或主机300可以是手持设备的形式,例如智能手机、平板计算机、游戏设备、服务器、机架安装或背板板上计算机、片上系统或其他。
上述实施例和特征可以以存储在易失性或非易失性计算机或设备可读介质中的信息的形式来实现。认为此至少包括诸如光存储(例如,光盘只读存储器(CD-ROM))、磁介质、闪存只读存储器(ROM)或任何当前或未来存储数字信息的手段的介质。存储的信息可以是机器可执行指令(例如,编译的可执行二进制代码)、源代码、字节码或可用于使能或配置计算设备以执行上述各种实施例的任何其他信息的形式。认为此至少包括诸如随机存取存储器(RAM)的易失性存储器和/或在执行实施例的程序期间存储诸如中央处理单元指令的信息的虚拟存储器,以及存储允许加载和执行程序或可执行文件的信息的非易失性介质。实施例和特征可以在任何类型的计算设备上执行,包括便携式设备、工作站、服务器、移动无线设备等。
Claims (15)
1.一种方法,包括:
由处理器执行程序,所述程序包括函数,每个函数包括针对相应函数的相应代码和调取所述函数的调用,所述执行包括维护调用栈,所述调用栈与所述调用对所述函数的相应调取相对应的帧组成,每个帧包括对应的返回地址;
维护影子栈,所述维护包括与向所述调用栈添加帧/从所述调用栈移除帧相对应地,向所述影子栈添加返回地址/从所述影子栈移除返回地址;以及
接收用以捕获栈跟踪的请求,并基于所述请求来访问所述影子栈以捕获和存储所述栈跟踪。
2.根据权利要求1所述的方法,其中所述程序包括对栈跟踪函数的调用,并且所述请求包括所述调用对所述栈跟踪函数的调取。
3.根据权利要求1所述的方法,还包括:针对所述影子栈中的每个返回地址,分别获取相应的函数元数据。
4.根据权利要求3所述的方法,所述元数据包括分别与所述影子栈中的所述返回地址相对应的函数的名称。
5.根据权利要求1所述的方法,其中所述处理器通过提供调用指令来实现所述影子栈,单次执行所述调用指令使对应的返回地址被推送到所述调用栈上和所述影子栈上。
6.根据权利要求1所述的方法,其中捕获所述栈跟踪包括复制所述影子栈并存储所述影子栈的副本以及存储所述影子栈的所述副本与所述程序相关联的指示。
7.一种计算机可读存储硬件,存储有指令,所述指令被配置为使计算设备执行过程,所述计算设备包括处理硬件和存储器,所述过程包括:
由所述处理硬件执行程序,所述执行包括在所述存储器中提供调用栈和影子栈,所述调用栈包括栈帧,每个栈帧包括相应地对应的返回地址,所述栈帧中的一些栈帧还包括对应的局部变量和/或参数,所述影子栈包括相应地与所述调用栈中的所述返回地址相对应的返回地址,提供所述调用栈和所述影子栈包括:
每当所述程序调用函数时,在所述调用栈中添加对应的栈帧,在所述影子栈中添加对应的返回地址;以及
每当退出所述程序的函数时,从所述调用栈中移除对应的栈帧,并从所述影子栈中移除对应的返回地址;
接收与所述程序相关联的回溯跟踪请求,并且基于所述回溯跟踪请求,通过访问所述影子栈形成所述程序的回溯跟踪。
8.根据权利要求7所述的计算机可读存储硬件,所述过程还包括确定所述影子栈可用,其中仅当所述影子栈已经被确定为可用时,才执行形成所述回溯跟踪。
9.根据权利要求7所述的计算机可读存储硬件,其中形成所述回溯还包括:
使用所述影子栈中的所述返回地址来标识相应地与所述影子栈中的所述返回地址相对应的文本串,以及
将所述文本串包括在所述回溯跟踪中,所述回溯跟踪包括以如下顺序排列的文本串,所述顺序对应于所述回溯请求被接收时所述返回地址在所述影子栈中的顺序。
10.根据权利要求7所述的计算机可读存储硬件,其中所述回溯跟踪在不访问所述调用栈的情况下被形成。
11.一种设备,包括:
处理硬件;
存储硬件,存储有指令,所述指令被配置为使所述处理硬件执行过程,所述过程包括:
执行程序,所述执行包括维护调用栈和对应的影子栈;以及
当所述程序正在执行并且函数链已经由所述程序调取时,通过从所述影子栈复制返回地址并从所述程序输出所复制的所述返回地址或关于所述函数链的信息,来响应用以生成针对所述程序的回溯跟踪的请求,关于所述函数链的信息至少基于所复制的所述返回地址来计算。
12.根据权利要求11所述的设备,其中所述处理硬件包括硬件指令,所述硬件指令包括调用指令,所述调用指令包括用于管理所述影子栈的逻辑。
13.根据权利要求11所述的设备,其中所述处理硬件指令还包括返回指令,所述调用指令被配置为将地址推送到所述影子栈上,并且所述返回指令被配置为从所述影子栈弹出地址。
14.根据权利要求11的设备,所述过程还包括:所述程序调用回溯跟踪函数来请求所述回溯跟踪。
15.根据权利要求11所述的设备,其中所述回溯跟踪函数确定所述影子栈是否可用或可访问,并且基于确定所述影子栈可用或可访问来生成所述回溯跟踪。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US16/417,493 | 2019-05-20 | ||
US16/417,493 US11294682B2 (en) | 2019-05-20 | 2019-05-20 | Stack traces using shadow stack |
PCT/US2020/027813 WO2020236333A1 (en) | 2019-05-20 | 2020-04-10 | Stack traces using shadow stack |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114144764A true CN114144764A (zh) | 2022-03-04 |
Family
ID=70482857
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202080037709.2A Pending CN114144764A (zh) | 2019-05-20 | 2020-04-10 | 使用影子栈的栈跟踪 |
Country Status (4)
Country | Link |
---|---|
US (2) | US11294682B2 (zh) |
EP (1) | EP3973388A1 (zh) |
CN (1) | CN114144764A (zh) |
WO (1) | WO2020236333A1 (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US11188470B2 (en) * | 2019-05-22 | 2021-11-30 | Vdoo Connected Trust Ltd. | Dynamic identification of stack frames |
CN112882695B (zh) * | 2021-03-02 | 2023-11-28 | 百果园技术(新加坡)有限公司 | 传参方法、装置、计算机设备及存储介质 |
CN112925718B (zh) * | 2021-03-22 | 2023-10-20 | 北京字节跳动网络技术有限公司 | 调用栈回溯方法、装置、设备和介质 |
Family Cites Families (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6951011B1 (en) * | 1999-10-21 | 2005-09-27 | Oracle International Corp. | Diagnostic method and article for identifying significant events |
US20030204838A1 (en) * | 2002-04-30 | 2003-10-30 | Eric Caspole | Debugging platform-independent software applications and related code components |
US7712082B2 (en) * | 2005-03-24 | 2010-05-04 | Microsoft Corporation | Profiler stackwalker |
US8516444B2 (en) * | 2006-02-23 | 2013-08-20 | International Business Machines Corporation | Debugging a high performance computing program |
US7581089B1 (en) | 2006-04-20 | 2009-08-25 | The United States Of America As Represented By The Director Of The National Security Agency | Method of protecting a computer stack |
US8595709B2 (en) * | 2009-12-10 | 2013-11-26 | Microsoft Corporation | Building an application call graph from multiple sources |
US9378117B2 (en) * | 2014-05-30 | 2016-06-28 | Apple Inc. | Queue debugging using stored backtrace information |
US9501637B2 (en) * | 2014-09-26 | 2016-11-22 | Intel Corporation | Hardware shadow stack support for legacy guests |
US10007784B2 (en) | 2015-03-27 | 2018-06-26 | Intel Corporation | Technologies for control flow exploit mitigation using processor trace |
US20180004531A1 (en) * | 2016-06-30 | 2018-01-04 | Microsoft Technology Licensing, Llc | Split control stack and data stack platform |
US10216934B2 (en) * | 2016-07-18 | 2019-02-26 | Crowdstrike, Inc. | Inferential exploit attempt detection |
-
2019
- 2019-05-20 US US16/417,493 patent/US11294682B2/en active Active
-
2020
- 2020-04-10 CN CN202080037709.2A patent/CN114144764A/zh active Pending
- 2020-04-10 WO PCT/US2020/027813 patent/WO2020236333A1/en unknown
- 2020-04-10 EP EP20723683.7A patent/EP3973388A1/en active Pending
-
2022
- 2022-03-23 US US17/702,714 patent/US11922168B2/en active Active
Also Published As
Publication number | Publication date |
---|---|
US20220214882A1 (en) | 2022-07-07 |
WO2020236333A1 (en) | 2020-11-26 |
US11922168B2 (en) | 2024-03-05 |
US11294682B2 (en) | 2022-04-05 |
US20200371809A1 (en) | 2020-11-26 |
EP3973388A1 (en) | 2022-03-30 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10621068B2 (en) | Software code debugger for quick detection of error root causes | |
Balasubramanian et al. | System programming in rust: Beyond safety | |
US8261244B2 (en) | Arbitrary runtime function call tracing | |
US8458681B1 (en) | Method and system for optimizing the object code of a program | |
US11922168B2 (en) | Stack traces using shadow stack | |
TWI482094B (zh) | 在程式碼轉換期間異常的精確處理之方法與裝置 | |
US10831616B2 (en) | Resilient programming frameworks for iterative computations | |
US10175983B2 (en) | Branch trace compression | |
US9104804B2 (en) | Method and system for invoking just-in-time debugger | |
US8429632B1 (en) | Method and system for debugging merged functions within a program | |
US20130263094A1 (en) | Setting breakpoints in optimized instructions | |
US9229709B2 (en) | Polyphasic modules for software development | |
KR101103973B1 (ko) | 조정가능한 정밀도의 예외 핸들링 수행을 위한 방법 및장치 | |
US9104402B2 (en) | Branch trace compression | |
US8943480B2 (en) | Setting breakpoints in optimized instructions | |
US9117017B2 (en) | Debugger with previous version feature | |
US7685588B2 (en) | Platform independent binary instrumentation and memory allocation method | |
Wu et al. | Language-based replay via data flow cut | |
US20070150866A1 (en) | Displaying parameters associated with call statements | |
Fan et al. | Advanced memory checking frameworks for MPI parallel applications in Open MPI | |
US11106522B1 (en) | Process memory resurrection: running code in-process after death | |
Stone et al. | No linux, no problem: fast and correct windows binary fuzzing via target-embedded snapshotting | |
GB2537038A (en) | Resilient programming frameworks for handling failures in parallel programs | |
TR202022224A2 (tr) | Gömülü yazilimlardaki̇ yiğin taşmalarini tespi̇t etmeyi̇ sağlayan bi̇r si̇stem ve yöntem |
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 |