在Xcode中捕获线程退出

时间:2011-03-11 13:23:18

标签: c++ xcode macos gdb

我正在尝试在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。调试版本不会重现这种行为(哦,欢乐),我的最小测试应用程序也不会。我已经删除了日志代码,以免造成一些奇怪的同步效果,但这没有用。

1 个答案:

答案 0 :(得分:4)

_pthread_exit中设置断点。

  1. 在Xcodes的菜单中选择“运行” - &gt; “显示” - &gt; “断点”
  2. 双击断点表中的最后一行。
  3. 输入“_pthread_exit”。
  4. 您可能还想在pthread_cancel中设置断点。