问题标签 [stack-unwinding]

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 回答
319 浏览

java - 当一种语言不支持析构函数时,如何对堆栈展开做出反应?

假设您已经创建了一个Window类的实例。该窗口显示给用户。然后,抛出异常,对实例的引用丢失,但用户仍然可以看到窗口,因为实例仍然存在(只是不再被引用)。

在这些情况下该怎么办?

我专门讨论的是 Squirrel 脚本语言 (http://www.squirrel-lang.org/)。与Java相反,它似乎没有finally块或终结器方法,那么这种语言中的异常处理是否被破坏了?

0 投票
1 回答
1267 浏览

c++ - 使用 Lua 时在 C++ 中展开堆栈

我最近偶然发现了这个 C++/Lua 错误

错误在于luaL_erroruse longjmp,因此堆栈永远不会展开,s也永远不会被破坏,导致内存泄漏。还有一些 Lua API 无法展开堆栈。

一个明显的解决方案是在 C++ 模式下编译 Lua,但有异常。然而,我不能,因为 Luabind 需要标准的 C ABI。

我目前的想法是编写自己的函数来模仿 Lua API 的麻烦部分:

所以我的问题是:function_for_lua的堆栈是否正确展开。会出什么问题吗?

0 投票
3 回答
1131 浏览

c++ - 如何检测析构函数中的堆栈展开

我有一个简单的 C++ 对象,我在函数 F() 的开头创建它,以确保在 F() 的开头和返回时调用两个匹配的函数(OpDo、OpUndo),方法是使用对象的构造函数和析构函数。但是,我不希望在 F() 的主体内引发异常的情况下撤消该操作。这可以干净地做吗?我已阅读有关std::uncaught-exception 的信息,但似乎不推荐使用它。

0 投票
1 回答
506 浏览

porting - 你如何在 i386 FreeBSD 上构建 libunwind?

libunwind 在 FreeBSD 8.1 amd64 上作为一个包 (pkg_add -r libunwind) 提供。

它在 FreeBSD 8.1 i386 上不可用。

当我从http://www.nongnu.org/libunwind/下载时,我无法构建它。

错误是在 ptrace/_UPT_elf.c:4: ../include/libunwind_i.h:65:5: error: #error Host has unknown byte-order 中包含的文件中。 *错误代码 1

这似乎是一个 ./configure 错误。有没有办法在配置时强制提供这些信息?

0 投票
1 回答
606 浏览

ruby - 如何在没有 catch/try/raise 的情况下展开(多级返回)堆栈?

我想在catch/try不可用时将堆栈展开到任意级别(即,我要展开的代码不受我的控制)。这可能吗?

例如,在测试中,我想让我的测试调用一个检查先决条件的方法,如果不满足这些先决条件,则将其展开给测试的调用者(在 恢复caller[1])。由于测试工具超出了我的控制范围,因此我无法catch在适当的位置设置块。

0 投票
3 回答
783 浏览

stack-unwinding - 使用 dwarf2 展开堆栈时获取堆栈指针的值

在 DWARF2 调试格式中,借助 .debug_frame 部分中的 CFI(调用帧信息)支持堆栈展开。这正是一个表格,它为每个寄存器在前一帧中获取其值保留了一条规则。但是,所有这些规则都依赖于寄存器保存在堆栈中某个位置的事实。当没有帧指针时,这对于在前一帧寄存器中获取堆栈指针的值是不正确的。在这种情况下,堆栈指针可能不会保存在堆栈上,而只是通过递增和递减其值来管理。但是,在 dwarf2(或一般的 dwarf 格式)中没有办法表明寄存器值是其当前值的表达式。所以,我的问题是,如何在使用 dwarf2 调试格式的堆栈展开期间获取堆栈指针的值(当没有帧指针时)。

-BV

0 投票
3 回答
647 浏览

c++ - 抛出 boost::shared_ptr<customException>

是否存在以下陷阱;

0 投票
1 回答
672 浏览

debugging - dwarf2中的堆栈展开

我不明白 dwarf2 中的堆栈展开如何确保在一些非常基本的 ABI(应用程序二进制接口)场景中可靠地恢复参数。考虑一个 ABI,它表示前三个参数必须在寄存器上并且在堆栈上。据我了解,dwarf2 堆栈展开机制确保如果 CFI 表被正确填充,则可以在当前帧的调用点获取寄存器的值。但是,这并不能让您进入调用者的序言并知道参数寄存器的内容是什么。所以,我认为应该有一种方法可以在不同点的同一帧中找到寄存器的值(在 .debug_frame 部分中编码的表只给出了前一帧中的位置)。

我的理解有什么问题吗?在这种情况下,基于 dwarf2 调试格式的调试器如何工作?对于在堆栈上传递参数的架构,恢复程序中所有点的值(对于任何帧)不会有任何问题。

0 投票
3 回答
1789 浏览

c++ - RAII 和堆栈展开

直到我对 RAII 和堆栈展开的“相互缠绕”(因为没有更好的词)的概念是/完全(如果不是完全)错误的。我的理解是,使用 RAII 可以防止任何/所有资源泄漏——甚至可能是由未处理的异常引起的。

然而,编写这个测试程序并随后偶然发现这篇文章/文档,让我意识到堆栈展开只会导致启用 RAII 的资源释放在 try 块内启动,而不是自动在外部/其他范围内.

我对这个(新的)理解是否正确?还是我还没有掌握更多的细微差别?有哪位大师想插话吗?任何好的文章/分析/解释(堆栈展开)的指针都会有所帮助/赞赏......</p>

0 投票
5 回答
434 浏览

c++ - 堆栈展开后的指针有效性

在 C++ 中,堆栈展开后指针是否仍然有效?