0

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

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

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

4

1 回答 1

1

如果这对其他人有用,我会回答我自己的问题。OS X 设置gs为指向当前线程的 TLS 存储。这实际上是线程数据块的struct _pthread一部分

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

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

于 2013-04-16T13:34:47.010 回答