问题标签 [stack-frame]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
190 浏览

gcc - 我可以在寄存器中获取一个小的本地数组吗?

我可能被迫编写一些性能关键的 C/C++ 代码,涉及多个输入数组和一个结果数组(不要介意确切的类型)。由于某些原因,我想处理我的输出数组的小块,根据输入修改它们 - 但不需要不断地读取并将它们写回内存,因为我不信任缓存(也就是说,我担心输入数组会覆盖它,我最终会实际进行内存读取和写入,这太可怕了......)所以,我想安全地玩它并试图留在寄存器上。

  • 我可以得到一个只存储在寄存器中的小型本地固定长度数组吗?
  • 我如何实现这一目标?
  • 这样的阵列可以有多大(例如,在 Haswell 或 Skylake 核心上)?
0 投票
1 回答
495 浏览

java-7 - 使用 ASM api 构造 FrameNode

我成功实现了字节码方法内联优化,生成的代码对我来说似乎还可以。然而,验证失败并显示以下消息:

而对应的字节码是:

第 9-11 行:存储堆叠参数。第 14-44 行:Callee 的内联字节码,最后一个ireturn被替换为GOTO.

Java7中验证失败的两种可能解决方案:

  • 添加-XX:-UseSplitVerifier用于 VM 参数。该选项有效,但在 Java8 中已弃用。

  • 在第 44 行之前添加堆栈映射表(GOTO 指令之前的那个),它列出了作为跳转目标的位置的类型(来自Stackmap frame description)。

对我来说,选项 2 更可取,但我在框架的构造上有问题。我的代码是:

我认为两者都Opcodes.NEW/SMAE应该在这里工作。但是无法计算剩下的四个参数,因为访问者没有访问过目标代码,也不知道 nStack、nlocals..

那么任何人都可以在这里构建 FrameNode 或示例来处理这种情况提供建议吗?谢谢。

FramNode FrameNode ASM 文档的描述:

公共 FrameNode(int 类型,int nLocal,Object[] local,int nStack,Object[] 堆栈)

构造一个新的 FrameNode。

参数:

0 投票
1 回答
458 浏览

java - 评估树遍历递归算法(Java)中是否可能出现堆栈溢出错误

从理论上(即,不实际执行)确定某个树遍历递归算法将在 Java 中产生堆栈溢出的情况的最佳方法是什么?

为了澄清我的问题,请考虑以下示例。给定一个用 Java 实现的简单二叉树:

在该算法中,嵌套递归调用的最大数量与树的深度成线性关系。那么我如何估计哪个是树的最大深度,它允许有序遍历算法(或类似算法)在不引发堆栈溢出错误的情况下完成?

如果最大堆栈大小是通过-Xss 选项由线程分配的,那么将这个数字除以我的递归算法使用的每个堆栈帧的估计值是否正确?

通过将参数和局部变量的大小添加到程序计数器的大小来估计每个堆栈帧的大小是否正确,其中程序计数器的大小取决于架构(32位与64位等...) .

我还缺少其他东西吗?

更新:

我确实知道可以将递归算法转换为迭代算法,以避免堆栈溢出错误。这只是一个关于递归算法的理论问题。

0 投票
1 回答
266 浏览

assembly - 为什么 print (absolute value) 会在 gdb 中返回 ASCII 码

这是我的组装代码:

当我键入print 0x80484d0它时,它会返回给我$1 = 134513872,我知道它代表字符串“asdfsfd”。所以我的问题是,为什么 gdb 会返回 ASCII 码而不是真正的字符串,以及如何更改我的选项以使 gdb 显示字符串。

还有一个问题:我知道ESP寄存器查看堆栈的底部,可以说它的地址A。movl $0x80484d0,(%esp)当这条指令发生时会发生什么esp?我的意思是当某些信息设置为espesp应该更改为 x80484d0 的 A + 大小时?看看esp堆栈的底部?这张图片应该让我的问题更清楚。我知道我在某个地方弄错了。谢谢你。

0 投票
2 回答
3058 浏览

c# - Visual Studio 在 StackOverflowException 上丢失第一个堆栈帧

我正在运行一个网络爬虫并使用 HtmlAgilityPack 解析页面内容,并在该 C# 库中随机获取 StackOverflowException,但是当我尝试查看我的代码的调用堆栈列表时,我得到:

“已超出 Visual Studio 支持的最大堆栈帧数。”

旁注:我已经在使用sjdirect 的HAP 修复程序。

这是一个快照(它一直像这样重复)。

有没有办法将 Visual Studio 可以跟踪的堆栈帧的数量扩大到至少与应用程序在填充其堆栈之前可以分配的一样多?或者可以反过来做,即减少被调试应用程序的堆栈大小?

0 投票
1 回答
1184 浏览

python - 如何在堆栈帧之间上下移动?

假设我使用 获得了一个堆栈帧sys._getframe(1),这显然不是当前帧。

