【问题标题】:Crash in pthread_specific() on Mac OS XMac OS X 上的 pthread_specific() 崩溃
【发布时间】:2013-03-23 19:02:58
【问题描述】:

我在 Mac OS X 上使用 FPC 和 Indy 10 编写的 32 位服务器应用程序在 OS X Lion 上的 pthread_specific() 中遇到了崩溃。我发现很难找到原因。发生崩溃是因为 gs:[tlsindex] 不可读,但我不知道为什么会发生这种情况。 tlsindex 是正确的,所以描述符表一定已经损坏了。

有没有办法在 OS X 上使用 gdb / Xcode 4 打印描述符表?我在想,如果我知道内存中的地址,我可以在它上面设置一个数据断点,并希望在破坏描述符表的代码处中断。不幸的是,我找不到任何关于如何在 OS X (i386) 上实际实现 TLS 的信息。

或者也许有人对如何解决这个问题有一个绝妙的主意?

【问题讨论】:

    标签: macos crash pthreads indy fpc


    【解决方案1】:

    我会回答我自己的问题,以防这对其他人有用。 OS X 设置 gs 指向当前线程的 TLS 存储。这实际上是线程数据块(struct _pthread)的一部分,通过阅读达尔文源代码可以发现: http://www.opensource.apple.com/source/Libc/Libc-391/pthreads/pthread_internals.h

    检索指向该数据块的指针很容易:pthread_self 将返回它。通过记录这一点,我发现数据块很可能在线程仍在执行时被其他人释放。通过使用mach_override 捕获vm_deallocate,我发现这是由另一个线程的清理代码完成的。

    最终,我在一个已经通过pthread_detach 分离的线程上调用了pthread_join。这两个函数都将释放线程存储。在线程分离后(但在错误连接之前),偶然创建了另一个具有完全相同基地址的线程。连接将释放新线程,使其在没有数据块的情况下执行。这个错误是由 pthread 库与 Windows 相比的不同行为引起的,在 Windows 中等待线程(加入)和关闭它(分离)是两件完全不同的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-30
      • 2012-10-31
      • 2014-08-26
      相关资源
      最近更新 更多