Попытка уменьшить количество ссылок Tcl_Obj, выделенных в другом потоке - PullRequest
1 голос
/ 15 мая 2019

Я скомпилировал исполняемый файл sourceforge tcl, он прошел все поставленные тесты и работает с тем же segfault, который я вижу в загруженном исполняемом файле, 8.6.9. Я работаю на Ubuntu 16.04 (по старым причинам) на процессоре AMD. (Я запустил Ubuntu 18.04 на моем ноутбуке, у него такой же сбой.)

Итак, затем я перекомпилировал с включенным параметром --enable-symbols = mem, чтобы посмотреть, не вызывает ли утечка памяти ошибку segfault, и теперь она сразу завершается с помощью:

Trying to decr ref count of Tcl_Obj allocated in another thread
./runMeg.sh: line 3: 29972 Aborted (core dumped) ../source/main_megatron.

Я не вижу ответа о том, что делать с этим ответом, может кто-нибудь посоветовать, что это означает, что мне нужно исправить?

Все мои темы имеют вид:

set graphDisplayThread [ thread::create {
  after [expr {int(1000) }]
  .....
  puts "...Initialized graphDisplayUpdate_02 ID $c update."
  thread::wait
  }]

и:

thread::send  $::graphDisplayThread { 
   incr b
   graphDisplayUpdate .c 
   }       

Все общие переменные ссылаются ПОСЛЕ захвата мьютекса и через переменные TSV. В приложении 5 потоков, в которых вообще нет C-кода. Всего около 2000 строк кода.

Приложение запускает тысячи циклов, а затем выполняет ошибки в случайных точках с предварительно скомпилированной версией ActiveState 8.6.9. Итак, теперь я пытаюсь изолировать точку отказа с помощью скомпилированных проверок памяти SourceForge 8.6.9 в качестве первого шага, но проблема, с которой я столкнулся выше, является первой, с которой я сталкиваюсь - и это происходит сразу после запуска.

Обновление (16.05.198, 8:28 EST): новая деталь для ответа на комментарии ниже .... В этом приложении нет C-кода, и ошибка Tcl_Obj ТОЛЬКО появляется в sourceForge на основе, 8.6. 9 компиляций (2) Я сделал сам, а не предустановленную загрузку ActiveState 8.6.9. И ошибка в коде sourceForge возникает как в сборках-близнецах "MEM_DEBUG", так и в сборках NO- "MEM_DEBUG", которые я сделал в тандеме и протестировал. Оба прошли все установочные тесты.

Подведем итог:

sourceForge 8.6.9 compile w/MEM_DEBUG option:   Tcl_Obj Abort error 
sourceForge 8.6.9 compile w/o MEM_DEBUG option: Tcl_Obj Abort error
ActiveState 8.6.9 build:                    does not Abort, random seg fault   

Почему я должен доверять сборке sourceForge, которую я сделал сам, больше, чем готовому исполняемому файлу ActiveState, который не представляет проблемы? И если мы действительно доверяем скомпилированной версии sourceForge, как я могу изолировать, где ошибка TclObject создается нарушающим кодом TCL?

Обновление 5/16/19 @ 13: 34EST: та же ошибка возникает с ActiveState 8.6.9 в Ubuntu 18.04. Я еще не проверил мои сборки SourceForge, чтобы посмотреть, как они себя ведут.

1 Ответ

0 голосов
/ 17 мая 2019

Методично взламывая кодовые блоки и наблюдая, исчезла ли ошибка Tcl_Obj, я обнаружил 2 ошибки:

  • Я повторно объявлял переменные mutex и cond более одного раза. Теперь он объявляется один раз и упоминается во всех других местах.
  • Остаток кода, удаляющий TSV, был найден в месте, где он мне больше не нужен.

Это также исправило ошибку сегмента.

Спасибо за помощь и подсказки, mrcalvin.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...