现在我想以某种方式移动到外部堆栈框架并执行一条语句,例如 Maybe x=10,以便在该框架中创建一个变量。

我知道以这种方式设置变量不是一个好习惯,但这可能是其他一些陈述。所以,重要的部分是如何移动到那个框架。with(frame)似乎不起作用。

我认为这应该是可能的,否则为什么会有两个名为getinnerframes和模块getouterframes的函数?inspect除非你可以移到外框,否则为什么还要有内框?

编辑:在pdb模块中,他们有上下两个命令,文档

d(own) 将当前帧在堆栈跟踪中向下移动一级(到较新的帧)。

u(p) 在堆栈跟踪中将当前帧向上移动一级(到较旧的帧)。

这对我的案子有帮助吗?如果是,如何使用?

0 投票
1 回答
4490 浏览

c - x86_64:堆栈帧指针几乎没用吗?


  • Linux x86_64。
  • gcc 5.x

我正在研究两个代码的输出,有 -fomit-frame-pointer 和没有(默认情况下,“-O3”处的 gcc 启用该选项)。

我的问题是:

如果我全局禁用该选项,即使在极端情况下编译操作系统,是否有问题?

我知道中断使用该信息,那么该选项仅适用于用户空间吗?

0 投票
1 回答
1059 浏览

llvm - llvm中的堆栈帧降低是什么?

我正在使用 LLVM 并且对它有些陌生。

我无法弄清楚 LLVM 降低堆栈帧的含义。有人可以解释它是什么吗?

任何帮助表示赞赏

0 投票
1 回答
1362 浏览

ios - 如何在 iOS 中获取任意线程的正确帧指针?

获取帧指针的方法

在此处输入图像描述

在 iPhone 5s Device / Xcode 7 上运行的演示应用程序上,我尝试使用 获取任意frame pointer线程,但总是导致错误:thread_get_state

我像这样读取帧指针:uintptr_t fp = machineContext.__ss.__fp;根据Apple Doc(ARMv6ARM64),

寄存器 R7 用作 ARMv6 上的帧指针

而 ARM64 上的 x29

帧指针寄存器 (x29) 必须始终寻址有效的帧记录,尽管某些函数(例如叶函数或尾调用)可能会选择不在此列表中创建条目。因此,堆栈跟踪总是有意义的,即使没有调试信息。

证明帧指针错误的方法

如何证明 fp ( machineContext.__ss.__fp) 不是正确的帧指针?

  1. 如果参数是当前线程,例如 mach_thread_self(),fp 始终为 0,与 ; 不同__builtin_frame_address(0)

  2. 如果参数不是当前线程,例如主线程,指向前一帧指针的指针fp会在两到三帧内为NULL,对于普通的栈帧链表来说太短了;

  3. 仍然不是当前线程,我打印出backtrace之前在主线程上使用的调用堆栈地址sleep。然后在另一个线程上,我挂起主线程并读取thread_get_state用于遍历调用堆栈的帧指针,两个回溯缓冲区完全不同;

什么让我困惑

Apple Doc帧指针寄存器 (x29) 必须始终寻址有效的帧记录,但我可以从中读取值。

此外,ARM Doc状态在过程调用标准的所有变体中,寄存器 r16、r17、r29 和 r30 具有特殊的作用。在这些角色中,当用于保存地址时,它们被标记为 IP0、IP1、FP 和 LR

下面是_STRUCT_MCONTEXT's 部分值的示例:

我在找什么

我现在正在寻找一种方法来获取Frame Pointer任意线程的正确值。

谢谢你的帮助!

更新 1

当然,我想要的是获取任意线程的叶子栈帧的正确性,Frame Pointer然后沿着Previous Pointer.Frame pointer

在此之前,我已经阅读了这些链接:

获取其他线程的回溯

如何在 iPad 应用程序中循环遍历所有活动线程

从另一个线程打印堆栈跟踪

再次感谢。

更新 2

我在其他平台上尝试过,但结果相同:错误的帧指针

返回的值framePointerOfMachineContext__builtin_frame_address(0).

更新 3

受一位同事的启发,我尝试了 inline asm 并在 i386 上实现了:

现在ebp变量与builtinFP's 保持相同的值。但是如何在任意线程上做到这一点?

0 投票
1 回答
748 浏览

assembly - 递减堆栈指针在堆栈上保留空间是什么意思?

在这种情况下,“保留”到底是什么意思?递减堆栈指针如何在堆栈上保留空间?调整堆栈指针寄存器有副作用吗?

“保留空间”听起来像内存分配,但堆栈的内存通常是固定的并预先分配,所以我认为这不是它的意思。

我认为这只是意味着我们告诉其他人不要使用我们的堆栈空间,而其他人只是读取堆栈指针寄存器并且按照惯例知道它不应该破坏任何高于此的内容。如果是这样,那另一个人又是谁?后续函数调用?操作系统?