2013-03-23 3 views
0

Я получаю сбой в pthread_specific() на OS X Lion, используя 32-разрядное серверное приложение, написанное с FPC и Indy 10 в Mac OS X. Я нахожу это очень трудно отследить причину. Сбой происходит, потому что gs: [tlsindex] не читается, но я понятия не имею, почему это происходит. Правило tlsindex, поэтому таблица дескрипторов должна как-то испортиться.Crash in pthread_specific() на Mac OS X

Есть ли способ распечатать таблицу дескрипторов, используя gdb/Xcode 4 на OS X? Я думаю, что, если я знаю адрес в памяти, я мог бы установить точку останова данных и, надеюсь, сломать код, искажающий таблицу дескриптора. К сожалению, я не могу найти никакой информации о том, как TLS фактически реализуется в OS X (i386).

Возможно, у кого-то есть блестящая идея о том, как решить эту проблему?

ответ

1

Я отвечу на свой вопрос, если это когда-нибудь будет полезно для кого-то другого. OS X устанавливает gs, чтобы указать хранилище TLS для текущего потока. Это на самом деле является частью блока данных в нити (struct _pthread), как можно было бы узнать, прочитав Darwin исходный код: http://www.opensource.apple.com/source/Libc/Libc-391/pthreads/pthread_internals.h

Это легко получить указатель на этот блок данных: pthread_self вернет его. Регистрируя это, я обнаружил, что блок данных, скорее всего, был освобожден кем-то другим, пока поток все еще выполняется. Улавливая vm_deallocate с использованием mach_override, я узнал, что это было сделано с помощью кода очистки для другого потока.

В конце концов выяснилось, что я звонил pthread_join на нитку, которая уже была отсоединена через pthread_detach. Обе функции освободят хранилище потоков. После того, как поток был отсоединен (но до ошибочного соединения), другой поток был создан с точно таким же базовым адресом случайно. Это соединение освободит новый поток, оставив его без его блока данных. Эта ошибка была вызвана различным поведением библиотеки pthread по сравнению с Windows, где ожидание в потоке (объединение) и закрытие (отключение) - это две совершенно разные вещи.