“Python/docs/3.9/library/faulthandler”的版本间差异
(autoload) |
小 (Page commit) |
||
第1行: | 第1行: | ||
+ | {{DISPLAYTITLE:faulthandler — 转储 Python 回溯 — Python 文档}} | ||
<div id="module-faulthandler" class="section"> | <div id="module-faulthandler" class="section"> | ||
<span id="faulthandler-dump-the-python-traceback"></span> | <span id="faulthandler-dump-the-python-traceback"></span> | ||
− | = | + | = faulthandler — 转储 Python 回溯 = |
<div class="versionadded"> | <div class="versionadded"> | ||
− | <span class="versionmodified added">3.3 | + | <span class="versionmodified added">3.3 版中的新功能。</span> |
</div> | </div> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | ----- | |
− | |||
− | |||
− | |||
− | + | 该模块包含显式转储 Python 回溯、故障、超时或用户信号的函数。 调用 [[#faulthandler.enable|faulthandler.enable()]] 为 <code>SIGSEGV</code>、<code>SIGFPE</code>、<code>SIGABRT</code>、<code>SIGBUS</code> 和 <code>SIGILL</code> 信号。 您还可以通过设置 <span id="index-0" class="target"></span>[[../../using/cmdline#envvar-PYTHONFAULTHANDLER|PYTHONFAULTHANDLER]] 环境变量或使用 [[../../using/cmdline#cmdoption-X|-X]] <code>faulthandler</code> 命令行选项在启动时启用它们。 | |
− | |||
− | |||
− | |||
− | + | 故障处理程序与系统故障处理程序(如 Apport 或 Windows 故障处理程序)兼容。 如果 <code>sigaltstack()</code> 函数可用,该模块使用信号处理程序的替代堆栈。 这允许它即使在堆栈溢出时也可以转储回溯。 | |
− | |||
− | |||
− | |||
− | |||
− | + | 故障处理程序在灾难性情况下被调用,因此只能使用信号安全功能(例如 它不能在堆上分配内存)。 由于这个限制,与普通的 Python 回溯相比,回溯转储是最小的: | |
− | |||
− | |||
− | + | * 仅支持 ASCII。 <code>backslashreplace</code> 错误处理程序用于编码。 | |
− | + | * 每个字符串限制为 500 个字符。 | |
+ | * 只显示文件名、函数名和行号。 (没有源代码) | ||
+ | * 它被限制为 100 帧和 100 个线程。 | ||
+ | * 顺序相反:最先显示最近的呼叫。 | ||
− | + | 默认情况下,Python 回溯被写入 [[../sys#sys|sys.stderr]]。 要查看回溯,应用程序必须在终端中运行。 日志文件也可以传递给 [[#faulthandler.enable|faulthandler.enable()]]。 | |
− | + | ||
+ | 该模块是用 C 实现的,因此可以在崩溃或 Python 死锁时转储回溯。 | ||
+ | |||
+ | [[../devmode#devmode|Python 开发模式]] 在 Python 启动时调用 [[#faulthandler.enable|faulthandler.enable()]]。 | ||
<div id="dumping-the-traceback" class="section"> | <div id="dumping-the-traceback" class="section"> | ||
− | == | + | == 转储回溯 == |
<dl> | <dl> | ||
− | <dt>< | + | <dt><span class="sig-prename descclassname"><span class="pre">faulthandler.</span></span><span class="sig-name descname"><span class="pre">dump_traceback</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">file</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">sys.stderr</span></span>'', ''<span class="n"><span class="pre">all_threads</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span>''<span class="sig-paren">)</span></dt> |
− | <dd><p> | + | <dd><p>将所有线程的回溯转储到 ''文件'' 中。 如果 ''all_threads'' 是 <code>False</code>,则只转储当前线程。</p> |
− | <code>False</code> | ||
<div class="versionchanged"> | <div class="versionchanged"> | ||
− | <p><span class="versionmodified changed">在 3.5 | + | <p><span class="versionmodified changed"> 在 3.5 版更改: </span> 添加了对将文件描述符传递给此函数的支持。</p> |
</div></dd></dl> | </div></dd></dl> | ||
第61行: | 第49行: | ||
<div id="fault-handler-state" class="section"> | <div id="fault-handler-state" class="section"> | ||
− | == | + | == 故障处理程序状态 == |
<dl> | <dl> | ||
− | <dt>< | + | <dt><span class="sig-prename descclassname"><span class="pre">faulthandler.</span></span><span class="sig-name descname"><span class="pre">enable</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">file</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">sys.stderr</span></span>'', ''<span class="n"><span class="pre">all_threads</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span>''<span class="sig-paren">)</span></dt> |
− | <dd><p> | + | <dd><p>启用故障处理程序:为 <code>SIGSEGV</code>、<code>SIGFPE</code>、<code>SIGABRT</code>、<code>SIGBUS</code> 和 <code>SIGILL</code> 信号安装处理程序以转储 Python 回溯。 如果 ''all_threads'' 是 <code>True</code>,则为每个正在运行的线程生成回溯。 否则,仅转储当前线程。</p> |
− | <code>SIGFPE</code> | + | <p>''文件'' 必须保持打开状态,直到故障处理程序被禁用:参见 [[#faulthandler-fd|文件描述符问题]] 。</p> |
− | |||
− | |||
− | |||
− | <p> | ||
− | [[#faulthandler-fd| | ||
<div class="versionchanged"> | <div class="versionchanged"> | ||
− | <p><span class="versionmodified changed">在 3.5 | + | <p><span class="versionmodified changed"> 在 3.5 版更改: </span> 添加了对将文件描述符传递给此函数的支持。</p> |
</div> | </div> | ||
<div class="versionchanged"> | <div class="versionchanged"> | ||
− | <p><span class="versionmodified changed"> | + | <p><span class="versionmodified changed"> 3.6 版更改: </span> 在 Windows 上,还安装了 Windows 异常处理程序。</p> |
</div></dd></dl> | </div></dd></dl> | ||
− | ; < | + | ; <span class="sig-prename descclassname"><span class="pre">faulthandler.</span></span><span class="sig-name descname"><span class="pre">disable</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> |
− | : | + | : 禁用故障处理程序:卸载由 [[#faulthandler.enable|enable()]] 安装的信号处理程序。 |
− | ; < | + | ; <span class="sig-prename descclassname"><span class="pre">faulthandler.</span></span><span class="sig-name descname"><span class="pre">is_enabled</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> |
− | : | + | : 检查是否启用了故障处理程序。 |
第93行: | 第76行: | ||
<div id="dumping-the-tracebacks-after-a-timeout" class="section"> | <div id="dumping-the-tracebacks-after-a-timeout" class="section"> | ||
− | == | + | == 超时后转储回溯 == |
<dl> | <dl> | ||
− | <dt>< | + | <dt><span class="sig-prename descclassname"><span class="pre">faulthandler.</span></span><span class="sig-name descname"><span class="pre">dump_traceback_later</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">timeout</span></span>'', ''<span class="n"><span class="pre">repeat</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span>'', ''<span class="n"><span class="pre">file</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">sys.stderr</span></span>'', ''<span class="n"><span class="pre">exit</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span>''<span class="sig-paren">)</span></dt> |
− | <dd><p> | + | <dd><p>如果 ''repeat'' 是 <code>True</code>,则在 ''timeout'' 秒超时后或每隔 ''timeout'' 秒转储所有线程的回溯。 如果 ''exit'' 是 <code>True</code>,则在转储回溯后以 status=1 调用 <code>_exit()</code>。 (注意 <code>_exit()</code> 会立即退出进程,这意味着它不会像刷新文件缓冲区那样进行任何清理。)如果该函数被调用两次,新调用将替换之前的参数并重置超时。 计时器具有亚秒级分辨率。</p> |
− | + | <p>''文件'' 必须保持打开状态,直到回溯被转储或 [[#faulthandler.cancel_dump_traceback_later|cancel_dump_traceback_later()]] 被调用:参见 [[#faulthandler-fd|文件描述符问题]] 。</p> | |
− | <code>_exit()</code> | + | <p>此功能是使用看门狗线程实现的。</p> |
− | <code>_exit()</code> | ||
− | |||
− | |||
− | |||
− | <p> | ||
− | [[#faulthandler.cancel_dump_traceback_later| | ||
− | |||
− | <p> | ||
<div class="versionchanged"> | <div class="versionchanged"> | ||
− | <p><span class="versionmodified changed"> | + | <p><span class="versionmodified changed"> 3.7 版本变更: </span>此功能现在一直可用。</p> |
</div> | </div> | ||
<div class="versionchanged"> | <div class="versionchanged"> | ||
− | <p><span class="versionmodified changed">在 3.5 | + | <p><span class="versionmodified changed"> 在 3.5 版更改: </span> 添加了对将文件描述符传递给此函数的支持。</p> |
</div></dd></dl> | </div></dd></dl> | ||
− | ; < | + | ; <span class="sig-prename descclassname"><span class="pre">faulthandler.</span></span><span class="sig-name descname"><span class="pre">cancel_dump_traceback_later</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> |
− | : | + | : 取消对 [[#faulthandler.dump_traceback_later|dump_traceback_later()]] 的最后一次调用。 |
第126行: | 第101行: | ||
<div id="dumping-the-traceback-on-a-user-signal" class="section"> | <div id="dumping-the-traceback-on-a-user-signal" class="section"> | ||
− | == | + | == 将回溯转储到用户信号上 == |
<dl> | <dl> | ||
− | <dt>< | + | <dt><span class="sig-prename descclassname"><span class="pre">faulthandler.</span></span><span class="sig-name descname"><span class="pre">register</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">signum</span></span>'', ''<span class="n"><span class="pre">file</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">sys.stderr</span></span>'', ''<span class="n"><span class="pre">all_threads</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span>'', ''<span class="n"><span class="pre">chain</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span>''<span class="sig-paren">)</span></dt> |
− | <dd><p> | + | <dd><p>注册用户信号:为 ''signum'' 信号安装一个处理程序以转储所有线程的回溯,如果 ''all_threads'' 是 <code>False</code>,则转储当前线程的回溯到 '']文件''。 如果链是 <code>True</code>,则调用前一个处理程序。</p> |
− | + | <p>''file'' 必须保持打开状态,直到信号被 [[#faulthandler.unregister|unregister()]] 取消注册:参见 [[#faulthandler-fd|文件描述符问题]] 。</p> | |
− | <code>False</code> | + | <p>在 Windows 上不可用。</p> |
− | <p> | ||
− | [[#faulthandler.unregister| | ||
− | <p> | ||
<div class="versionchanged"> | <div class="versionchanged"> | ||
− | <p><span class="versionmodified changed">在 3.5 | + | <p><span class="versionmodified changed"> 在 3.5 版更改: </span> 添加了对将文件描述符传递给此函数的支持。</p> |
</div></dd></dl> | </div></dd></dl> | ||
<dl> | <dl> | ||
− | <dt>< | + | <dt><span class="sig-prename descclassname"><span class="pre">faulthandler.</span></span><span class="sig-name descname"><span class="pre">unregister</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">signum</span></span>''<span class="sig-paren">)</span></dt> |
− | <dd><p> | + | <dd><p>注销用户信号:卸载[[#faulthandler.register|register()]]安装的''signum''信号处理程序。 如果信号已注册,则返回 <code>True</code>,否则返回 <code>False</code>。</p> |
− | + | <p>在 Windows 上不可用。</p></dd></dl> | |
− | <code>False</code> | ||
− | <p> | ||
第154行: | 第124行: | ||
<span id="faulthandler-fd"></span> | <span id="faulthandler-fd"></span> | ||
− | == | + | == 文件描述符问题 == |
− | [[#faulthandler.enable| | + | [[#faulthandler.enable|enable()]]、[[#faulthandler.dump_traceback_later|dump_traceback_later()]] 和 [[#faulthandler.register|register()]] 保留其 ''file'' 参数的文件描述符。 如果文件被关闭并且其文件描述符被新文件重用,或者如果使用 [[../os#os|os.dup2()]] 替换文件描述符,则回溯将写入不同的文件。 每次替换文件时再次调用这些函数。 |
− | |||
− | |||
− | |||
− | |||
第166行: | 第132行: | ||
<div id="example" class="section"> | <div id="example" class="section"> | ||
− | == | + | == 示例 == |
− | + | 启用和不启用故障处理程序的 Linux 上的分段故障示例: | |
− | |||
<div class="highlight-shell-session notranslate"> | <div class="highlight-shell-session notranslate"> | ||
第175行: | 第140行: | ||
<div class="highlight"> | <div class="highlight"> | ||
− | <pre>$ python3 -c "import ctypes; ctypes.string_at(0)" | + | <pre class="session">$ python3 -c "import ctypes; ctypes.string_at(0)" |
Segmentation fault | Segmentation fault | ||
第193行: | 第158行: | ||
</div> | </div> | ||
+ | |||
+ | </div> | ||
+ | <div class="clearer"> | ||
+ | |||
+ | |||
</div> | </div> | ||
− | [[Category:Python 3.9 | + | [[Category:Python 3.9 文档]] |
2021年10月31日 (日) 04:52的最新版本
faulthandler — 转储 Python 回溯
3.3 版中的新功能。
该模块包含显式转储 Python 回溯、故障、超时或用户信号的函数。 调用 faulthandler.enable() 为 SIGSEGV
、SIGFPE
、SIGABRT
、SIGBUS
和 SIGILL
信号。 您还可以通过设置 PYTHONFAULTHANDLER 环境变量或使用 -X faulthandler
命令行选项在启动时启用它们。
故障处理程序与系统故障处理程序(如 Apport 或 Windows 故障处理程序)兼容。 如果 sigaltstack()
函数可用,该模块使用信号处理程序的替代堆栈。 这允许它即使在堆栈溢出时也可以转储回溯。
故障处理程序在灾难性情况下被调用,因此只能使用信号安全功能(例如 它不能在堆上分配内存)。 由于这个限制,与普通的 Python 回溯相比,回溯转储是最小的:
- 仅支持 ASCII。
backslashreplace
错误处理程序用于编码。 - 每个字符串限制为 500 个字符。
- 只显示文件名、函数名和行号。 (没有源代码)
- 它被限制为 100 帧和 100 个线程。
- 顺序相反:最先显示最近的呼叫。
默认情况下,Python 回溯被写入 sys.stderr。 要查看回溯,应用程序必须在终端中运行。 日志文件也可以传递给 faulthandler.enable()。
该模块是用 C 实现的,因此可以在崩溃或 Python 死锁时转储回溯。
Python 开发模式 在 Python 启动时调用 faulthandler.enable()。
转储回溯
- faulthandler.dump_traceback(file=sys.stderr, all_threads=True)
将所有线程的回溯转储到 文件 中。 如果 all_threads 是
False
,则只转储当前线程。在 3.5 版更改: 添加了对将文件描述符传递给此函数的支持。
故障处理程序状态
- faulthandler.enable(file=sys.stderr, all_threads=True)
启用故障处理程序:为
SIGSEGV
、SIGFPE
、SIGABRT
、SIGBUS
和SIGILL
信号安装处理程序以转储 Python 回溯。 如果 all_threads 是True
,则为每个正在运行的线程生成回溯。 否则,仅转储当前线程。文件 必须保持打开状态,直到故障处理程序被禁用:参见 文件描述符问题 。
在 3.5 版更改: 添加了对将文件描述符传递给此函数的支持。
3.6 版更改: 在 Windows 上,还安装了 Windows 异常处理程序。
- faulthandler.disable()
- 禁用故障处理程序:卸载由 enable() 安装的信号处理程序。
- faulthandler.is_enabled()
- 检查是否启用了故障处理程序。
超时后转储回溯
- faulthandler.dump_traceback_later(timeout, repeat=False, file=sys.stderr, exit=False)
如果 repeat 是
True
,则在 timeout 秒超时后或每隔 timeout 秒转储所有线程的回溯。 如果 exit 是True
,则在转储回溯后以 status=1 调用_exit()
。 (注意_exit()
会立即退出进程,这意味着它不会像刷新文件缓冲区那样进行任何清理。)如果该函数被调用两次,新调用将替换之前的参数并重置超时。 计时器具有亚秒级分辨率。文件 必须保持打开状态,直到回溯被转储或 cancel_dump_traceback_later() 被调用:参见 文件描述符问题 。
此功能是使用看门狗线程实现的。
3.7 版本变更: 此功能现在一直可用。
在 3.5 版更改: 添加了对将文件描述符传递给此函数的支持。
- faulthandler.cancel_dump_traceback_later()
- 取消对 dump_traceback_later() 的最后一次调用。
将回溯转储到用户信号上
- faulthandler.register(signum, file=sys.stderr, all_threads=True, chain=False)
注册用户信号:为 signum 信号安装一个处理程序以转储所有线程的回溯,如果 all_threads 是
False
,则转储当前线程的回溯到 ]文件。 如果链是True
,则调用前一个处理程序。file 必须保持打开状态,直到信号被 unregister() 取消注册:参见 文件描述符问题 。
在 Windows 上不可用。
在 3.5 版更改: 添加了对将文件描述符传递给此函数的支持。
- faulthandler.unregister(signum)
注销用户信号:卸载register()安装的signum信号处理程序。 如果信号已注册,则返回
True
,否则返回False
。在 Windows 上不可用。
文件描述符问题
enable()、dump_traceback_later() 和 register() 保留其 file 参数的文件描述符。 如果文件被关闭并且其文件描述符被新文件重用,或者如果使用 os.dup2() 替换文件描述符,则回溯将写入不同的文件。 每次替换文件时再次调用这些函数。
示例
启用和不启用故障处理程序的 Linux 上的分段故障示例:
$ python3 -c "import ctypes; ctypes.string_at(0)"
Segmentation fault
$ python3 -q -X faulthandler
>>> import ctypes
>>> ctypes.string_at(0)
Fatal Python error: Segmentation fault
Current thread 0x00007fb899f39700 (most recent call first):
File "/home/python/cpython/Lib/ctypes/__init__.py", line 486 in string_at
File "<stdin>", line 1 in <module>
Segmentation fault