问题标签 [callstack]

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 投票
3 回答
2981 浏览

.net - 在 .net 中以编程方式访问调用堆栈

如何以编程方式访问调用堆栈?

0 投票
3 回答
2923 浏览

c++ - 如何在 Visual Studio 2005 中获得完整的调用堆栈?

如何获得使用 Visual Studio 2005 开发的 c++ 应用程序的完整调用堆栈?我想要一个完整的调用堆栈,包括系统库中的代码。

我是否必须更改 Visual Studio 中的某些设置,还是必须安装其他软件?

0 投票
7 回答
10826 浏览

c - 在编译时检查堆栈使用情况

有没有办法在 C 编译时知道并输出函数所需的堆栈大小?这是我想知道的:

让我们采取一些功能:

编译此函数时,我想知道调用它时会消耗多少堆栈空间。这对于检测隐藏大缓冲区的结构的堆栈声明可能很有用。

我正在寻找可以打印这样的东西:

文件 foo.c : 函数 foo 堆栈使用是n字节

有没有办法不查看生成的程序集来知道这一点?或者可以为编译器设置的限制?

更新:我不是试图避免给定进程的运行时堆栈溢出,我正在寻找一种在运行前查找的方法,如果编译器确定的函数堆栈使用情况可用作编译过程的输出。

让我们换一种说法:是否有可能知道函数本地所有对象的大小?我猜编译器优化不会是我的朋友,因为一些变量会消失,但一个更好的限制是好的。

0 投票
6 回答
11375 浏览

debugging - 运行时调用堆栈

我想在本机 C++ 应用程序中在运行时访问调用堆栈。我没有使用 IDE。如何显示调用堆栈?

更新:我有一个从整个应用程序的许多点调用的函数。它在极少数情况下崩溃。我正在寻找一种方法来获取呼叫者的姓名并将其记录下来。

0 投票
3 回答
686 浏览

java - Java:Eclipse - 差异跟踪

我有一个带有 JUnit 测试的项目的两个版本。查看文件的差异并没有明显的原因,但是测试通过了一个项目,但没有通过另一个项目。

一段时间以来,我一直想知道是否有一个程序可以在运行时记录整个程序的跟踪并将其保存到文件中。这对于这个确切的例子来说真的很方便,我想通过两个测试进行跟踪,然后我想把它们放在一起。

任何人都可以向我指出可能能够做到这一点的程序的方向,或者我可以区分两个程序的流程的方式吗?

干杯

0 投票
5 回答
15979 浏览

vb6 - 是否可以在 VB6 中以编程方式检索调用堆栈?

当函数中发生错误时,我想知道导致错误的事件顺序,尤其是当从十几个不同的地方调用该函数时。有什么方法可以在 VB6 中检索调用堆栈,还是我必须以艰难的方式进行(例如,每个函数和错误处理程序中的日志条目等)?

0 投票
3 回答
6240 浏览

c++ - 你如何让 StackWalk64() 在 x64 上成功运行?

我有一个 C++ 工具,它可以一次遍历调用堆栈。在代码中,它首先获取实时 CPU 寄存器的副本(通过 RtlCaptureContext()),然后使用一些 " #ifdef ..." 块将 CPU 特定的寄存器名称保存到stackframe.AddrPC.Offset、 ... AddrStack... 和 ... 中AddrFrame。 ..; 此外,对于上述 3 个Addr... 成员中的每一个,它都设置了stackframe.Addr... .Mode = AddrModeFlat。(这是从我不久前遇到的一些示例代码中借来的。)

使用 x86 二进制文件,这很好用。但是,对于 x64 二进制文件,StackWalk64() 会传回虚假地址。 (第一次调用 API 时,唯一公然伪造的地址值出现在AddrReturn(== 0xFFFFFFFF'FFFFFFFE-- aka StackWalk64() 的第三个参数,GetCurrentThread() 返回的伪句柄)中。如果第二次调用 API ,但是,所有Addr... 变量都会收到虚假地址。) 无论如何AddrFrame设置都会发生这种情况:

  • 使用任一推荐的 x64“基/帧指针”CPU 寄存器:rbp(= 0xf) 或rdi(= 0x0)
  • 使用rsp (没想到它会起作用,但还是尝试了)
  • 设置AddrPCAddrStack正常,但保持AddrFrame归零(在其他示例代码中看到)
  • 清零所有Addr... 值,让 StackWalk64() 从传入的 CPU 寄存器上下文中填充它们(在其他示例代码中看到)

FWIW,物理堆栈缓冲区的内容在 x64 和 x86 上也不同(当然,在考虑了不同的指针宽度和堆栈缓冲区位置之后)。不管是什么原因, StackWalk64() 应该仍然能够正确地遍历调用堆栈——哎呀,调试器仍然能够遍历调用堆栈,而且它似乎在幕后使用 StackWalk64() 本身。奇怪的是,调试器报告的(正确的)调用堆栈包含基地址和返回地址指针值,其组成字节实际上并不存在于堆栈缓冲区中(低于或高于当前堆栈指针)。

(FWIW #2:鉴于上面的堆栈缓冲区奇怪,我确实尝试禁用 ASLR ( /dynamicbase:no) 以查看它是否有所作为,但二进制文件仍然表现出相同的行为。)

所以。任何想法为什么这在 x86 上可以正常工作,但在 x64 上会出现问题?关于如何修复它的任何建议?

0 投票
5 回答
2591 浏览

c++ - 使用堆栈将成员变量重置为其原始值的一般方法?

我遇到了一个类实例函数,它需要临时更改一个类实例变量,然后在函数完成时恢复它。该函数到处都有返回语句,并且在每次返回之前都有一个恢复语句。这对我来说似乎很乱,更不用说抛出异常时的可怕了。

作为改进,我使用内部类定义提出了这种概括。这是一个示例驱动程序(类恢复器)。

使用 g++ 4.2.3 (-Wall) 的输出是:

这是我对“b end”的期望。

我觉得在 Unwind 类中定义类恢复器有助于阻止滥用。

我的问题是,是否有一种通用且更安全的方法来做到这一点?我担心一生的问题。

编辑:请假设没有线程,但堆栈上的“下游”方法会根据此 b_active_ 标志更改行为。

0 投票
7 回答
91346 浏览

objective-c - 如何将堆栈跟踪打印到控制台/登录 Cocoa?

我想在某些时间点记录调用跟踪,例如失败的断言或未捕获的异常。

0 投票
8 回答
37637 浏览

perl - 如何在 Perl 中获取调用堆栈列表?

有没有一种方法可以访问(用于打印输出)子 + 模块列表到 Perl 脚本中当前位置之前的任意深度的子调用?

我需要对一些 Perl 模块 (.pm's) 进行更改。工作流程通过 cgi 脚本从网页启动,通过几个模块/对象传递输入,这些模块/对象以我需要使用数据的模块结尾。沿着这条线的某个地方,数据发生了变化,我需要找出在哪里。