问题标签 [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 - 为什么 setjmp 传统上会保存寄存器?
仅以 i386 为例,但类似的问题也适用于其他拱门。传统的 i386jmp_buf
保存的setjmp
由 6 个保存的寄存器组成:ebx
、esi
、edi
、ebp
、esp
和eip
. 其中,前 4 个是根据 ABI 调用者保存的,因此调用的函数setjmp
本身会用自己保存的值覆盖它们(这可能在第一次和第二次 return from 之间发生变化setjmp
)。因此,将这些寄存器保存在 中的意义jmp_buf
何在?只保存堆栈和指令指针不是也一样吗?
编辑:我错误地混淆了调用者保存和被调用者保存,这是混乱的全部来源。抱歉浪费了大家的时间。
lua - 如何执行 lua_pushstring 并避免内存不足 setjmp 异常
有时,在分配了一些资源后,我想在某些地方使用 lua_pushstring,以防万一失败。但是,正如文档似乎暗示的那样,lua_push* 函数总是会以内存不足异常结束。但是该异常会立即退出我的 C 范围,并且不允许我清理我可能临时分配的任何内容,这些内容可能必须在出现错误时释放。
示例代码来说明情况:
有没有一种方法可以预先检查是否会发生这种异常,然后在我安全地清理自己的资源后避免推送和执行我自己的错误触发?或者我可以以某种方式简单地停用 setjmp,然后在推送后检查一些“魔术变量”以查看它是否真的有效或触发了错误?
我考虑过 pcall'ing 我自己的函数,但即使只是将我想通过 pcall 安全调用的函数推入堆栈也可能让我内存不足,不是吗?
为了澄清问题,我特别要求将其与自定义内存分配器结合使用,以防止 Lua 分配过多内存,因此假设这不是整个系统内存不足的情况。
c - 非本地跳转是否存在性能问题?
我正在使用非本地跳转(setjmp
, longjmp
)。我想知道这是否会给表演带来问题。setjmp
是保存所有堆栈,还是只保存一些指针?
谢谢。
c - setjmp/longjmp 失败
一段代码在这里
结果是:
切换
分段故障 后出现
错误1
我知道可能 longjmp 跳回前一个堆栈的原因。但我不确定细节,“标记”中存储了什么样的值,谁能解释一下?
x86-64 - 为什么 setjmp(3) 不保存 AMD64 上的所有寄存器?
我浏览了各种实现的源代码,setjmp
并longjmp
注意到并非所有 CPU 寄存器都保存在jmp_buf
结构中。查看 AMD64 ABI 后,我注意到只保存了被调用者保存的寄存器。
我不明白仅保存一些寄存器时如何完全恢复功能状态。当然,在我稍后打电话之前,未保存的寄存器肯定已经被多次破坏了longjmp
?
然而,一切都很完美,所以肯定有一些我不明白的地方。我希望有人可以对此有所了解。
谢谢!
c++ - 在多个文件中使用 jmp_buf
为了清楚起见,请查看我的示例
我有两个文件:main.cpp 和 myfunction.h
这是 main.cpp
这是 myfunction.h
现在,我想要我的屏幕打印“1”,然后打印“2”,但这段代码不正确!请帮我!非常感谢!
c - 带有开始和结束标签的 C 宏?
我刚开始阅读这篇关于在 c 中使用 setjmp( jmp_buf ) 和 longjmp( jmp_buf, int ) 处理异常的文章。因此,我基本上构建了使用 xRecord 类型的局部变量的链接列表并将其链接到列表。(示例2)它工作得很好。但在示例 3 中,这些步骤被总结为宏(XTRY 和 XEND)。最让我恼火的是,示例 2 的实际 switch 语句只是在 3 中“消失”了。
示例 2:
示例 3:
我的问题是,如何构建这些“打开和关闭”宏?
c - 我的退出(状态)与 setjmp 和 longjmp
问题是 - 我必须使用 setjmp 和 longjmp 实现我自己的退出(状态)。也许有人可以指点一下?
c++ - 使用 longjmp 的 C++ 和 C 库
我正在使用 Lua,它有一个 C API,它的错误引发函数使用 longjmps。当引发错误时,我首先构建一条消息来描述发生了什么问题,然后告诉 Lua 引发错误。例如
我的理解是 longjmp 不会展开堆栈,因此我的stringstream
对象不会被破坏。如果我没记错的话,stringstream
其他 C++ 库类通常会在堆上分配数据,当对象被销毁时会释放这些数据。但是,这里不会调用析构函数,所以我认为这会导致内存泄漏。根据编写脚本的人,我可能会引发很多错误,从而泄漏大量内存。
我确信其他人需要解决与此类似的问题,但我找不到任何我所追求的东西。很多地方说对象不会被破坏,但我认为必须有一种方法来确保内存被释放?
c - C语言中setjmp和longjmp的实际使用
谁能解释我在嵌入式编程中实际使用的确切位置setjmp()
和功能?longjmp()
我知道这些是用于错误处理的。但我想知道一些用例。