我正在尝试在Xcode下解决一个非常讨厌的Heisenbug,我有一个线程通过调用外部库来进行一些后台处理,并且在某些时候看起来线程正在消失。代码是这样的:
LOG("starting operation");
float progress=0;
while (progress < 1.0f) {
LOG("start loop");
Wait(100); // calls ::Delay()
progress=otherLibrary->CheckProgress();
LOG("end loop");
}
在我的日志文件中,我得到的输出类似于:
starting operation
start loop
end loop
starting operation
start loop
似乎循环只是以某种方式轰炸。它没有挂起,好像我闯入调试器,该线程似乎不再存在。如果我添加更多日志记录或移动功能,它会在略有不同的地方出错。在某些情况下,它甚至似乎在系统的Delay()
功能内部爆炸。
问题是:如何检测此线程中止的点?
没有异常被抛出,控制台(gdb或系统)中没有任何异常。 GDB轻松地告诉我Catch of thread_exit not yet implemented
。调试版本不会重现这种行为(哦,欢乐),我的最小测试应用程序也不会。我已经删除了日志代码,以免造成一些奇怪的同步效果,但这没有用。
答案 0 :(得分:4)
在_pthread_exit
中设置断点。
您可能还想在pthread_cancel
中设置断点。