连接:https://blog.csdn.net/qq_33472146/article/details/90606359?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control

使用Debug调试代码

1.打断点

一个断点标记了一个代码行,当Pycharm运行到该行代码时会将程序暂时挂起。

注意断点会将对应的代码行标记为红色,取消断点的操作也很简单,在同样位置再次单击即可。

如图所示,打了两个断点

83ba8aa441963685c5c4b89d13b5015b.png

当你将鼠标指针悬停在断点上方时,Pycharm会显示断点的关键信息,行号以及脚本属性,如果你希望更改该断点的属性,右击断点:

a9a1683863e22a01739ecc152f423f9d.png

可以尝试对断点属性进行个性化更改,然后观察图标的变化。

2.代码调试

我们有几种方法来debug程序

第一种:通过鼠标右击代码处,可以来debug程序

b7a69c9a4124a7ec0f33d47e66872d12.png

第二种:可以通过点击这个小虫子的图标来进行debug

bc285426c057068431e9c9768e134d8f.png

接下来会Pycharm会执行以下操作:

(1)PyCharm开始运行,并在断点处暂停

(2)断点所在代码行变蓝,意味着Pycharm程序进程已经到达断点处,但尚未执行断点所标记的代码。

(3)Debug tool window窗口出现,显示当前重要调试信息,并允许用户对调试进程进行更改。

在这里介绍一下debug窗口几个图标分别代表的意思

2509d4daf4761b64c290a04192a9e9dc.png

这里一排七个坐标的意思分别是

1.show execution point (F10) 显示当前所有断点

2.step over(F8) 单步调试。

若函数A内存在子函数a时,不会进入子函数a内执行单步调试,而是把子函数a当作一个整体,一步执行

3.step into(F7) 单步调试。

若函数A内存在子函数a时,会进入子函数a内执行单步调试。

4.step into my code(Alt + Shift +F7) 执行下一行但忽略libraries(导入库的语句)

5.force step into(Alt + Shift +F7) 执行下一行忽略lib和构造对象等

6.step out(Shift+F8)当目前执行在子函数a中时,选择该调试操作可以直接跳出子函数a,而不用继续执行子函数a中的剩余代码。并返回上一层函数。

7.run to cursor(Alt +F9) 直接跳到下一个断点

然后接着来看变量查看器

在调试过程中观察变量的状态。我们需要对其设置一个查看器。在Watches窗口中,单击加号,输入期望查看的变量名称,例如这里输入delay,然后回车。我试了三个变量,这里我们看到这三个变量目前都是没被定义的,我们可以在控制台里给它定义,也可以通过执行下一步,利用代码中的赋值来定义。

*注意:*这个眼镜模样的图案是watch窗口(我当时可是找了半天…,网上的都是一些老版本的介绍的watch窗口,=.=)

a19e3b54f9aa614c1119cbbc64495a2f.png

可以通过点击这个图标

4bec8c6533c93a2db48404334c593c0e.png

将这两个窗口连在一起查看

3a5dfc202c08f3f5e7de2c72505f4367.png

OK,接下来我们来看控制台窗口

Console窗口的工作模式:

为什么需要用到Console窗口呢?当我们需要查看程序给出的错误信息,或者进行一些额外的临时运算时,就需要在这个窗口里面进行。

单击左侧工具栏中的命令符按钮,显示Python的命令提示符(在这里,问题又来了,新版的pycharm的那个图标又换了,而且还隐藏的很深,这是怕别人找到了吗。。。)

经过探索,发现在这=.=

0c369575a59b5ec2c822e6bf227ebca0.png

点击这个,即可显示python的命令提示符

976abf9f6466ede816760aeb78f83118.png

在这里做个小测试,这里可以直接编译python代码,执行一些python命令。

bbadbddf1823014f21df75ec5dca8d50.png

介绍完这些,开始进入正式调试代码,我用的小例子的代码如下:

import threading

import time

def get_thread_name():

t = threading.current_thread()

return t.name

def print_time(delay):

"""Define a function for the thread."""

thread_name=get_thread_name()

count = 0

while count < 8:

time.sleep(delay)

count += 1

print("%s:%s" % (thread_name, time.ctime(time.time())))

t1 = threading.Thread(target=print_time, args=(1,))

t2 = threading.Thread(target=print_time, args=(2,))

t1.start()

t2.start()

t1.join()

t2.join()

调试开始,并且在第一个断点处停止,断点所在的行变为蓝色,说明Pycharm已经击中了这个断点,但尚未执行这行代码。

244256a43bf2657dcb976ae919d5a118.png

通过断点调试,在第一个断点处,进行下一步操作,即可得到变量的值的变化情况

292004eb6cda966ea92f8c733b3547d7.png

050f3385cec2691fb3a97ec4796be191.png

最后在介绍一下,可能有时候debug并不能正常进行,控制台会输出如下信息:

e60e9fd23c2f647b9b915705099532ad.png

程序本身应该没有错误,就是不能正常debug。

下面记录几种解决方式:

一、关闭Pycharm,删除工程目录下的.idea文件夹并重启。

二、删除所有的断点。可以点击下图所示的两个叠在一起的红色原点进行操作。

三、点击Pycharm的File>>Invalidate Caches / Restart…,然后选择Invalidate and Restart。这个操作清空了项目中的缓存信息。

四、重建整个工程并重新配置。

这四种方法可能会解决这个问题,我试了第三种,然后第二种应该也是可以的,第一种和第四种小心尝试。

其实之前经常用print来进行调试,这是一种粗暴的方法,可以直接将错误信息打印出来。

嗯,经过一番折腾,也算是对pycharm的debug调试有了一些认识,可能还有一些其它的未掌握的技巧,留着以后慢慢探索吧。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