问题标签 [ucontext]
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++ - setcontext 和 makecontext 调用通用函数指针
在另一个问题中,我在移植代码时遇到了问题:
对于 64 位平台,许多人告诉我,由于 32 位和 64 位之间的调用转换差异以及可移植性问题,我应该使用setcontext()和makecontext()函数集。
好吧,我真的在网上找不到任何有用的文档,或者至少不是我需要实现的那种,所以,我怎样才能使用这些函数将参数压入堆栈,调用泛型函数指针,获取返回值然后恢复寄存器?
c++ - makecontext()/swapcontext() 函数是否与 C++ 兼容
在 unix 环境中makecontext()/swapcontext()
,函数族有时用于在 C 中实现协程。然而,这些函数直接操作堆栈和执行流程。通常,当从 C 切换到 C++ 时,这些低级功能完全不同。
makecontext()
所以问题是,如果使用and实现协程会有任何问题swapcontext()
。当然,显然必须非常小心,异常永远无法逃脱这样的协程,因为堆栈上没有异常处理程序,并且程序很可能会出现段错误。但除此之外,C++ 内部处理事物的方式makecontext()
与setcontext()
修改执行路径之间是否存在不兼容?
c - 为什么将 ucontext 添加到 POSIX,然后从 POSIX 中删除?
据我所知,ucontext
提供更好的东西setjmp
。但它已被弃用,现在已从 POSIX 规范中删除。那么它为什么会出现,又为什么会被移除呢?
c - 使用 getcontext/setcontext 向上/向下切换堆栈
我试图了解 getcontext/setcontext 在特定情况下是否可以正常工作。
我可以看到如何使用 setcontext() 将堆栈展开回历史中的某个位置。
但我想知道放松后是否可以重新回到未来的某个地方?我想这取决于getcontext()
调用捕获堆栈的副本,我在文档中找不到确切的详细信息。
c - 使用 SIGALRM 切换线程上下文
我有个问题。我需要实现一个使用计时器和 SIGALRM 切换 ucontext 线程的程序,但是当我使用 evict_thread 函数切换线程时出现分段错误。我相信这是竞争条件的结果,因为它发生在程序执行期间的不同时间。这是我的 evict_thread
上述函数的调用方式如下
运行队列只是一个全局整数列表,它们是指向 ucontext 线程的全局指针表的索引。该列表是使用来自 libslack.org 的 C 通用实用程序库中的列表数据结构实现的
当我禁用计时器并让每个线程在切换上下文之前运行完成时,程序会正常运行,但是当线程在执行期间切换时,大约 80% 的时间会出现分段错误。
此外,当我尝试使用 gdb 回溯分段错误时,它说它发生在系统调用中。
c - 使用带有 SIG_INFO 的 sigaction 处理程序的第三个参数(void* context)会导致分段错误
我已将产生问题的巨大光纤调度程序代码减少到以下几行。
我期望的是每次都干净地返回上下文,传递给处理程序。
我得到的是“处理程序”。打印了三遍,然后是分段错误。
在两个不同的 Linux 发行版上同时使用 gcc-4.4.3 和 gcc-4.4.5。
c - getcontext 和 setcontext 在函数中不起作用
我正在尝试复制一个线程的上下文,包括堆栈以创建一个检查点,稍后我可以恢复该检查点。出于这个原因,我试图将 getcontext 和 setcontext 的调用移动到一个也保存堆栈的函数中,但这不起作用。
来自维基百科的工作示例:
这只是重复打印“Hello world”。
我想做类似的事情:
但这只会打印一次“Hello world”并退出。
现在我被困住了。提前致谢。
c - 在linux中检索EBP寄存器的内容
我需要 EBP/RBP 的内容来检索函数的返回地址。此地址应位于堆栈帧内的位置 8(%RBP)(我们仅考虑 x86_64 位架构)。
我从传递给信号处理程序的 ucontex_t 结构中检索此值,但程序有一个非常奇怪的行为。有时 RBP 寄存器中包含的值根本没有意义(例如,0x00、0x01),有时它包含正确的堆栈基值。当然,这种行为会导致多个应用程序崩溃。
我需要检索函数的返回地址,因为我想找出调用函数的地址。
这是我正在使用的代码:
宏定义如下:
前面代码的输出示例是:正确值:
错误的值:
更糟 :
我注意到,当 RBP 包含零时,它会保持相同的值,直到应用程序结束。
c - linux中的ucontext
我读到 ucontext 用于保存 linux 中多个线程之间的上下文。既然操作系统是在不同线程之间进行上下文切换,那么linux为什么要提供这个头文件(ucontext.h)来进行上下文切换呢?
c - 操作`ucontext_t`的正确方法是什么?
从Redis的源代码中,在文件src/debug.c中,它使用backtrace()
来记录调用堆栈。在这些操作中,我注意到了getMcontextEip()
,在 Linux 中似乎是这样的:
所有这些背后的机制是:当有一个信号(即SIGFPE
)时,它将被捕获并尝试将调用堆栈记录到文件中:
从评论中,我们知道它旨在用调用者的地址覆盖 sigaction,但是有什么提示吗?我已经模拟了一个SIGFPE
信号并在 GDB 中对其进行了调试,ucontext_t
看起来是这样的:
在getMcontextEip
,它只是返回uc->uc_mcontext.gregs[14]
i386 平台上的,为什么要这样做?为什么是14而不是其他(有 19 个元素)?