编辑:请注意,这个问题特定于 VS Code Python 调试器以及 VS Code 编辑器提供的功能。
我有一个有问题的代码部分。该部分的开头用打印语句装饰,结尾也是如此:
print("starting problematic section") # <-- breakpoint set here
# various calls # <--- program hangs somewhere here if not manually stepping through
print("done.") # <-- breakpoint set here
当我使用调试器手动单步执行代码时,一切正常,并且我同时点击了开始和结束打印语句。
当我删除断点,并且不要手动单步执行代码:程序执行挂起。因此,对于我来说,能够独立于我可能设置的任何断点来查看程序当前正在执行的位置似乎与我相关。
我该怎么做?
我有两个想法:
-
可以编辑器会连续自动跳转到源代码中与程序当前执行位置相关的任何点? (注意:如果没有设置任何断点或任何手动单步执行,就会发生这种情况。) 是否可以检查程序执行的实时更新跟踪/调用堆栈? |(我考虑过一个不可行的想法:在源代码的每一行上设置一个 “日志点”
-
,它会打印出断点的文件/行。显然,在每个文件的每一行上设置一个日志点是不可能,因为这会非常耗时。但是,这个想法说明了我希望我能做什么:当断点/打印语句不够时找出我的程序被卡住的地方。)
(A unfeasible idea I considered: setting a "logpoint" on every single line of source code, which prints out the file/line of the breakpoint. Obviously, setting a logpoint on every line in every file is not possible since it would be awfully time consuming. But, the idea illustrates what I wish I could do: finding out where my program is stuck, when breakpoints/print-statements are not enough.)
听起来在 VS Code 中调试 Python 代码时遇到了问题,程序在没有手动单步执行的情况下会挂起。想在不逐行单步执行的情况下跟踪程序的执行流程。
以下是一些可以帮助解决此问题的技巧和工具:
1. 使用日志记录而不是大量的打印语句
-
问题:
在每个文件中的每一行添加
print
语句非常耗时且难以维护。 -
解决方案:
使用 Python 的内置
logging
模块。日志记录比print
语句更灵活,可以轻松地控制日志级别、将日志输出到文件以及格式化消息。
```python import logging
logging.basicConfig(filename='app.log', level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
def my_function(): logging.debug('my_function 开始执行') # ... 的代码 ... logging.debug('my_function 结束执行') ```
在 VS Code 中,可以使用 "Python: Log Viewer" 扩展名直接在编辑器中查看日志文件。
2. 设置条件断点
- 问题: 不知道程序在哪个特定点挂起,因此不能仅仅依靠在特定行设置断点。
-
解决方案: VS Code 调试器允许设置仅在满足特定条件时才会触发的条件断点。 这在处理循环或递归函数时非常有用。
- 在 VS Code 中,在要设置断点的行号旁边单击以设置断点。
- 右键单击断点,然后选择 "Edit Breakpoint..."。
-
在 "Condition" 字段中输入一个 Python 表达式。 当该表达式的值为
True
时,断点将被触发。
3. 使用全局异常处理程序
- 问题: 的程序可能由于未处理的异常而静默地崩溃。
- 解决方案: 实现一个全局异常处理程序,以捕获任何未处理的异常并记录错误消息或堆栈跟踪。这可以帮助查明程序崩溃的根本原因。
```python import traceback
def global_exception_handler(exctype, value, tb): logging.error("未处理的异常:", exc_info=(exctype, value, tb)) traceback.print_tb(tb)
sys.excepthook = global_exception_handler ```
4. 使用 VS Code 的调试控制台
- 问题: 希望在调试会话期间与代码进行交互并检查变量的值,但不知道如何操作。
-
解决方案: VS Code 的调试控制台允许在程序暂停时执行 Python 代码并检查变量。这对于了解程序状态和调试逻辑错误非常有用。
-
在调试会话期间,"DEBUG CONSOLE" 选项卡将出现在 VS Code 的底部面板中。
- 可以在此控制台中输入任何 Python 代码,并使用它来检查变量、调用函数或执行其他操作。
5. 使用 VS Code 的 "Run and Debug" 功能
- 问题: 可能没有正确配置 VS Code 的调试器设置,导致无法正确捕获断点。
- 解决方案: 确保已正确设置了 launch.json 文件,并选择了正确的调试配置。
- 在 VS Code 中,单击左侧边栏中的 "Run and Debug" 图标(看起来像一只小虫子)。
- 单击 "create a launch.json file" 链接,并选择 "Python" 环境。
-
确保 "stopOnEntry": true 设置为
true
,以便调试器在程序开始时立即暂停。
通过组合使用上述方法,应该能够有效地调试 Python 代码并查明导致程序挂起的原因,而无需在每一步都手动单步执行。
标签:python,visual-studio-code,debugging From: 78776495