Pycharm Debug(断点调试)超详细攻略

2023-11-10

前言

PyCharm Debug 可以帮助开发者在代码运行时进行实时的调试和错误排查,提高代码开发效率和代码质量。当然也可以对源码进行断点调试,领略源码的魅力。

具体操作步骤

准备一段代码

让我们来举个简单的栗子

这段代码主要作用,循环range里面的值并调用自定义的add方法将返回的结果打印

def add(num1, num2):
    return num1 + num2

if __name__ == '__main__':

    for num in range(1, 3):
        result = add(num, num + 1)
        print("result {}".format(result))

放置断点

在你想放置断点的处点击如图所示:

点击后会有一个实心的红点,此刻你的断点已经放置成功啦

启动debug调试

启动debug 的方式有三种:

  • 第一种方法:点击main方法旁边的绿色图标 

  • 第二种方法:选择需要debug的文件,在点击“小乌龟”图标

  • 第三种方法:在代码空白处右键→选择“debug”

以上3种方式,大家根据自己的习惯自行选择

调试界面详解

写到这里,简单的解释下,断点调试的意思就是程序在执行到你打断点位置时,暂时挂起(你可以理解为是等待)此时你可以看到你之前运行程序的一些变量参数等信息

启动调试后我们会看到这样一个界面,这个界面元素有点多,我们慢慢的分析下,先看整体,分为3个区域:

红色部分最为重要主要是控制调试代码的走向

黄色部分主要是查看变量信息

蓝色部分主要是纪录程序运行时的一些调用方法的堆栈信息的纪录,蓝色框可以看出方法被调用的轨迹,每次调用一个方法时,都会在堆栈的顶部添加一个新的帧(这里可以理解为是一行),当一个方法的执行完成时,相应的帧将从堆栈中移除(以后进先出的方式),在文章的后面会有具体的解释,这里可以不用过多的关注

我们先重点介绍下红色部分: ​

我用的Pycharm版本比较老有的图标会和最新的版本有点出入但是不影响使用(如果大家看不清可以点击图片进行预览)

 具体栗子展示

  • 示例一:入门级别

启动debug调试后,当线条变成蓝色的时候表示程序正在运行到这一行,大家注意上面会有一行灰色的字,这个表示num的值当前为1

点击 step  into(进入方法)

我们会看到程序 跳转到了add这个方法当前num1=1;num2=2,并且Frames添加了一行

点击 step over(按行执行代码)

我们看到蓝色的光标又回到了main函数 ,并且Frames少了一行说明add方法已经执行完毕

点击 step over(按行执行代码)

获取了result值=3,此时控制台并没有输出内容

点击 step over(按行执行代码)

控制台输出了内容“result 3”,蓝色的光标重新移到for循环,准备下一轮的循环

点击 step over(按行执行代码)

此刻num=2,进入下一轮的循环

点击 step over(按行执行代码)

此刻num=2 ,result=5,注意这个时候因为我们没有进入方法所以旁边的Frames并没有新增一行

点击 step over(按行执行代码)

此刻控制台输出内容“result 5”,蓝色光标移到for循环准备下一次的循环

点击 step over(按行执行代码)

因下一次的num=3不满足for循环的要求循环结束,整个debug的调试也随之结束

示例二:源码调试

以下代码是连接手机,获取并打印手机的deviceInfo信息,这里我们主要是想通过debug看下pyhon端是如何发送HTTP请求给手机端和手机端返回的信息

前置条件

  • pip install -u uiautomator2
  • 运行 python -m uiautomator2 init
  • 手机打开debug调试,并且连接电脑

准备代码

import uiautomator2 as u2

if __name__ == '__main__':
    device = u2.connect()
    print(device.info)

源码分析添加断点

通过跟踪源码我们可以看到 info()方法先调用的jsonrpc()这个方法,在初始化类的时候会调用__call__方法,在call方法中会调用_jsonrpc_retry_call这个方法于是我们把断点打在了这里,看下是否会走到这个方法,我们继续往下看

