Сбой порта Mac OS X в pthread_setspecific в glibstdc ++ vsnprintf - как устранить неполадки?

Я тестирую порт Mac OS X своего многопоточного сервера. Он запускается, но умирает в vsnprintf вскоре после того, как рабочий поток принимает первый клиентский запрос.

Похоже, что vsnprintf пытается манипулировать некоторой локальной памятью потока с помощью pthread_setspecific. Это разыменовывает плохой указатель. Затем gdb перехватывает вызов dlopen, получает ошибку и умирает, пытаясь отформатировать собственное сообщение об ошибке. Потому что для форматирования ошибки необходимо настроить некоторую локальную память потока!

До этого в моем собственном коде успешно использовались pthread_create_key, pthread_getspecific и pthread_setspecific. Я тщательно регистрировал свои собственные обращения и не думаю, что они что-то портят.

Возможно ли, что некоторая статика в glibstdc ++ не была инициализирована вовремя? Как я могу сказать?

Кроме того, я использовал g ++ -pthread для компиляции и компоновки, но я не вижу libpthread в моем исполняемом манифесте.

    otool -L myExecutable

libboost_thread-xgcc40-mt-1_39.dylib (compatibility version 0.0.0, current version 0.0.0)
/Users/eolson//lib/libgsl.0.dylib (compatibility version 14.0.0, current version 14.0.0)
/Users/eolson//lib/libgslcblas.0.dylib (compatibility version 1.0.0, current version 1.0.0)
/Users/eolson/mico-2.3.12/lib/libmico2.3.12.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/local/lib/libModelsCorba.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/local/lib/libModelsBigLibrary.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.4.0)
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.4)

Есть ли у кого-нибудь идеи, как это дальше отлаживать?

Трассировки стека:

[Switching to process 37784]
Program received signal:  “EXC_BAD_ACCESS”.
[Switching to process 37784]
sharedlibrary apply-load-rules all
Data Formatters temporarily unavailable, will re-try after a 'continue'. (The program being debugged was signaled while in a function called from GDB.
GDB remains in the frame where the signal was received.
To change this behavior use "set unwindonsignal on"
Evaluation of the expression containing the function (dlopen) will be abandoned.)
(gdb) where

#0  0x9232f03b in pthread_setspecific ()
#1  0x9232efe6 in getPerThreadBufferFor_dlerror ()
#2  0x8fe0b0cd in __dyld_dlopen ()
#3  0x9232ef48 in dlopen ()
#4  <function called from gdb>
#5  0x9232f03b in pthread_setspecific ()
#6  0x9233ed64 in __Balloc_D2A ()
#7  0x9233eb92 in __d2b_D2A ()
#8  0x9233dc5e in __dtoa ()
#9  0x92335975 in __vfprintf ()
#10 0x92355886 in vsnprintf ()
#11 0x96eb526b in std::__convert_from_v ()
#12 0x96eaeb5e in std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_float<double> ()
#13 0x96eaedb4 in std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put ()
#14 0x96ea9583 in std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::put ()
#15 0x96eb79dd in std::ostream::_M_insert<double> ()
#16 0x012db6a8 in MyCode ...

Код, вызвавший сбой:

std::ostringstream buf;
buf << myObjectWithOutputOperator << endl;
double x = 1;
buf << "x: " << x << endl; // crashes during __vfprintf

РЕДАКТИРОВАТЬ: Я считаю, что это связано с ошибкой в ​​ostringstream с конфигурацией XCode 3.2 DEBUG. См. проблему ostringstream с int в c ++


person Erik Olson    schedule 06.11.2009    source источник
comment
Неужели x действительно не имеет значения?   -  person mmmmmm    schedule 07.11.2009
comment
Извините, я упрощал. Да, x = 1 до сбоя. printf был бы сомнительным, если бы x был неинициализирован! Кроме того, код некоторое время был развернут в Linux, поэтому я ищу специфические подводные камни Mac OS X.   -  person Erik Olson    schedule 09.11.2009


Ответы (1)


Mac OS X не использует отдельный libpthread. Все функции pthread находятся в libSystem:

$ nm -g /usr/lib/libSystem.dylib | grep ' _pthread_' | wc -l
     113

Решает ли компиляция без определения _GLICXX_DEBUG=1 проблему, как подсказывает вопрос, связанный с вашим изменением?

person Jeremy W. Sherman    schedule 02.07.2011