问题标签 [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.
java - 当一种语言不支持析构函数时,如何对堆栈展开做出反应?
假设您已经创建了一个Window
类的实例。该窗口显示给用户。然后,抛出异常,对实例的引用丢失,但用户仍然可以看到窗口,因为实例仍然存在(只是不再被引用)。
在这些情况下该怎么办?
我专门讨论的是 Squirrel 脚本语言 (http://www.squirrel-lang.org/)。与Java相反,它似乎没有finally
块或终结器方法,那么这种语言中的异常处理是否被破坏了?
c++ - 使用 Lua 时在 C++ 中展开堆栈
我最近偶然发现了这个 C++/Lua 错误
错误在于luaL_error
use longjmp
,因此堆栈永远不会展开,s
也永远不会被破坏,导致内存泄漏。还有一些 Lua API 无法展开堆栈。
一个明显的解决方案是在 C++ 模式下编译 Lua,但有异常。然而,我不能,因为 Luabind 需要标准的 C ABI。
我目前的想法是编写自己的函数来模仿 Lua API 的麻烦部分:
所以我的问题是:function_for_lua
的堆栈是否正确展开。会出什么问题吗?
c++ - 如何检测析构函数中的堆栈展开
我有一个简单的 C++ 对象,我在函数 F() 的开头创建它,以确保在 F() 的开头和返回时调用两个匹配的函数(OpDo、OpUndo),方法是使用对象的构造函数和析构函数。但是,我不希望在 F() 的主体内引发异常的情况下撤消该操作。这可以干净地做吗?我已阅读有关std::uncaught-exception 的信息,但似乎不推荐使用它。
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 错误。有没有办法在配置时强制提供这些信息?
ruby - 如何在没有 catch/try/raise 的情况下展开(多级返回)堆栈?
我想在catch
/try
不可用时将堆栈展开到任意级别(即,我要展开的代码不受我的控制)。这可能吗?
例如,在测试中,我想让我的测试调用一个检查先决条件的方法,如果不满足这些先决条件,则将其展开给测试的调用者(在 恢复caller[1]
)。由于测试工具超出了我的控制范围,因此我无法catch
在适当的位置设置块。
stack-unwinding - 使用 dwarf2 展开堆栈时获取堆栈指针的值
在 DWARF2 调试格式中,借助 .debug_frame 部分中的 CFI(调用帧信息)支持堆栈展开。这正是一个表格,它为每个寄存器在前一帧中获取其值保留了一条规则。但是,所有这些规则都依赖于寄存器保存在堆栈中某个位置的事实。当没有帧指针时,这对于在前一帧寄存器中获取堆栈指针的值是不正确的。在这种情况下,堆栈指针可能不会保存在堆栈上,而只是通过递增和递减其值来管理。但是,在 dwarf2(或一般的 dwarf 格式)中没有办法表明寄存器值是其当前值的表达式。所以,我的问题是,如何在使用 dwarf2 调试格式的堆栈展开期间获取堆栈指针的值(当没有帧指针时)。
-BV
debugging - dwarf2中的堆栈展开
我不明白 dwarf2 中的堆栈展开如何确保在一些非常基本的 ABI(应用程序二进制接口)场景中可靠地恢复参数。考虑一个 ABI,它表示前三个参数必须在寄存器上并且在堆栈上。据我了解,dwarf2 堆栈展开机制确保如果 CFI 表被正确填充,则可以在当前帧的调用点获取寄存器的值。但是,这并不能让您进入调用者的序言并知道参数寄存器的内容是什么。所以,我认为应该有一种方法可以在不同点的同一帧中找到寄存器的值(在 .debug_frame 部分中编码的表只给出了前一帧中的位置)。
我的理解有什么问题吗?在这种情况下,基于 dwarf2 调试格式的调试器如何工作?对于在堆栈上传递参数的架构,恢复程序中所有点的值(对于任何帧)不会有任何问题。
c++ - 堆栈展开后的指针有效性
在 C++ 中,堆栈展开后指针是否仍然有效?