2011-09-03 60 views
4

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

回答

1

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

-1

尽可能多的你可能不喜欢这个答案,最好的选择是通过你的代码小步骤。线程化程序在GDB和Valgrind等调试器中的表现并不理想(至少在我的经验中),并且大多数错误都可以通过对代码进行仔细的分步手动分析来确定。

+0

他没有写他的程序是多线程的。 – zvrba

+0

'swapcontext'通常用于构建基本上模拟多个线程的线程化程序或程序。 – aqua

+0

不,swapcontext用于构建协程。否则,gdb可以很好地处理多个线程。 – zvrba

0

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

0

使用gdb通过调用swapcontext()与'step'或'next'调用不起作用,因为不仅stackpointer更改而且调用返回到不同的代码行(这是swapcontext()的期望效果) )。由于gdb在下一个代码行中放置了一个断点,直到另一个swapcontext()返回到这个地方,执行才会中断。

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

0

您可以重复使用GDB的stepi命令首先进入,然后逐步执行swapcontext()函数。你必须步骤数十次,包括在内核系统调用上的几个步骤 - 我假定保存浮点状态?并且最终你将在你交换的用户线程中出现。这是一个很耗时,但它的工作原理。