问题标签 [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 投票
9 回答
45280 浏览

assembly - 大多数现代系统中堆栈增长的方向是什么?

我正在准备一些 C 语言培训材料,我希望我的示例适合典型的堆栈模型。

C 堆栈在 Linux、Windows、Mac OSX(PPC 和 x86)、Solaris 和最新的 Unix 中的发展方向是什么?

0 投票
3 回答
6164 浏览

c# - 如何获取堆栈帧的执行对象?

使用反射时,可以使用 System.Diagnostics.StackTrace 获取调用堆栈(除此之外,由于 JIT 优化,它可能是一个粗略的近似值)并检查包含的 StackFrame 对象。

如何获取对堆栈帧中的方法正在执行的对象(this 指针)的引用?

我知道我可以通过在堆栈帧对象上调用 GetMethod() 来获取 MethodBase,但我正在寻找的是类似于 GetObject() 的东西(如果方法是静态的,它自然会返回 null)。似乎只能查询堆栈帧对象以获取静态确定的信息,例如方法信息、原始文件等。

VS 调试器知道(尽管它可能使用另一种获取调用堆栈跟踪的方法),因为可以双击调用堆栈窗口中的任何堆栈帧并查看本地和类字段的值。

编辑:澄清:我想要调用该方法的对象实例。即:如果方法 Foo() 在调用堆栈上的某处对对象实例 A 调用,并且它级联到我执行堆栈跟踪的方法,我想从执行堆栈跟踪的位置获取对 A 的引用。(不是方法基的声明类型)

0 投票
2 回答
346 浏览

python - 从框架对象获取对执行堆栈上的函数对象的引用?

给定 的输出inspect.stack(),是否可以从堆栈帧的任何位置获取函数对象并调用它们?如果是这样,怎么做?

(我已经知道如何获取函数的名称。)

这就是我的意思:假设我是一个函数,并且我正在尝试确定我的调用者是生成器还是常规函数?我需要调用inspect.isgeneratorfunction()函数对象。你怎么知道是谁给你打电话的?inspect.stack(), 对?因此,如果我能以某种方式将它们放在一起,我就会得到我的问题的答案。也许有更简单的方法可以做到这一点?

0 投票
4 回答
3519 浏览

c# - 确定哪个代码行引发了异常

在 dotNet 中,一行抛出异常并被捕获,我如何确定哪个文件中的哪一行抛出了异常?似乎比较简单,但我无法弄清楚......

0 投票
1 回答
465 浏览

c# - 堆栈、堆和堆栈帧在概念上如何映射到 c# 构造?

堆栈、堆和堆栈帧在概念上如何映射到 c# 构造?它们有什么关系?

0 投票
5 回答
1965 浏览

c++ - 堆栈框架问题:Java vs C++

Q1。在Java中,所有的对象、数组和类变量都存储在堆上?C++ 也一样吗?数据段是堆的一部分吗?

那么下面的 C++ 代码呢?

Q2。据我了解,编译器赋予特定值的变量存储在数据段中,未初始化的全局和静态变量存储在 BSS(由符号启动的块)中。在这种情况下,静态的 MyClass::counter 被编译器初始化为零,因此它存储在 BSS 中,初始化为 100 的 MyClass::number 存储在数据段中。我的结论正确吗?

Q3。考虑以下代码:

我希望我已经把我的问题告诉了所有人

编辑:

关于BSS的一些了解请参考这篇文章

EDIT1:将类名从 MyInstance 更改为 MyClass,因为它是一个糟糕的名字。真诚的歉意

EDIT2:将类成员变量编号从非静态更改为静态

0 投票
7 回答
221799 浏览

c - 基指针和栈指针到底是什么?他们指向什么?

使用来自维基百科的这个例子,其中 DrawSquare() 调用 DrawLine(),

替代文字

(请注意,此图底部的高地址和顶部的低地址。)

谁能解释我在这种情况下是什么ebp和是什么?esp

从我所看到的,我会说堆栈指针总是指向堆栈的顶部,而基指针指向当前函数的开头?要不然是啥?


编辑:我的意思是在 Windows 程序的上下文中

编辑2:以及如何eip工作呢?

edit3:我有以下来自 MSVC++ 的代码:

它们似乎都是双字,因此每个占用 4 个字节。所以我可以看到从 hInstance 到 var_4 的差距为 4 个字节。这些是什么?我假设它是返回地址,如维基百科的图片所示?


(编者注:从迈克尔的回答中删除了一个不属于问题的长引用,但编辑了一个后续问题):

这是因为函数调用的流程是:

我的问题(最后,我希望!)现在是,从我弹出要调用的函数的参数到序言结尾的那一刻到底发生了什么?我想知道 ebp,esp 在那些时刻是如何演变的(我已经了解了 prolog 的工作原理,我只想知道在我将参数推送到堆栈之后和 prolog 之前发生了什么)。

0 投票
4 回答
637 浏览

c++ - c/c++ 通过指针/参数通过引用堆栈帧布局传递参数

编译器会为这两个语句生成相同的代码吗?

它会简单地将指针写入 foo 堆栈帧的参数部分吗?或者,在第二种情况下,调用者和 foo 的堆栈帧是否会以某种方式重叠,使得调用者的局部变量在堆栈上占用与 foo 的参数相同的内存?

0 投票
3 回答
5508 浏览

assembly - 汇编中的堆栈/基指针

我知道这个话题已经在这里和互联网上的其他地方被报道过令人作呕- 但希望这个问题是一个简单的问题,因为我试图让我的头脑围绕组装......

因此,如果我理解正确,ebp(基本指针)将指向堆栈的顶部,而 esp(堆栈指针)将指向底部——因为堆栈向下增长。esp 因此指向“当前位置”。因此,在函数调用中,一旦您将 ebp 保存在堆栈上,您就会插入一个新的堆栈帧 - 用于该函数。因此,在下图中,如果您从 N-3 开始,您将通过函数调用转到 N-2。但是当你在 N-2 时 - 你的 ebp == 25 和 esp == 24 (至少在最初,在任何数据放入堆栈之前)?

这是正确的还是我在这里切线?

谢谢!

http://upload.wikimedia.org/wikipedia/en/a/a7/ProgramCallStack2.png
(来源:wikimedia.org

0 投票
2 回答
243 浏览

python - 在运行时识别 python 脚本行中的函数调用

我有一个使用“exec”运行的 python 脚本。当脚本调用函数时,我希望它知道该调用的行号和行中的偏移量。

这是一个例子。如果我的脚本是:

如果我有在每个函数中打印 (line,offset) 的代码,我应该得到

在大多数情况下,这可以通过获取堆栈帧轻松完成,因为它包含行号和函数名称。唯一的问题是在某一行中有两个同名的函数。不幸的是,这对我来说很常见。有任何想法吗?


好的,更改原始代码似乎是最简单的解决方案。

你将如何解决诸如

或者

对此有一些不太优雅的解决方案,例如,自动将前面的示例转换为:

如果您有更简单的想法,请告诉我。