我在OS X Lion上使用在Mac OS X上使用FPC和Indy 10编写的32位服务器应用程序在pthread_specific()中崩溃。我发现很难找到原因。发生崩溃是因为gs:[tlsindex]不可读,但我不知道为什么会这样。 tlsindex是正确的,因此描述符表必须以某种方式被破坏。
有没有办法在OS X上使用gdb / Xcode 4打印描述符表?我想如果我知道内存中的地址,我可以在其上设置一个数据断点,并希望打破破坏描述符表的代码。遗憾的是,我无法找到有关如何在OS X(i386)上实际实现TLS的任何信息。
或许有人对如何解决这个问题有很好的想法?
答案 0 :(得分:1)
如果这对其他人有用,我会回答我自己的问题。 OS X将gs
设置为指向当前线程的TLS存储。这实际上是线程数据块(struct _pthread
)的一部分,可以通过阅读Darwin源代码找到:
http://www.opensource.apple.com/source/Libc/Libc-391/pthreads/pthread_internals.h
检索指向此数据块的指针很容易:pthread_self
将返回它。通过记录这一点,我发现当线程仍在执行时,数据块很可能被其他人释放。通过使用mach_override捕获vm_deallocate
,我发现这是由另一个线程的清理代码完成的。
最终我发现我在已经通过pthread_join
分离的线程上调用了pthread_detach
。这两个函数都将释放线程存储空间。线程分离后(但在错误连接之前),另一个线程是偶然创建的,具有完全相同的基址。连接将释放新线程,使其在没有数据块的情况下执行。这个错误是由于pthread库与Windows相比的不同行为引起的,其中等待线程(连接)和关闭它(分离)是两个完全不同的事情。