下面的程序绝对随机地在 GDB 7.4(MinGW32、Eclipse、Windows)中保持挂起/冻结,估计大约每 5 或 6 次运行。通过在 Eclipse 中混合调试按钮,然后检查尚未终止的调试实例,最容易找到它。您当然可以通过像正常人一样运行它来做同样的事情,并且很可能很快就会得到相同的结果。
未连接到 GDB 时,样本永远不会冻结。曾经。我也无法在 VC++ Express 下暴露同样的问题(这是一个不同的示例,但实际上只是相同的想法)。
它主要围绕线程创建、线程删除和程序终止。另外值得注意的是,即使 main 返回 -1 作为退出代码,当附加到 GDB 时,只要程序不冻结它就会以代码 0 退出。
另一个有趣的事实——当我取消注释“Sleep(1)”调用它停止挂起 80% 的时间。但是,当它确实冻结时,它会在打印“Return -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;
}
您认为是什么原因造成的,更重要的是 - 我该如何解决?