Сбой приложения при компиляции с TCL_MEM_DEBUG - PullRequest
0 голосов
/ 01 ноября 2019

В TCL 8.6.9 я пытался использовать TCL_MEM_DEBUG, чтобы помочь диагностировать утечку памяти в моем приложении, но я получаю сбой при его использовании / включении.

Тот же код работает нормально, когда TCL компилируетсябез него, но сбой при использовании флага.

Сбой кода в TCL при вызове функции "Tcl_ResetResult-> ResetObjResult-> Tcl_IsShared (Tcl_DbIsShared in debug)".

Это произошло во время выполнения "Tcl_Eval () ".

(Это приложение с несколькими потоками (интерпретатором)).

Спасибо

Немного больше информации: это происходит в потоке, который былсоздан в DLL. Итак, что мы делаем здесь, когда DLL загружается из TCL, мы создаем новый интерпретатор TCL (Tcl_CreateInterp), а затем создаем новый поток, в котором мы используем этот интерпретатор. Другие потоки (со своим собственным интерпретатором) отправляют команды тому потоку, который их выполняет. В этот момент происходит сбой.

1 Ответ

0 голосов
/ 15 ноября 2019

Да, такая ситуация действительно может возникнуть в tcl, скомпилированном с TCL_MEM_DEBUG, если поток, в данный момент вызывающий IsShared, IncrRefCount или DecrRefCount и т. Д., Но еще не создал ни одного объекта . Фактически таблица объектов создается для каждого потока в его TSD в функции TclDbInitNewObj (так по требованию, если первый объект создается в потоке) ...

Так что я предполагаю, что некоторый объект obj создается в потоке Th1 и передается в поток Th2, но поток Th2 до сих пор не создал ни одного объекта. Обычно это никогда не происходит, потому что в самом потоке создается интерпретатор (и во время фазы инициализации будет создано несколько объектов). Только что вы написали выше:

мы создаем новый интерпретатор TCL (Tcl_CreateInterp), затем мы создаем новый поток, где мы используем этот интерпретатор.

Хотя я неЯ думаю, что это хорошая идея (чрезмерное использование потокового хранилища и т. д.), но я думаю, что это может быть немного неожиданным поведением с нашей стороны, и если мы сможем, мы должны это исправить.

Пока это все ещене исправлено, так как для обхода просто создайте 1 пустой объект в каждом потоке, работающем с tcl-объектами в вашем приложении, например:

#ifdef TCL_MEM_DEBUG
if (1) { Tcl_Obj *objPtr = Tcl_NewObj(); Tcl_DecrRefCount(objPtr); };
#endif
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...