_jsonrpc_retry_call这个方法又调用了_jsonrpc_call这个方法,在仔细的看下这个方法我们主要是想得到他的请求体和返回体所以我们把断点打在了这里  

开启调试

蓝色框内我们可以看到是方法的调用栈,红色框框部分是正在运行的地方,证实了我们的猜想是对的,我们直接跳到下一个断点看看

点击 resume program(跳到下一个断点处)

蓝色部分新增了一行表示又调用了一个_jsonrpc_call方法和我们的猜想一样,接下来我们看下res的返回,我们的目的是为了看请求体和响应结果的,仔细看我们看到了一个request的请求对象我们展开看看

红色框部分不就是我们想找的信息嘛,找到了请求体之后我们在看看返回结果,继续找

在request的后面还有一个text的参数,这不就是我们要找的返回内容嘛,因为单行展示有限我们可以通过点击“View”来查看详情,获取更完善的信息

大功告成!我们可以结束断点啦!点击stop"mian"程序运行结束

清除断点

方法一:在原来打断点的地方在点击一下,断点就删除啦

方法二:如果我们打的断点较多,我们一时间找不到,没关系~我们可以点击“View Breakpoints”查看所有断点处,如果你想删除断点可以按“—”进行删除并点击“Done”

忽略断点

如果我们想保留断点位置,又不想让程序执行的时候在断点处挂起,这个时候我们可以点击enbaled让断点不生效

如果我们想忽略所有断点可以点击“Mute breakpoints”

总结

类库的debug的调试会比自己写的代码的调试要复杂点,如果大家想知道源码的方法调用,可以自己先走读下代码在觉得会走的地方打断点,在debug进行验证,也可以直接step over(按行执行代码)但是这样会比较费时间,根据大家自己的选择,debug 的调试刚开始的时候会比较不顺畅当你用多了,就自然懂了。

更多debug调试内容可以参考官方文档:Debug | PyCharm Documentation

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pycharm Debug(断点调试)超详细攻略 的相关文章

