问题标签 [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.
c - 是否可以在静态变量初始化之前对 gcc pre_init 函数执行 longjmp?
为了模拟应用程序的完全重启(GNU C 版本 4.1.2 (arm-linux-gnueabi)),包括静态变量初始化,我尝试根据请求将 jmp/longjmp 设置为 gcc pre_init 挂钩函数。longjmp 实际上到达了.preinit_array函数,但是在退出时它会与 SIGSEGV 一起崩溃。
知道为什么这会出错吗?这通常应该可行吗?在 gdbserver 的控制下,是否有其他方法可以将 Linux 应用程序回滚到其初始状态?
添加来源:
c++ - 为什么这个 setjmp 程序打印一个 5?
以下代码最终打印“5”
但这没有任何意义,因为 setjmp 返回 5,而不是任何一个函数......别担心,我没有在任何地方使用这段代码,我只是好奇!
c++ - 在 C ++ 接口中隐藏 longjmps 到 C 代码
为广泛使用 longjmp 和多个跳转目标进行错误管理的旧 C 代码生成 C++ API 的正确方法是什么?
我的想法是编写一个为每个使用的目标设置跳转目标的函数,例如:
然后我会调用catchJumps
每个使用 C 代码的 C++ 函数(在每个范围内,更具体地说):
这是在不破坏堆栈的情况下捕获所有跳远的安全方法吗?我知道,将 longjmp 放入不同的堆栈帧是很危险的。现在我的函数catchJumps
在另一个堆栈框架中,而不是在调用some_wrapper
. 我希望(或者我什至可以做到)catchJumps 可以内联,以便框架是相同的,但我不知道。
每个作用域中的调用(以及上面的循环之后)应该是调用作用域对象的所有析构函数所必需的,对吧?
如果这不是将 longjmps“转换”为调用应用程序的断言的有效方法,我们还能做什么?
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 也可能编译时有异常,但我不确定。
c - 两个独立的 jmp_bufs 是如何工作的?
嗨,我想问一下 setjmp/longjmp。我试图搜索,但我没有成功......
问题是,在 jump() 中的最后一个 printf 之后会发生什么......我尝试了这段代码,它变成了无限循环。为什么?我虽然 setjmp 将存储环境数据,所以跳转函数将在它的原始调用后返回......我很困惑。谢谢您的回复 :)
c - Longjmp 参数给出类型错误
我正在尝试调用 longjmp。Setjmp 有效,但 longjmp 给了我一个类型错误。
然后后来:
它给我的错误是warning: passing argument 1 of ‘longjmp’ makes pointer from integer without a cast
我真正想要的是保存寄存器的状态,然后再恢复它们。我认为我不需要使用论点来做到这一点。但我可能是错的。我不理解 setjmp。
编辑:更多代码
c - C 中的异常处理 - 使 try catch 跨函数工作
我正在用 C 编写一个异常处理库,但遇到了一个问题:
在我当前的 try catch throw 实现中,我将无法从 try 块内部调用的方法内部抛出异常,因为 jmp_buf 变量是本地变量。我怎样才能做到这一点?我考虑了一个全局变量,但这不允许我嵌套 try catch 块。
c - 用 C 编写我自己的 longjmperror()
我正在查看 longjmp 的手册,在错误部分中它说:
错误
如果 env 的内容已损坏,或对应于已返回的环境,longjmp() 例程将调用例程 longjmperror(3)。如果 longjmperror() 返回,则程序被中止(参见 abort(3))。longjmperror() 的默认版本将消息“longjmp botch”打印到标准错误并返回。 希望更优雅地退出的用户程序应该编写自己的 longjmperror() 版本。
我将如何编写自己的 longjmperror 版本?据我所知,你不能覆盖函数,当它找不到跳转点时,我真的需要跳远以特定方式退出。
linux - 如何在 gcc 中恢复堆栈帧?
我想建立自己的检查点库。我可以将堆栈帧保存到调用 checkpoint_here(stack pointer) 的文件中,以后可以通过调用 recover(stack pointer) 函数来恢复。
这是我的问题:我能够从函数 recover(sp) 跳转到 main(),但是堆栈帧被改变了(堆栈指针,帧指针)。所以我想在checkpoint_here(sp)调用保留main()的堆栈帧之后从recover(sp)跳转到main。我试过 setjmp/longjmp 但不能让它们工作。谢谢期待。
gdb - 堆栈从堆栈中间展开
我正在学习 gdb 调试器,我无法回答的一个问题是:新函数调用导致为它们分配额外的堆栈帧,并且调用堆栈向下增长;堆栈帧被释放并返回到未使用的内存。是否有可能删除堆栈中间的帧并返回内存?go to statement 或 longjmp 函数可以实现吗?
非常感谢。