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(断点调试)超详细攻略 的相关文章

  • Python 3 中的递归搜索 JSON/DICT

    我在 Python 3 中实现了一些 API 这些 API 允许我根据班级代码接收有关学校的信息 但我想知道如何通过类代码获取信息 例子 我输入代码GF528S我希望程序告诉我班级 3C INF 地址 Address 1 Milan 如果可
  • 如何在后台运行python程序以保持活动窗口相同

    我编写了一个程序 可以将前景窗口更改为显示器尺寸的 85 并且要成功运行 前景窗口需要保持不变 我已将 python 脚本 pyw 放入批处理文件 运行 pythonw 并在桌面上创建了批处理文件的快捷方式 并提供了快速运行它的快捷方式 我
  • 如何阻止 Django 中发生级联删除?

    我的 Django 应用程序中有三个模型类 class Folder models Model folder models ForeignKey Folder null True blank True related name folder
  • Spark问题中读取大文件 - python

    我已经使用 python 在本地安装了 Spark 并在运行以下代码时 data sc textFile C Users xxxx Desktop train csv data first 我收到以下错误 Py4JJavaError Tra
  • 通过 SSH 的 Pygame 不注册击键(Raspberry Pi 3)

    所以我得到了 raspi 3 和简单的 8x8 LED 矩阵 在玩了一些之后 我决定用 pygame 的事件制作一个简单的蛇游戏 显示在该矩阵上 我之前没有 pygame 的经验 除了 LED 矩阵之外 没有连接任何屏幕 显示器 所以最初的
  • 如何为 apscheduler 指定“记录器”

    我正在尝试学习如何使用 Python 的 apscheduler 包 但它会定期抛出以下错误 No handlers could be found for logger apscheduler scheduler 该消息似乎与计划作业中的错
  • 根据两个预先计算的直方图报告两个样本的 K-S 统计量

    Problem 在这里 我绘制了存储在文本文件中的 2 个数据集 在列表中 dataset 每个包含 218 亿个数据点 这使得数据太大而无法作为数组保存在内存中 我仍然能够将它们绘制为直方图 但我不确定如何通过2 样本KS测试 http
  • 如何使用 tweepy 仅提取主题标签中的文本?

    我想为我的情感分析项目提取主题标签 但是我得到了一个字典列表 其中包含所有主题标签及其在推文中的索引 我只想要文字 我的代码 data tweepy Cursor api search q since a i until b i items
  • self.assertRaises 作为上下文管理器,但 msg 参数未按预期工作

    请检查以下代码 import unittest CORRECT MESSAGE Correct message WRONG MESSAGE Wrong message def fn raise KeyError CORRECT MESSAG
  • 如何在 Mac OS X 10.8 上安装 hg Convert 所需的 python subversion 绑定?

    我正在寻找一种解决方案 最好是干净且简单的 以启用hg convert使用 SVN 存储库在 OS X 10 8 上工作 目前 如果您尝试转换 SVN 存储库 您将得到一个could not load Subversion python b
  • 如何从分组数据创建直方图

    我正在尝试根据 pandas 中的分组数据创建直方图 到目前为止 我已经能够创建标准线图 但我不知道如何做同样的事情来获取直方图 条形图 我想获得泰坦尼克号事故中幸存者和未幸存者的 2 个年龄直方图 看看年龄分布是否存在差异 来源数据 ht
  • 构建一个简单的解析器,能够使用 PyParse 解析不同的日期格式

    我正在构建一个简单的解析器 它接受如下查询 显示 fizi 从 2010 年 1 月 1 日到 2006 年 2 月 11 日的提交 到目前为止我有 class QueryParser object def parser self stmn
  • Keras ImageDataGenerator 相当于 csv 文件

    我在文件夹中排序了一堆数据 如下图所示 我需要构建一个 DataIterator 以便将数据放入神经网络模型中 当数据是图像时 我找到了很多例子来解决这个问题 使用 Keras 类图像数据生成器及其方法流自目录 但当数据是 csv 结构时则
  • 在 Python 中进行模糊键查找的最佳方法?

    我遇到一个问题 我需要在哈希映射中进行模糊查找 即返回与最接近查询的键相对应的值 在我的例子中是通过 Levenshtein 距离测量的 我目前的方法是子类化dict使用特殊的查找方法计算所有键的编辑距离 然后返回得分最低的键的值 基本上是
  • Pandas:将 DataFrame 列值转换为新的 Dataframe 索引和列

    我有一个如下所示的数据框 a b c 0 1 10 1 2 10 2 2 20 3 3 30 4 1 40 4 3 10 上面的数据帧作为默认索引 0 1 2 3 4 我想将其转换为如下所示的数据框 1 2 3 0 10 0 0 1 0 1
  • 在python中打开带有重音符号的文本文件

    我尝试使用 Python 2 7 打开法语文本文件 我使用了命令 f open textfr r 但是当我使用 f read 我失去了重音字符 我明白了u J xc3 xa9tais xc3 xa0巴黎而不是J tais 巴黎等 当在lin
  • 加载 IPython 笔记本时出错

    一旦我用 Jupyter 打开笔记本文件 它要求我转换文件 我就再也无法在标准 IPython 笔记本中打开它了 我收到以下错误 Error loading notebook Bad Request 2014 12 21 04 13 03
  • 使用 MinGW 链接到 Python

    我不想创建一个嵌入Python解释器的跨平台程序 并用MinGW编译它 但是 Python 二进制发行版没有提供 MinGW 链接的库 仅python32 lib对于 Visual C 并且 Python 源包不提供使用 MinGW 编译的
  • ValueError:对于optimize.curve_fit中所需的数组来说对象太深

    我正在尝试拟合化学系统中四个变量 A B C D 的人口增长和衰退的动力学模型 我正在尝试求解以下一组方程 我已将其以矩阵形式附加 方程的矩阵形式 https i stack imgur com ysEdZ png 其中 t 是时间步长 k
  • 在 python 中使用 ftplib 时

    这是导致错误的相关代码 ftp ftplib FTP server ftp login r user r pass change directories to the incoming folder ftp cwd incoming fil

随机推荐

  • 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