崩溃在Mac OS X pthread_specific()
我在OS X Lion中使用与FPC和印10在Mac OS X编写的32位服务器应用程序获得的pthread_specific()崩溃,我非常发现它很难找到原因。发生崩溃是因为gs:[tlsindex]不可读,但我不知道为什么会发生这种情况。 tlsindex是正确的,所以描述符表必须以某种方式损坏。崩溃在Mac OS X pthread_specific()
有没有办法用gdb/4的Xcode OS X上的打印描述符表?我在想,如果我知道内存中的地址,我可以在其上设置一个数据断点,并希望在代码中破坏描述符表。不幸的是我找不到有关TLS如何在OS X上实际实现的信息(i386)。
也许有人对如何解决这一问题的一个绝妙的主意?
我会回答我的问题的情况下,这是别人永远有用。 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_join
的线程已通过pthread_detach
分离。这两个函数都将释放线程存储。在线程被分离之后(但在错误加入之前),另一个线程被偶然地创建为具有完全相同的基址。连接将释放新线程,使其在没有数据块的情况下执行。这个错误是由pthread库与Windows相比的不同行为引起的,在这种情况下,等待线程(加入)并关闭它(分离)是两个完全不同的事情。