Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用gdb进入swapcontext()_C_Linux_Unix_Gdb_System Calls - Fatal编程技术网

使用gdb进入swapcontext()

使用gdb进入swapcontext(),c,linux,unix,gdb,system-calls,C,Linux,Unix,Gdb,System Calls,我正在做一个可以进行unix系统调用的项目。具体来说,我的项目严重依赖对getcontext()、makecontext()、swapcontext()和setcontext()的调用。我试图用gdb调试我的代码。我逐行进入代码并检查了控件,但一旦调用了swapcontext(),它就不再进入代码。相反,调试几乎就此停止,程序的其余部分将自动运行,而不是逐行运行。我猜gdb不会进入上下文调用?有没有办法绕过这个问题?是否有一个调试器可以用于此? 非常感谢尽管您可能不喜欢这个答案,但最好的办法是手

我正在做一个可以进行unix系统调用的项目。具体来说,我的项目严重依赖对getcontext()、makecontext()、swapcontext()和setcontext()的调用。我试图用gdb调试我的代码。我逐行进入代码并检查了控件,但一旦调用了swapcontext(),它就不再进入代码。相反,调试几乎就此停止,程序的其余部分将自动运行,而不是逐行运行。我猜gdb不会进入上下文调用?有没有办法绕过这个问题?是否有一个调试器可以用于此?
非常感谢

尽管您可能不喜欢这个答案,但最好的办法是手动将代码分成小块。线程程序在GDB和Valgrind这样的调试器中运行得不太好(至少在我的经验中是这样),大多数错误都可以通过仔细的一步一步地手动分析代码来确定。

GDB逐步通过一个线程,并将其称为当前线程。其他线程将在您执行此操作时运行。如果设置的断点在当前线程以外的线程中被命中,那么gdb将把当前线程更改为该线程。单步执行现在是相对于新的当前线程的。

setcontext和swapcontext调用会更改程序的堆栈,gdb会感到困惑。我不知道其他调试器是否能很好地处理它。

在使用“step”或“next”调用swapcontext()的过程中使用gdb不会起作用,因为不仅stackpointer会更改,而且调用还会返回到不同的代码行(这是swapcontext()所期望的效果)。由于gdb在下一个代码行中放置了一个断点,在另一个swapcontext()返回到此位置之前不会执行该断点,因此执行不会中断


您需要预见swapcontext()将返回的行,并在那里设置断点。对于新的(未使用的)上下文,这将是指定为entry函数的行。对于已使用的上下文,它可能是swapcontext()后面的一行…

您可以重复使用GDB的
stepi
命令,首先单步执行,然后单步执行
swapcontext()
函数。您必须执行几十次步骤,包括在内核系统调用上执行几步——我想是为了保存浮点状态吧?——最终您将在要交换到的用户线程中出现。这有点费时,但它可以工作。

swapcontext
通常用于构建线程程序或基本上模拟多线程的程序。不,swapcontext用于构建协同程序。否则,gdb可以很好地处理多个线程。