首页 > 编程问答 >VS Code 调试器:手动单步执行有问题的代码时不会挂起;否则,它会挂起。编辑器+调试器必须检查哪些工具?

VS Code 调试器:手动单步执行有问题的代码时不会挂起;否则,它会挂起。编辑器+调试器必须检查哪些工具?

时间:2024-07-22 07:02:40浏览次数:13  
标签:python visual-studio-code debugging

编辑:请注意,这个问题特定于 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

相关文章

  • 一个简单的问题(python、串行通信和arduinos)
    只是一个关于小脚本的快速问题,由于某种原因无法工作我运行了这个脚本:importserialimporttimeimportturtledefserialreading():serialPort=serial.Serial(port="COM5",baudrate=9600,bytesize=8,timeout=2,stopbits=serial.STOPBITS_ONE......
  • 我在 Windows 10 上运行 Python 代码后控制台立​​即关闭
    虽然我在代码末尾使用input(),但在Windows10(IDLE之外)的窗口中输入名称后,控制台仍然立即关闭,并且我看不到结果。我该怎么做才能阻止控制台关闭?#!python3name=input('Enteryourname:')print('Hello'+name)input('pressEntertoexit:')你在代码末尾......
  • 具有未定义嵌套列表深度的嵌套列表的Python注释类型
    [[1,2,3],3,[2,4],5]的类型是list[list[int]|int]但是,如果嵌套列表具有未定义的深度,例如[[[1,2]],2,[1,[3,[3]]]],3,[2,[2]]],那么它会具有什么类型?可以使用递归类型提示来表示任意深度嵌套的列表:fromtypingimportList,Union......
  • 在Spyder(Python 3.6)中导入cv2时出现导入错误
    我已经在Windows操作系统中安装了opencv3.0.0。我已运行该应用程序并已成功将其安装在C:\驱动器中,并且还将cv2.pyd文件复制到C:\Python27\Lib\site-packages中,正如我在几个教程视频中看到的那样在我的Python2.7.5Shell中,即当我键入>>>i......
  • Python + VS Code 调试器:可视化我的程序当前正在执行的源代码中的位置?
    当我使用VSCodePython调试器时:我可以执行我的程序,以便编辑器将我逐行带到源代码中的任何位置(跳转到相关文件/如果尚未打开则将其打开)目前的执行情况是?是的,VSCode的Python调试器可以让你逐行执行代码,并实时显示当前执行的位置。以下是操作方法:1.设置断点:......
  • 如何立即取消使用 Ollama Python 库生成答案的 Asyncio 任务?
    我正在使用Ollama通过OllamaPythonAPI从大型语言模型(LLM)生成答案。我想通过单击停止按钮取消响应生成。问题在于,只有当响应生成已经开始打印时,任务取消才会起作用。如果任务仍在处理并准备打印,则取消不起作用,并且无论如何都会打印响应。更具体地说,即使单击按钮后,此函数......
  • 使用 np.array 索引过滤 Python 列表
    谁能向我解释一下列表self.data如何使用numpy索引数组selec_idx进行索引/过滤?完整的课程可在https://github.com/kaidic/LDAM-DRW/blob/master/imbalance_cifar.pydefgen_imbalanced_data(self,img_num_per_cls):new_data=[]n......
  • 尝试在cmd(python)中安装turtle
    当我在cmd中编写pipinstallturtle后,这条消息出现在我面前。有人知道该怎么办吗?C:\>pipinstallturtleCollectingturtleUsingcachedturtle-0.0.2.tar.gz(11kB)ERROR:Commanderroredoutwithexitstatus1:command:'C:\Users\Bruger\App......
  • Python + Polars:如何有效地“fill_null”仅 DataFrame 的某些列?
    例如,假设我只想fill_null(strategy="zero")DataFrame的数字列。我当前的策略是这样做:final_df=df.select(cs.exclude(cs.numeric()))final_df.with_columns(df.select(cs.numeric()).fill_null(strategy="zero"))是否有替代的、更惯用或更有效的方法来实现我......
  • 如何找到 Windows 上 Python 的安装位置?
    我想找出我的Python在Windows上的安装路径。例如:C:\Python25如何找到Python的安装位置?在Windows上查找Python安装位置的方法有很多种:1.使用where命令(推荐方法):打开命令提示符(cmd)。输入以下命令并按回车键:wherepython......