问题标签 [setjmp]

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

c - 是否可以在静态变量初始化之前对 gcc pre_init 函数执行 longjmp?

为了模拟应用程序的完全重启(GNU C 版本 4.1.2 (arm-linux-gnueabi)),包括静态变量初始化,我尝试根据请求将 jmp/longjmp 设置为 gcc pre_init 挂钩函数。longjmp 实际上到达了.preinit_array函数,但是在退出时它会与 SIGSEGV 一起崩溃。

知道为什么这会出错吗?这通常应该可行吗?在 gdbserver 的控制下,是否有其他方法可以将 Linux 应用程序回滚到其初始状态?

添加来源:

0 投票
3 回答
140 浏览

c++ - 为什么这个 setjmp 程序打印一个 5?

以下代码最终打印“5”

但这没有任何意义,因为 setjmp 返回 5,而不是任何一个函数......别担心,我没有在任何地方使用这段代码,我只是好奇!

0 投票
2 回答
241 浏览

c++ - 在 C ++ 接口中隐藏 longjmps 到 C 代码

为广泛使用 longjmp 和多个跳转目标进行错误管理的旧 C 代码生成 C++ API 的正确方法是什么?

我的想法是编写一个为每个使用的目标设置跳转目标的函数,例如:

然后我会调用catchJumps每个使用 C 代码的 C++ 函数(在每个范围内,更具体地说):

这是在不破坏堆栈的情况下捕获所有跳远的安全方法吗?我知道,将 longjmp 放入不同的堆栈帧是很危险的。现在我的函数catchJumps在另一个堆栈框架中,而不是在调用some_wrapper. 我希望(或者我什至可以做到)catchJumps 可以内联,以便框架是相同的,但我不知道。

每个作用域中的调用(以及上面的循环之后)应该是调用作用域对象的所有析构函数所必需的,对吧?

如果这不是将 longjmps“转换”为调用应用程序的断言的有效方法,我们还能做什么?

0 投票
2 回答
400 浏览

objective-c - Objective-C ARC 和 longjmp

将 Objective-C ARC 与 混合的最佳实践是什么longjmp

我使用 Lua 作为脚本语言,我的平台为脚本导出自定义库。入口点确实使用luaL_checkinteger(L, 2)(以及其他)检查参数,这反过来可能会调用luaL_typerror(L, 2, ...),这是在 Lua 中使用setjmp/实现的longjmp。据我所知,ARC 只是自动生成retain/release代码,但是如果longjmp超出范围会发生什么?此代码是否会因输入错误的参数而泄漏?

在上面的代码片段中,control将被 ARC 临时保留,但具有longjmp不可捕获的性质,相应的释放调用可能永远不会发生。另一方面,可以在分配给变量之前检查所有参数。control

它是否解决了上面的[潜在]泄漏?有没有更好的方法来做到这一点?

更新:longjmp只展开到 Lua 内部,从不跨越任何系统代码,除了 Lua 源(知道)和我的入口点(我希望知道)。

我很确定第二个片段是正确的,但我需要一种正式的证明。


最新更新:

LuaJIT 实现了与 dwarf2 兼容的错误,因此它们就像 C++ 异常一样。使用 Lua 代码将编译器标志传递-fobjc-arc-exceptions给启用 arc 的源,并且任何保留的对象都将在任何lua_error. 现在没什么好担心的!不过,您仍然不允许在 Cocoa 运行时抛出错误。

我记得原来的 Lua 也可能编译时有异常,但我不确定。

0 投票
1 回答
58 浏览

c - 两个独立的 jmp_bufs 是如何工作的?

嗨,我想问一下 setjmp/longjmp。我试图搜索,但我没有成功......

问题是,在 jump() 中的最后一个 printf 之后会发生什么......我尝试了这段代码,它变成了无限循环。为什么?我虽然 setjmp 将存储环境数据,所以跳转函数将在它的原始调用后返回......我很困惑。谢谢您的回复 :)

0 投票
0 回答
105 浏览

c - Longjmp 参数给出类型错误

我正在尝试调用 longjmp。Setjmp 有效,但 longjmp 给了我一个类型错误。

然后后来:

它给我的错误是warning: passing argument 1 of ‘longjmp’ makes pointer from integer without a cast

我真正想要的是保存寄存器的状态,然后再恢复它们。我认为我不需要使用论点来做到这一点。但我可能是错的。我不理解 setjmp。

编辑:更多代码

0 投票
2 回答
309 浏览

c - C 中的异常处理 - 使 try catch 跨函数工作

我正在用 C 编写一个异常处理库,但遇到了一个问题:

在我当前的 try catch throw 实现中,我将无法从 try 块内部调用的方法内部抛出异常,因为 jmp_buf 变量是本地变量。我怎样才能做到这一点?我考虑了一个全局变量,但这不允许我嵌套 try catch 块。

0 投票
1 回答
215 浏览

c - 用 C 编写我自己的 longjmperror()

我正在查看 longjmp 的手册,在错误部分中它说:

错误

如果 env 的内容已损坏,或对应于已返回的环境,longjmp() 例程将调用例程 longjmperror(3)。如果 longjmperror() 返回,则程序被中止(参见 abort(3))。longjmperror() 的默认版本将消息“longjmp botch”打印到标准错误并返回。 希望更优雅地退出的用户程序应该编写自己的 longjmperror() 版本。

我将如何编写自己的 longjmperror 版本?据我所知,你不能覆盖函数,当它找不到跳转点时,我真的需要跳远以特定方式退出。

0 投票
1 回答
626 浏览

linux - 如何在 gcc 中恢复堆栈帧?

我想建立自己的检查点库。我可以将堆栈帧保存到调用 checkpoint_here(stack pointer) 的文件中,以后可以通过调用 recover(stack pointer) 函数来恢复。

这是我的问题:我能够从函数 recover(sp) 跳转到 main(),但是堆栈帧被改变了(堆栈指针,帧指针)。所以我想在checkpoint_here(sp)调用保留main()的堆栈帧之后从recover(sp)跳转到main。我试过 setjmp/longjmp 但不能让它们工作。谢谢期待。

0 投票
1 回答
264 浏览

gdb - 堆栈从堆栈中间展开

我正在学习 gdb 调试器,我无法回答的一个问题是:新函数调用导致为它们分配额外的堆栈帧,并且调用堆栈向下增长;堆栈帧被释放并返回到未使用的内存。是否有可能删除堆栈中间的帧并返回内存?go to statement 或 longjmp 函数可以实现吗?

非常感谢。