为什么这个简单的多线程程序会在eclipse中冻结 - mingw32 / gdb?

时间:2012-06-24 20:17:46

标签: c multithreading gcc gdb mingw

下面的程序绝对随机地在GDB 7.4(MinGW32,Eclipse,Windows)中挂起/冻结,估计大约每5或6次运行。通过在eclipse中对调试按钮进行mashing然后检查未终止的调试实例,可以很容易地找到它。你当然可以通过像普通人一样运行来做同样的事情,很快就会得到相同的结果。

未连接到GDB时,样本永远不会冻结。永远。我也无法在VC ++ Express下暴露同样的问题(这是一个不同的样本,但实际上只有相同的想法)。

它主要围绕线程创建,线程删除和程序终止。另外值得注意的是,即使main返回-1作为退出代码,当程序没有冻结时附加到GDB时它会以代码0退出。

另一个有趣的事实 - 当我取消注释“Sleep(1)”时,它会停止80%的时间。然而,当它确实冻结时,它会在打印“返回-1 \ n”后冻结。 所有其他终止继续返回0(除非在没有gdb的情况下运行)。

不用多说,代码:

#include <stdio.h>
#include <windows.h>
#include <process.h>

void __cdecl callback(void *arg)
{
    int count = 0;

    while(count < 10)
    {
        printf("Thread 2(%i): looping %i\n", (int)arg, count);
        count++;
    }

    printf("Ending thread...\n");
    _endthread();
}

int main(int argc, char *argv[])
{
    // Mingw32 on windows w/ eclipse - fix console output not showing up until the app terminates
    setvbuf(stdout, NULL, _IONBF, 0);
    setvbuf(stderr, NULL, _IONBF, 0);

    bool runMain = true;

    int runCount = 0;

    while(runMain == true)
    {
        if(runCount == 5)
        {
            printf("Thread starting... ");
            int result = _beginthread(callback, 0, (void*)5);
//          Sleep(1);

            if(result == 0)
                printf("[FAILURE]\n");
            else
                printf("[SUCCESS]\n");
        }

        printf("Thread 1: %i\n", runCount);
        runCount++;

        if(runCount == 20)
            runMain = false;
    }

    printf("Return -1\n");
    return -1;
}

您认为导致这种情况的原因是什么,更重要的是 - 我该如何解决?

1 个答案:

答案 0 :(得分:0)

没有解决方案。 GDB #17247中存在一个与之相关的错误。

将SIGCONT信号发送到gdb或您的应用程序使它再次工作。

尝试下次运行此命令:

killall -s SIGCONT <gdb | your application process name>

kill -18 <gdb pid|application pid>