调试工具
Pyglet包括许多调试路径,可以在应用程序启动期间或之前启用这些路径。开发这些工具主要是为了帮助调试Piglet本身,但是其中一些也可能被证明对理解和调试Piglet应用程序很有用。
每个调试选项都是 pyglet.options
字典。在导入任何其他模块之前,可以直接在词典上设置选项:
import pyglet
pyglet.options['debug_gl'] = False
还可以在导入pyglet之前使用环境变量设置它们。每个选项对应的环境变量是字符串 PYGLET_
大写选项键的前缀。例如,的环境变量 debug_gl
是 PYGLET_DEBUG_GL
。使用设置或取消设置布尔选项 1
和 0
价值观。
下表中列出了调试环境变量的摘要。
选择权
环境变量
类型
debug_font
PYGLET_DEBUG_FONT
布尔尔
debug_gl
PYGLET_DEBUG_GL
布尔尔
debug_gl_trace
PYGLET_DEBUG_GL_TRACE
布尔尔
debug_gl_trace_args
PYGLET_DEBUG_GL_TRACE_ARGS
布尔尔
debug_graphics_batch
PYGLET_DEBUG_GRAPHICS_BATCH
布尔尔
debug_lib
PYGLET_DEBUG_LIB
布尔尔
debug_media
PYGLET_DEBUG_MEDIA
布尔尔
debug_trace
PYGLET_DEBUG_TRACE
布尔尔
debug_trace_args
PYGLET_DEBUG_TRACE_ARGS
布尔尔
debug_trace_depth
PYGLET_DEBUG_TRACE_DEPTH
集成
debug_win32
PYGLET_DEBUG_WIN32
布尔尔
debug_x11
PYGLET_DEBUG_X11
布尔尔
这个 debug_media
和 debug_font
选项用于调试 pyglet.media
和 pyglet.font
模块。它们的行为依赖于平台,并且仅对pyglet开发人员有用。
其余的调试选项将在下面详细说明。
调试OpenGL
这个 debug_graphics_batch
选项导致所有 Batch
对象在进行任何更改后,在绘制之前将其呈现树转储到标准输出(因此同一树的两个绘制只会转储一次)。这对于调试使用 Group
和 Batch
渲染。
错误检查
这个 debug_gl
选项拦截大多数OpenGL调用和调用 glGetError
之后(它只在这样的调用合法的情况下才会这样做)。如果报告错误,则立即引发异常。
此选项默认情况下处于启用状态,除非 -O
标志(优化)被赋予了Python,或者脚本是从一个py2exe或py2app包中运行的。
追踪
这个 debug_gl_trace
选项会导致将调用的所有OpenGL函数转储到标准输出。当与 debug_gl_trace_args
,还会打印提供给每个函数的参数(如有必要,可将它们缩写,以避免转储大量缓冲区数据)。
跟踪执行
这个 debug_trace
选项启用了Python范围的函数跟踪。这会导致每个函数调用都打印到标准输出。由于仅初始化pyglet就需要大量的函数调用,因此建议在使用此选项时将标准输出重定向到文件。
这个 debug_trace_args
选项还会将参数打印到每个函数调用。
什么时候 debug_trace_depth
大于1每个函数的调用方(S)(以及它们的参数,如果 debug_trace_args
设置)也会打印出来。每个调用方都缩进到被调用方的下方。默认深度为1,指定不打印调用方。
平台特定的调试
这个 debug_lib
选项使每个装入的库的路径打印到标准输出。这是由未记录在案的 pyglet.lib
模块,它在Linux和Mac OS X上有时必须遵循复杂的过程才能找到正确的库。在Windows上,并非所有的库都是通过此模块加载的,因此不会打印它们(但是,加载Windows DLL非常简单,几乎不需要此信息)。
Linux
X11错误被Piglet捕获并被抑制,因为在野外有大量的X服务器生成可以安全地忽略的错误。这个 debug_x11
选项导致将这些错误转储到标准输出,以及对Python堆栈的回溯(这可能与错误对应,也可能不对应,这取决于它是否被异步报告)。
窗口
这个 debug_win32
选项会使所有库调用都进入 user32.dll
, kernel32.dll
和 gdi32.dll
被截获。在每次库调用之前 SetLastError(0)
被调用,然后 GetLastError()
被称为。发现的任何错误都会写入一个名为 debug_win32.log
。请注意,只有当被调用的函数返回错误代码时,错误才有效,但拦截函数不检查这一点。