pycharm的debug断点调试功能实例详解

相信很多朋友都和我一样,在初期调试python程序的时候喜欢用print大法,觉得哪个地方比较可疑,就在前中后加一堆print。但如果使用IDE,就可以更高效地完成这一任务,今天我们就以pycharm为例一起来看看简单而高效的断点调试到底该如何操作。

我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我,如果有问题欢迎在底下的评论区交流,谢谢。

什么是debug?

在实际操作之前有必要先来点理论知识铺垫一下,这样后面说到那么多按键的功能理解起来就水到渠成了。

调试程序,也叫做debug,就是对于结果不符合预期的程序,将程序执行的过程放慢甚至中途暂停,通过逐步排查中间变量或者输出以定位有故障的代码段的过程。

正常的程序从点击“运行”到返回结果也就一眨眼的功夫,假设在这一眨眼的功夫程序从前到后一共执行了A,B,C三块代码,我们就可以让程序执行完A暂停一下,看看结果是否符合预期,如果符合预期再执行B,执行完B又暂停一下,看看结果是否符合预期。假设B这一段代码结果不符合预期,那我们就可以对B进行逐行逐行更细致地执行和观察,看看到底在哪一步有问题。一直到B也符合要求了,我们再对C依法炮制。最后完成整个代码的调试目的。

通过上面的操作逻辑可以看出,一个debug过程需要用到以下几个工具。

断点

断点(Breakpoint),顾名思义程序运行到这就中断暂停了,等待着用户的指示。一个程序可以设置多个断点。

单步执行

单步执行(Step over),是debug过程中的一个按键,用户每按该按键一次,程序往下运行一行,可以说debug的过程基本就是个不停单步执行的过程。

那假如我很确信接下来10行代码肯定没有问题,能不能中途快速跳过这10行?当然没问题,在第11行设置一个断点,让程序正常运行到断点自动暂停即可。

所以学会设置断点以及单步执行,调试的任务就会了大半

函数

函数的处理要单独拿出来说一下。当主程序调用了一个自定义函数的时候,分为两种情况:

  • 假如很确定这个函数的代码正确无误,直接按一下单步执行,把这个函数调用当作一步来处理。等这个函数执行完毕,继续在主程序下一行代码等待用户操作
  • 假如还想进入这个函数内部看看执行细节,就需要执行进入函数(Step into)操作。Debug程序就会停留在函数的第一行等待用户操作。函数内单步运行到一半,又觉得函数没什么问题,也可以利用跳出函数(Step out)操作将函数运行完毕,继续在主程序下一行代码等待用户操作

Debug的常规操作,就是在特定地点设置好断点,进入debug模式开始跑程序,断点开始单步执行。遇到函数可以选择进去或者不进。想跳过某一段代码就设置另一个断点,让程序正常运行过去。如此反复。

pycharm的debug界面

下面打开pycharm实际看一下debug的操作界面是啥样子的。

进入debug模式

如图所示,在正常的代码编辑页面,界面上方在代表运行的绿色三角形右边,有一个甲壳虫一样的图标,点击一下就会对当前的这个文件进行debug
1-debug.png

当然进入debug的方法不止这一种,在代码编辑区域点击右键,也会看到debug的选项
2-debug2.png

最后一种方法,如果有if __name__ == '__main__'语句出现,会自动在其左边出现一个绿色小箭头。点击小箭头可以选择debug
3-debug3.png

debug界面

我的主程序如下所示

if __name__ == '__main__':
    a = input('Please input an integer:')
    result = classify(int(a))
    print(result)

我在执行自定义函数的result = classify(int(a))这一行左面的行号码旁边点一下设置一个断点。断点用一个粉红色的红点表示。
4-breakpoint.png

然后按一下上面的甲壳虫按钮进入debug模式,假如代码运行到断点处,设置了断点的这一行会变蓝,表示等待执行

此时界面下方弹出了console,是程序提示我输入一个数字,也就是说运行到了a = input('Please input an integer:')这一行了
5-console.png

我输入一个数字,回车,注意这时候的变化:

  • 断点行变蓝,表示程序运行到了断点处(断点行还未执行)
  • 界面下方自动进入debugger,可以看到一堆竖着的和横着的按钮,以及一个大的区域显示着变量的名字,数据类型和值,例如我刚才输入的数字5,这里是string类型

6-debugger.png

按钮介绍

先来看看竖着的一排按钮
7-vertical-buttons.png

  • rerun
    快捷键Ctrl + F5,重新用debug模式跑程序
  • resume program
    快捷键F9,继续运行程序到下一个断点处,没有断点就直接将程序运行到结尾
  • pause program
    暂停程序,基本不会使用
  • stop program
    快捷键Ctrl + F2,停止程序,用于中途退出debug模式,返回代码编辑模式
  • view breakpoints
    查看所有的断点,可以选择其中某些去激活
  • mute breakpoints
    直接对所有断点去激活

还有左下角有个螺丝一样的按钮,可以对debugger界面的显示做一些设置,例如是否在程序中显示该行变量的值等等。

再来看看横着的一排按钮
8-horizontal-button.png

  • console
    回到console窗口,例如需要和程序交互或者是查看程序的打印
  • show execution point
    快捷键Alt + F10,代码窗口跳转到待执行的那一行,也就是标蓝色的那一行
  • step over
    快捷键F8,前面提到的单步执行
  • step into
    快捷键F7,前面提到的进入函数
  • step into my code
    快捷键Alt + Shift + F7,也是前面提到的进入函数,不过只进入自定义的函数
  • step out
    快捷键Shift + F8,前面提到的执行完函数并跳出函数
  • run to cursor
    快捷键Alt + F9,程序运行到光标处,不用设置断点了
  • evaluation expression
    计算表达式,可以利用函数的中间变量去做一些计算

实例演示

知道了各个按钮的作用,我们一起来用一个实例演示一下。

代码文件内容如下

#! /usr/bin/env python
# -*- coding: utf-8 -*-
'''
Demo pycharm debug usage

T型人小付@CSDN
'''

def incr_by_one(num):
    print('Increase by one.')
    return num+1


def incr_by_two(num):
    print('Increase by two.')
    return num+2


def classify(num):
    print('if num is odd, increase by one; if num is even, increase by two.')
    if num % 2 == 0:
        result = incr_by_two(num)
    else:
        result = incr_by_one(num)
    return result


if __name__ == '__main__':
    a = input('Please input an integer:')
    result = classify(int(a))
    print(result)

定义了三个函数,主程序中会进入classify做一个判断,如果输入的整数是奇数,执行incr_by_one函数,如果是偶数执行incr_by_two函数。

刚才程序已经运行到了断点处暂停,我按下step into按钮进入classify函数内进行单步执行,可见蓝色已经到了classify函数的第一行,如下
9-classify.png
在下面的变量显示窗口可以看到num的值为5,我再连按两次step over,蓝色跳过if下的内容直接跳到了else语句处,如下
10-else.png
我不想进入incr_by_one函数,所以直接按step over让它直接执行完毕,蓝色跳转到了return语句,下面显示变量result的值为6,如下
11-return.png
执行完毕,我们跳转到console窗口,可以看到函数打印的内容符合刚才的执行顺序,如下
12-console.png
这样一次简单的debug调试过程就结束了

总结

pycharm是一个非常强大的工具,我这里抛砖引玉,大家如果还有自己觉得好用的pycharm调试小技巧也欢迎在下面分享给我哈,谢谢。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值