问题标签 [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.
c++ - 如何读取发送到另一个堆栈帧中的方法的参数?
我正在尝试读取参数值和类型,因为它们在调用堆栈中被发送到我之前的方法。
我读过你不能这样做,.Net
所以我环顾四周,发现这个类应该为我提供我需要的值:http: //msdn.microsoft.com/en-us/library/ms230165% 28v=vs.110%29.aspx
不幸的是,我找不到一种方法来编译我的 C++ 项目,而不会因为包含cordebug.h
标头而导致许多语法错误。
有谁知道如何正确使用这个类或有任何其他解决方案?
x86 - 为什么静态函数有时会有非标准堆栈帧?
在 wikibookx86 Disassembly
中,写到有时存在不设置标准堆栈帧的子例程。一种这样的情况是当我们在 C 中声明一个静态函数时。以下几行已经写在书中。
When an optimizing compiler sees a static function that is only referenced by calls (no references through function pointers), it "knows" that external functions cannot possibly interface with the static function (the compiler controls all access to the function), so the compiler doesn't bother making it standard
.
我对上述陈述有以下疑问:
- 外部函数是否可以使用函数指针引用静态函数?如果是,如何?为什么允许?(我问这个是因为据我所知,静态函数具有本地范围,并且不能被任何外部函数访问)?
- 非标准堆栈帧是什么意思?非标准堆栈帧与标准堆栈帧有何不同?欢迎使用汇编代码进行解释:)
编辑:另一个我想回答的问题:为什么上述情况下的编译器设置非标准堆栈框架而不是标准堆栈框架?
assembly - 使用具有非零嵌套级别的 x86 的 ENTER 指令?
考虑 x86 指令ENTER
。来自英特尔的指令集参考。
为过程创建堆栈帧。第一个操作数(大小操作数)指定堆栈帧的大小(即在堆栈上为过程分配的动态存储的字节数)。第二个操作数(嵌套级别操作数)给出了过程的词法嵌套级别(0 到 31)。嵌套级别决定了从前一帧复制到新堆栈帧的“显示区域”的堆栈帧指针的数量。这两个操作数都是立即数。
我想知道ENTER
当非零嵌套级别作为第二个操作数传递时指令是如何工作的。在这种情况下,根据英特尔的手册,处理器应该将额外的帧指针压入堆栈。听起来很简单,但我不明白为什么它在示例程序上不能按预期工作。
我使用 FASM 编译了以下示例并使用 OllyDbg 进行了调试。
该ENTER
指令发出的堆栈帧如下所示。
结果很奇怪。让我们用 gcc 做同样的事情。
呃,好吧……
我可能误解了它应该如何工作。我唯一的猜测是该ENTER
指令是由操作系统以某种方式处理的,但这几乎肯定是错误的。
gcc - 使用 -O* 时如何在 GCC 中禁用 RBP 帧指针寄存器优化?
当我gcc -O2
用来优化我的程序时,gcc 会改变寄存器 RBP 的值。但我想将其保留为 FRAME BASE REGISTER,如何做到这一点?
与以下问题不同:GCC:禁止使用某些寄存器
java - Java 堆和栈
由于我无法参加已解释该主题的课程,因此我对以下练习有疑问。我试图通过 youtube 上的一些视频来帮助自己,但这并没有真正让我对自己的结果充满信心。如果有人帮助我,我将非常感激。
给出了以下 Java 代码:
a) 调查给定程序中存在的所有变量和函数参数,无论它们是放在堆上还是在栈上。
b) 概述函数 f 开始后堆栈的状态。
我得到以下结果:
a)n,m,v:堆栈。args[] :堆。
b) 我不确定。我想在这里做一些解释:/
提前致谢!
我无法将问题标记为作业,抱歉。
c - 如果该函数没有真正提供一个函数调用的返回值是多少
假设我们有以下代码:
它将在我的计算机上打印一些字符串值 -1679929632。当我执行时,它会不时改变。
谁能解释为什么会这样?
c - C 中的可移植函数(无汇编),返回其堆栈帧的大小
用 C 编写一个可移植函数(无需汇编),返回其堆栈帧的大小
尝试如下解决 - 使用 VS 2010 编译时,此函数返回 228 个字节。有没有办法验证它的正确性?
调用为:
c# - StackFrame of an Iterator Block in C#
I am using an iterator block as coroutine, that is, I have an enumerator IEnumerator e; e was initialized, and in the middle of an iterator block, yield return 1; was used to hold the execution of the coroutine temporarily.
For the purpose of debugging, it is desirable to get where e was yielded, i.e., the stack frame of e. It may be viewed in the debugger, or it may be logged for future inspection.
But all I have is IEnumerator interface, which has only three methods and one property. And I can't figure out how to relate them to, say, System.Diagnostics.StackTrace.
Is it possible, or should it be possible?
EDIT: After immediately receiving two comments clearing up my question I really want to ask, the correct question is:
You have a yielded IEnumerator e. Is there a way to get, for mostly debugging purpose, as much info as possible on what would be the resumed state? The MethodBase together with file name and line number would be perfect.
c# - 如何将 StackFrame 集合转换为字符串?
我有一个IEnumerable<System.Diagnostics.StackFrame> frames
用于存储一些自定义 StackFrame。我想将其转换为StackTrace.ToString()
格式之类的字符串类型。例如:
c - 静态全局变量与全局变量 C
我有下面的程序。如果我声明变量 a、b、c 静态全局变量,它会给出分段错误,但如果我将它们声明为非静态全局变量或局部变量,它不会给出分段错误。为什么它会以这种方式表现?我知道变量可以存储的数据多于变量可以存储的数据,但是为什么只有声明为静态时它会给出段错误?静态声明的变量是否存储在不允许覆盖的堆栈帧的某些不同部分?
编辑:我知道 strcpy 不安全。但这不是我的问题。我想了解为什么一个溢出会产生段错误,为什么另一个溢出可能不会产生段错误。