问题标签 [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.
objective-c - Objective-C 中的堆栈 - 框架 - 堆
我在这个网站上找到的所有问题都只涉及Stack
vsHeap
并且不讨论Frame
所以这是我的问题。不要理解这三个之间的区别。
我知道的:
Frame
: Aframe
就像是一个函数的实例变量的黑板。当函数运行时,所有实例变量都存储在该frame
函数的内部。当一个函数被调用时,它
frame
会在stack
.
Stack
: Astack
可以可视化为 的物理stack
。frames
当一个方法(或函数)被执行时,它会从stack
.
Heap
: 所有对象指针都存在于heap
.
堆栈和框架很清楚(我认为),但我的Heap
陈述是否正确?
c# - 我有时无法从 Silverlight 中的方法中获取方法名称
我有这种从 Silverlight 客户端记录错误的方法:
我的问题是,当我运行应用程序并调用一个引发异常的方法时,它会记录如下:
但是当具有正常(非开发人员运行时)的人运行此应用程序并引发异常时,它会记录如下:
我只是猜测这是由于 SDK Silverlight 运行时所致。很难说,因为我的大多数同事都安装了 Silverlight SDK...有人可以确认这是否是导致此异常的原因。
解决了!
这不是 SDK 运行时的原因,只是因为我调用了匿名方法。我在其中添加了这行代码:
我不担心这会占用多少资源,因为毕竟发生了异常,用户将停止他正在做的任何事情并联系支持。
assembly - 向程序集 x86 插入新指令时的堆栈帧大小?
如果我在堆栈帧中插入新的函数和指令来汇编 x86 代码,是否有必要增加堆栈大小?如果是的话是多少?
python - 何时在 python 中释放函数堆栈数据?
在测试以下代码时,我对此有疑问:
1、
2、
- 文件对象在file_close_test退出时关闭,因为没有引用它。
- 引发异常后,文件对象没有关闭。所以我认为相关的堆栈数据没有释放。
- exception_wrapper退出后,文件自动关闭。
你能为我解释一下吗?谢谢。
python - Python 类堆栈框架限制
如果我有以下格式的课程:
我可以调用该函数的次数是否有限制?例如:
getNewObject()
我可以调用的返回值的次数是否有限制getNewObject()
?如果是这样,哪些因素会影响这一点?
assembly - 在这种情况下,OllyDbg 和 Assembler 中的 EBP+8 是什么意思?
我只是在 OllyDbg 中学习汇编和调试技能,以便学习如何使用未记录的函数。现在我遇到以下问题:
我有以下代码部分(来自 OllyDbg):
这是函数的开始,目标是找到数据结构。所以我发现它首先将 EBP 推入堆栈,然后将 ESP(当前堆栈指针)移动到 EBP,我认为它现在为函数定义了一个堆栈帧。现在教程说,在流行的布局中,第一个参数放在 [EBP+8] 处,第二个放在 [EBP+C] 处
这是我不明白的。我怎么知道第一个参数放在 EBP+8 ?
希望有人可以帮助我!谢谢!
java - 如何扩展 Java 堆栈跟踪的大小以查看堆栈底部?(触发堆栈溢出)
在 Java 中,有没有办法查看完整的、未截断的堆栈跟踪(例如,通过增加记录的帧数),或者以其他方式到达堆栈跟踪的底部?通常堆栈跟踪在 1024 帧处从顶部截断,但对于堆栈溢出问题,这是毫无价值的,因为您确实需要查看是谁发出了触发递归的调用,在底部附近。在堆栈中间截断会更好,但显然 Sun 的 JVM 不够聪明,无法做到这一点。
也许甚至是一些特殊的太阳特定标志?我尝试将堆栈大小减小到允许的最小值(-Xss1000),但这仍然超过 1024 帧的价值。
就我而言,我正在尝试调试 Hadoop 映射器中发生的堆栈溢出,但前提是在非常大的输入上运行时。我认为问题出现是因为递归操作(Scala's foldRight
)正在一个非常非常大的链表上完成,我需要以非递归方式重写它......但我需要知道是谁调用了foldRight
. 这是一个在很多地方直接和间接调用的基本例程,并且我正在使用大量代码,所以这是非常不明显的。
c - 具有子作用域的函数的堆栈帧结构
以下是代码,我将其作为参考,以了解{}
函数中存在的子作用域(或)虚拟作用域(just)如何影响堆栈帧的结构。
样本输出
基于上述行为,我推测如下。
- 没有为范围创建堆栈帧
{}
。 - 通过这种方式
auto
,声明/定义的变量main
和子范围内的变量{}
共享相同的堆栈帧。 main
因此,在函数内的任何地方(甚至在子范围内)都可以自由访问声明/定义的变量。- 另一方面,在子作用域中声明/定义的变量在块外失去了作用域。但只要堆栈帧存在,它的生命周期就有效。
问题:如果上述几点是正确的,那么为什么在给出同一个变量的多个定义时代码没有失败,一个是 within main
,另一个是 within {}
。
performance - 省略帧指针真的对性能有正面影响,对调试能力有负面影响吗?
正如很久以前所建议的那样,我总是在没有帧指针的情况下构建我的发布可执行文件(如果使用 /Ox 编译,这是默认设置)。
但是,现在我在论文http://research.microsoft.com/apps/pubs/default.aspx?id=81176中读到,帧指针对性能没有太大影响。因此,完全优化它(使用 /Ox)或使用帧指针完全优化它(使用 /Ox /Oy-)对性能并没有真正的影响。
微软似乎表示添加帧指针 (/Oy-) 会使调试更容易,但真的是这样吗?
我做了一些实验并注意到:
- 在一个简单的 32 位测试可执行文件(使用 /Ox /Ob0 编译)中,省略帧指针确实提高了性能(大约 10%)。但是这个测试可执行文件只执行一些函数调用,没有别的。
- 在我自己的应用程序中,添加/删除帧指针似乎没有很大的影响。添加帧指针似乎可以使应用程序快 5%,但这可能在误差范围内。
关于帧指针的一般建议是什么?
- 是否应该在发布可执行文件中省略它们(/Ox),因为它们确实对性能有积极影响?
- 是否应该在发布可执行文件中添加(/Ox /Oy-),因为它们提高了调试能力(使用故障转储文件进行调试时)?
使用 Visual Studio 2010。
c - 当 main() 调用 main() 时堆栈帧会发生什么
请考虑以下代码:
编译:
执行:
这里 main() 调用了它自己()。
似乎main()
每次main()
自己调用函数的原始堆栈帧都会被覆盖。
但是返回地址是什么?函数可以返回到自己的堆栈帧吗?
请帮我澄清这个疑问。
谢谢。