代码步进如何与线程一起使用?

时间:2011-10-28 17:01:51

标签: c++ multithreading visual-studio visual-studio-2010 debugging

我正在使用Visual Studio 2010开发C ++。如何设计代码步进来处理新线程的创建?

如果我逐步执行代码并使用CreateThread()生成一个新线程,我会进入该线程吗?如果没有,为什么不呢?

修改 即使在线程函数中有断点,我也会得到不可预测的结果。有时我的程序会在线程函数中遇到断点之前退出。我只是想知道是什么引起了这种行为。

5 个答案:

答案 0 :(得分:3)

这取决于。

如果CreateThread调用的方法在您单步执行调用CreateThread的代码时遇到了断点,则调试器将切换到该断点和线程。从那时起(直到再次点击F5)执行步骤(F10)偶尔会在原始线程和CreateThread创建的线程之间切换。

对于在给定中断会话期间创建的每个线程都是如此。一旦你按下F5并再次中断(通过断点或暂停),一切都会重置并且步进只会逐步通过最初被破解的线程。

这是一个示例应用

DWORD WINAPI Thread2(LPVOID lParam)
{
    while (true)
    {
        printf("In Thread 2\n");
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    CreateThread( NULL, 0, &Thread2, NULL, 0, NULL);  
    while (true)
    {
        printf("In Thread 1\n");
    }
    return 0;
}

如果我在printf命中F5中的_tmain函数上放置断点,然后在断点被击中后使用F10步进,我将永远不会进入Thread2方法。

但是,如果我在_tmainThread2的入口点放置一个断点,然后点击F5就会发生变化。首先,我将按预期在_tmain中点击断点。如果我在那之后继续击中F10,我最终会在Thread2中击中断点。从那时起,我可以继续击中F10,它将在两个线程之间交替进行。

注意:这不是因为我一直在打破断点。两个断点只被击中一次,因为它们位于方法入口点。它只是在调试器中为给定停止明确分解的线程之间交替的调试器行为。

答案 1 :(得分:2)

不,我不这么认为。您将继续当前线程,直到在另一个线程中命中断点。

答案 2 :(得分:0)

执行将在当前线程中继续,直到命中断点。此断点可以位于单独的线程中,执行将在该线程中遵循相同的规则继续执行。

答案 3 :(得分:0)

不,你没有直接调用你的线程方法(这会破坏线程的目的)。您正在请求运行时与当前线程并行执行您的线程函数,并尽快启动。

如果你在所有线程中都没有预定义的断点,我看到MS调试器在选择“跳过”时在线程之间来回反弹,但我不能说我可以判断是否有可预测性它

答案 4 :(得分:0)

  

如果我逐步执行代码并使用CreateThread()生成一个新线程,我会进入该线程吗?

不,单步执行意味着您正在逐步执行特定线程的执行上下文。调试器有几种方法可以切换您正在查看的线程。有一个Threads窗口,显示有关进程中所有线程的信息。您还可以在新线程的入口点设置断点。

  

如果没有,为什么不呢?

因为调试器不知道CreateThread是一个启动新线程的特殊函数。它只是知道你已经要求它跳过函数调用,所以它假设你想要保留在当前线程中。此外,根据计划,新线程可能会立即开始,也可能不会立即开始。例如,您可以在暂停状态下启动新线程。