使用gdb进入swapcontext()
我正在做一个可以进行unix系统调用的项目。具体来说,我的项目严重依赖对getcontext()、makecontext()、swapcontext()和setcontext()的调用。我试图用gdb调试我的代码。我逐行进入代码并检查了控件,但一旦调用了swapcontext(),它就不再进入代码。相反,调试几乎就此停止,程序的其余部分将自动运行,而不是逐行运行。我猜gdb不会进入上下文调用?有没有办法绕过这个问题?是否有一个调试器可以用于此?使用gdb进入swapcontext(),c,linux,unix,gdb,system-calls,C,Linux,Unix,Gdb,System Calls,我正在做一个可以进行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可以很好地处理多个线程。