调试嵌入Python解释器的应用程序中tk85.dll的问题

22

我的C++应用程序嵌入了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
我在一台机器上遇到了同样的问题。我们没有有意地导入tkinter或相关代码。但是删除tk85.dll可以防止出现问题。 - David Fraser
有没有一些与解释器一起分发的示例应用程序?如果有,它会崩溃吗? - Dmytro Ovdiienko
你有源代码吗?XSetStipple是什么意思?一种二分的方法是创建一个atexit处理程序,然后在其中设置断点,以查看此操作是在拆卸之前还是之后发生(使用处理程序进入CRT退出代码并将断点放在该函数的开头,以便您可以在所有处理程序之前捕获此操作)。在退出期间会发生一些暴力事件,例如除了主线程外,所有线程都会被杀死,因此这可能是其中的一部分。还有可能某些资源正在被释放,而不应该调用此函数。Tk是否有关闭路径? - aaron
如果您使用的是Windows 10,则可以从Windows商店安装WinDbg Preview,并启用时间旅行调试记录跟踪。然后打开此跟踪记录,并从结尾开始向后步进,直到您第一次在堆栈跟踪中看到熟悉的内容。也许这有助于您了解出现问题的原因。此外,您还可以查看模块卸载的顺序。 - stgatilov
1个回答

1
首先,我要告诉你我在使用非线程化的Tcl/Tk(Py2随附)与Python的Tkinter时,发现了竞态条件并提出了解决方法。我不确定是否修复了所有可能的竞态条件,但我已经修复了我遇到的所有问题。
现在,为了能够调试Tcl/Tk问题,您需要使用调试版本的Tcl/Tk构建Python,并将其嵌入其中。这样可以让您在调试器中查看tk*.dll,并找出问题所在。
  • Get the source code for your Python version and make the following changes:

    --- 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
    
  • run PCBuild\prepare_tcltk.bat from VS command prompt to download and build Tcl/Tk from source

  • Now build a debug Python as usual (PCBuild\readme.txt has the instructions).


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接