【问题标题】:Stepping into swapcontext() with gdb使用 gdb 进入 swapcontext()
【发布时间】:2011-11-09 15:04:38
【问题描述】:

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

【问题讨论】:

    标签: c linux unix gdb system-calls


    【解决方案1】:

    您可以重复使用 GDB 的 stepi 命令先步入然后单步执行 swapcontext() 函数。你必须执行几十次,包括内核系统调用的几个步骤——我认为是保存浮点状态?——你最终会出现在你正在交换的用户线程中。这有点费时,但确实有效。

    【讨论】:

      【解决方案2】:

      在使用“step”或“next”调用 swapcontext() 时使用 gdb 步进不起作用,因为不仅堆栈指针更改,而且调用返回到不同的代码行(这是 swapcontext() 的预期效果) .由于 gdb 在下一个代码行中放置了一个断点,直到另一个 swapcontext() 返回到该位置时才会执行该断点,因此执行不会中断。

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

      【讨论】:

        【解决方案3】:

        setcontext 和 swapcontext 调用改变了程序的堆栈,gdb 变得混乱。我不知道其他调试器是否可以很好地处理它。

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

            尽管您可能不喜欢这个答案,但最好的办法是手动分小块逐步执行您的代码。线程程序不能很好地与 GDB 和 Valgrind 等调试器配合使用(至少根据我的经验),并且大多数错误都可以通过仔细的逐步手动分析代码来确定。

            【讨论】:

            • swapcontext 通常用于构建线程程序或本质上模拟多线程的程序。
            • 不,swapcontext 用于构建协程。否则,gdb 可以很好地处理多个线程。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-02-07
            • 1970-01-01
            • 2012-04-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多