随机推荐

  • FI 总账科目(GL),应付款方(供应商),应收款方(客户)的主要数据库表流向及说明

    学习FI模块也有几天了 今天的视频冲击 现在基本有点模型了 现将整理好的成果依次发布出 首先说下该模块中主要数据流向 BSIK 是供应商的未清项表 BSAK 是供应商的已清项表 BSID 是客户的未清项表 BSAD 是客户的已清项表 BSI
  • CentOS利用expect批量推送ssh public key的脚本

    方法1 bin bash Author Razor QQ 254456122 Date 2021 10 29 FileName sshkey sh URL https blog csdn net mandarin meng spm 1019
  • 使用预训练模型运行DiffusionDetection

    工程链接 https github com ShoufaChen DiffusionDet DIffusionDet需要的基础环境及各种包都配置好了 接下来我们开始用Pre trained Model来运行demo py 1 打包下载工程
  • Shell脚本之read用法

    read 默认接受键盘的输入 回车符代表输入结束 read命令选项 p 打印信息 t 限定时间 s 不回显 n 输入字符个数 bin bash clear echo n e Login read acc read p Login acc e
  • python函数练习题讲解

    自学的知识 用来记录一下 练习 1 写一个打印一条横线的函数 提示 横线是若干个 组成 2 写一个函数 可以通过输入的参数 打印出自定义行数的横线 提示 调用上面的函数 3 写一个函数求三个数的和 4 写一个函数求三个数的平均值 提示 调用
  • va_start和va_end详解

    1 在C中 当无法列出传递函数的所有实参的类型和数目时 可以用省略号指定参数表 例如 void foo void foo parm list 2 函数参数的传递原理 函数参数是以栈的形式存取 从右至左入栈 参数的内存存放格式 参数存放在内存
  • 如何查看海思SDK的版本

    命令 cat proc umap vpss 效果如下 第一行的version就是版本信息
  • html学习——表格标签

    表格 1 1 1 2 1 3 2 1 2 2 2 3 3 1 3 2 3 3 table border 1px tr td 1 1 td td 1 2 td td 1 3 td tr tr td 2 1 td td 2 2 td td 2
  • css3直线运动_CSS3实现动画线条运动效果实例集合(一)

    在我们日常的开发中 有时候有的图片 布局块需要加一下边框运动效果 对于这些效果 我们可以使用CSS3动画属性animation 再配合css的一些技巧制作出来 下面是收藏的一些效果实例 1 边框流动效果 html css3效果的内容部分 c
  • 手写一个react-redux,原理一目了然

    react redux的功能如下 Provider 为后代组件提供store connect 为组件提供数据和变更方法 数据变化时自动更新组件 了解react redux的功能移步这里 下面我们开始实现react redux的几个功能 my
  • curl命令忽略不受信任的https安全限制

    用curl命令没有得到返回 还报了个提示 curl 60 Issuer certificate is invalid More details here http curl haxx se docs sslcerts html curl p
  • idea学习系列五之debug及插件的使用

    idea学习系列五之debug及插件的使用 上一篇 介绍了maven及服务器的使用 这里将介绍idea中debug及插件的使用 在实际开发中debug是最常用的了 而且idea相比于eclipse中的debug还新增了一些比较好用的功能 还
  • 微信小程序教你实现双层嵌套菜单栏

    最近在做的项目有这样一个需求 也不太好描述 就是有两个顶部菜单栏 每个二级菜单栏的item都有自己页面 每个页面都可以通过左右滑动来切换 第一个想到的实现方法就是双层swiper嵌套 但想要达到一个联动的效果还是有一点点复杂 去网上找了一圈
  • IT-项目管理(大作业个人报告)

    文章目录 担任角色 开发方法 前端工作 CI CD流水线 担任角色 前端开发 CI CD流程实现 开发方法 基于现有框架Vue或React中的一种 使用iview或antd库 构建前端Web交互界面 对于已收集的需求 小组会议 论坛交流 看
  • 基于IO、NIO、Netty的Java网络程序

    基于IO NIO Netty的Java网络程序 一 IO 1 项目创建 2 代码 3 运行 二 NIO 1 项目创建 2 代码 3 运行 三 Netty 1 项目环境配置 2 代码 3 运行结果 总结 参考文章 一 IO 1 项目创建 在I
  • Junit单元测试,BIO、NIO、AIO概念、Buffer类,Channel通道

    单元测试 Junit介绍 Junit是一个Java语言的单元测试框架 简单理解为可以用取代Java的 部分 main方法 Junit属于第三方工具 需导入jar包后使用 Junit基本使用 Junit的作用 可以单独的运行某一个方法 Jun
  • LeetCode算法,每日一题,冲击字节跳动

    目录 1 LeetCode 20 有效的括号 题目 小编菜解 思路及算法 大神解法 2 LeetCode 26 删除有序数组中的重复项 题目 小编菜解初版 小编菜解改进版 思路及算法 大神解法 3 LeetCode 28 实现strStr
  • cmd停止情况

    情况描述 win10在使用cmd时 鼠标点击后出现cmd整个停止的情况 例如 在下载时 鼠标左键点击了cmd黑框里的内容 结果下载停止了 解决方式 出现这一情况的原因是 cmd开启了快速编辑模式 在cmd上框右键属性 关闭即可
  • 面向对象编程的六大原则

    一 面向对象编程的六大原则 单一责任原则 对类来说的 即一个类应该只负责一项职责 如类A负责两个不同职责 职责1 职责2 当职责1需求变更而改变A时 可能造成职责2执行错误 所以需要将类A的粒度分解为A1 A2 接口隔离原则 客户端不应该依
  • Pycharm Debug(断点调试)超详细攻略

    前言 PyCharm Debug 可以帮助开发者在代码运行时进行实时的调试和错误排查 提高代码开发效率和代码质量 当然也可以对源码进行断点调试 领略源码的魅力 具体操作步骤 准备一段代码 让我们来举个简单的栗子 这段代码主要作用 循环ran