Устранить проблему в tk85.dll в приложении, которое встраивает интерпретатор Python

В моем приложении С++ встроен интерпретатор Python, но, похоже, он испытывает некоторые проблемы, когда он отключается. Сразу после закрытия главного окна я получаю ошибку сегментации (это Windows, но мы все равно будем называть ее ошибкой сегментации). Трассировка стека ниже:

#0 102AD580 tk85!Tk_MainWindow() (C:\Users\... 1.3\bin\Debug\lib\tk85.dll:??)
#1 103082DD tk85!XSetStipple() (C:\Users\... 1.3\bin\Debug\lib\tk85.dll:??)
#2 102214A3 ??() (C:\Users\...1.3\bin\Debug\lib\tk85.dll:??)
#3 10220000 ??() (??:??)
#4 00000000 ??() (??:??)

Где бы я даже начал отлаживать эту проблему? Кажется, это воспроизводимо.

Ответ 1

Во-первых, я дам вам знать, что я определил условия гонки в Python Tkinter при использовании с непотоковым Tcl/Tk (Py2 поставляется с этим) и предложил исправление. Я не уверен, что исправил все возможные условия гонки, но я исправил все, с чем столкнулся.

Теперь, чтобы иметь возможность отлаживать проблемы Tcl/Tk, вам нужно собрать Python с отладочной версией Tcl/Tk и внедрить его. Это должно дать вам возможность заглянуть в tk*.dll в отладчике и увидеть, что не так.

  • Получите исходный код для вашей версии Python и внесите следующие изменения:

    --- a/PCbuild/prepare_tcltk.bat
    +++ b/PCbuild/prepare_tcltk.bat
    @@ -46,10 +46,10 @@ rem if ERRORLEVEL 1 (echo Cannot locate python.exe on PATH or as PYTHON variable
    
     call "%PCBUILD%\get_externals.bat" --tkinter-src %ORG_SETTING%
    
    -%MSBUILD% "%PCBUILD%\tcl.vcxproj" /p:Configuration=Release /p:Platform=Win32
    -%MSBUILD% "%PCBUILD%\tk.vcxproj" /p:Configuration=Release /p:Platform=Win32
    -%MSBUILD% "%PCBUILD%\tix.vcxproj" /p:Configuration=Release /p:Platform=Win32
    +%MSBUILD% "%PCBUILD%\tcl.vcxproj" /p:Configuration=Debug /p:Platform=Win32
    +%MSBUILD% "%PCBUILD%\tk.vcxproj" /p:Configuration=Debug /p:Platform=Win32
    +%MSBUILD% "%PCBUILD%\tix.vcxproj" /p:Configuration=Debug /p:Platform=Win32
    
    -%MSBUILD% "%PCBUILD%\tcl.vcxproj" /p:Configuration=Release /p:Platform=x64
    -%MSBUILD% "%PCBUILD%\tk.vcxproj" /p:Configuration=Release /p:Platform=x64
    -%MSBUILD% "%PCBUILD%\tix.vcxproj" /p:Configuration=Release /p:Platform=x64
    +%MSBUILD% "%PCBUILD%\tcl.vcxproj" /p:Configuration=Debug /p:Platform=x64
    +%MSBUILD% "%PCBUILD%\tk.vcxproj" /p:Configuration=Debug /p:Platform=x64
    +%MSBUILD% "%PCBUILD%\tix.vcxproj" /p:Configuration=Debug /p:Platform=x64
    
  • запустите PCBuild\prepare_tcltk.bat из командной строки VS, чтобы загрузить и собрать Tcl/Tk из исходного кода

  • Теперь PCBuild\readme.txt отладочный Python как обычно (в инструкции есть PCBuild\readme.txt).