当前位置: 首页 > 网络应用技术

如何有效地开发智能算法?MNN Workbench Python调试详细说明

时间:2023-03-07 02:50:19 网络应用技术

  随着移动互联网的快速发展,人工智能在移动终端上的应用越来越广泛,并且该小组的内部情报在诸如图像识别,视频检测和数据计算之类的核心方案中起着重要作用。开发阶段,python无疑是算法的首选语言。但是,在移动终端上,算法的部署,调试和验证仍处于“剑术和火”的时代。目前,该算法主要将日志插入代码中以验证程序的操作逻辑和结果。

  当然,结果和定位问题可以通过日志验证,但是一旦项目略微复杂,生产效率将非常低。因此,在MNN Workbench中(单击以读取文本末尾的原始文本,转到MNN官方网站:www.mnn.zone下载)嵌入了末端 - 侧python调试能力。经常使用Python的学生必须熟悉PDB模块。这是Python官方标准库提供的交互式代码调试器。像任何语言提供的调试能力一样,PDB提供源代码 - 级别设置断点和用于常规调试的单步执行,是Python开发的非常重要的工具模块。

  今天,让我们专注于分析官方的PDB模块源代码,以查看其调试功能的基本技术原则。

  从CPYTHON源代码可以看出,PDB模块不是由C实现的构建模块,而是在纯Python中实现和封装的模块。核心文件是PDB.PY,它从BDB和CMD模块继承下来:

  基本原理:使用CMD模块定义并实现一系列调试命令交互式输入。基于SYS.SetTrace PIL来跟踪堆栈帧,不同调试命令的操作和断点状态控制代码,并将控制台转移到ConsoleOutput到相应的信息。

  CMD模块主要提供控制台的命令交互。通过RAW_INPUT/READLINE的讨价还价方法,实现了输入等待,然后将命令移交给子类处理决定是否继续循环输入,就像他的主要方法Runloop一样。

  CMD是一个常用的模块,不是专门为PDB设计的。PDB使用CMD框架来实现交互式自定义调试。

  BDB提供了一个用于调试的核心框架,依靠sys.settrace运行代码的单个步骤跟踪,然后将相应的事件(呼叫/线/返回/异常)分发给子类(PDB)处理。BDB的核心逻辑是为了控制调试命令的中断,例如输入单个步骤“ S”命令,以确定是否继续跟踪或中断交互式输入,哪个帧被中断。

  中断控件是,在输入不同的调试命令后,可以将代码执行到正确的位置。等待用户输入。例如,应在运行帧的下一个代码上停止输入“ S”控制台,并且输出“ C”应为“ C”。您需要运行到下一个中断点。中断控制发生在每个步骤中Sys.settrace,这是调试操作的核心逻辑。

  PDB中的四个框架事件主要跟踪:帧:

  在代码跟踪过程中,它们是不同的节点。根据用户输入的调试命令,在帧跟踪的每个步骤中,PDB将被中断。中断控制的主要方法是stop_here:

  调试命令通常分为两类:

  以下侧重于几个通常解释的原理,解释了处理命令中断控制的原理:

  1命令定义

  执行下一个命令。如果此句子是函数调用,则S将执行函数的第一个句子。

  2代码分析

  在PDB中实现逻辑是按顺序执行每个帧并等待执行。其执行粒径与SetTrace相同。

  步骤将将停止框架设置为无,因此,只要当前帧可以返回到底层(Botframe),这意味着您可以等待执行,也就是说,PDB处于交互式状态。

  由于STEP的执行粒径与SetTrace相同,因此它正在等待每个帧执行。

  1命令定义

  执行下一个句子。如果此句子是函数调用,则执行该函数,并执行当前执行语句的下一个句子。

  2代码分析

  在PDB中实现逻辑,下一个跟踪中断运行到当前帧,但是输入下一个帧(函数调用)将不会中断。

  下一步将将停止帧设置为当前帧,也就是说,除非您在当前帧中输入其他帧,否则您将不会执行中断。

  1命令定义

  继续执行直到我遇到下一个断点

  2代码分析

  停止帧设置为botframe,然后将Stoplineno设置为-1.stop_here始终返回false,并且在遇到断裂点之前不会中断操作(建立了break_herere条件)

  1命令定义

  执行当前操作函数到末尾。

  2代码分析

  返回命令仅在执行到末端(函数调用)时被中断,即,在遇到返回事件时会中断它。pdb将将stopframe设置为上一个帧帧,而returnframe当前是- 返回事件,stop_here将始终返回false,不会中断;

  如果是返回事件,则stop_here仍然返回false,但返回框架由当前帧确定,并将中断。

  1命令定义

  执行到下一行之间的区别在于,For循环只会仅跟踪一次

  2代码分析

  将停止帧和返回框架设置为当前帧,而poplineno是当前的lineno+1。

  如果当前帧中有一个循环,则仅在从上到下执行一次。如果函数返回返回事件,则下一个帧的lineno可能小于optlineno,因此将returnframe设置为当前帧,因此函数执行与下一个相同。

  1命令定义

  切换到UP/下一个堆栈框架

  2代码分析

  堆栈框架信息

  堆栈框架包含代码调用路径上的每个帧信息。每个命令执行中断都将被刷新,并且可以通过u/d命令上下切换帧。堆栈帧采集主要通过get_stack方法。第一个参数是帧,第二个参数是追溯对象。在异常事件中生成跟踪对象。异常事件将带来一个arg参数:

  Trackback对象具有几个常用属性:

  堆栈框架信息由两个部分组成。框架的呼叫堆栈和异常堆栈(如果。

  每个PDB执行中断都将更新称为堆栈帧表和当前堆栈帧信息。堆栈切换只需要向上/向下切换索引。

  与过程控件的调试命令不同,断路命令用于设置断点,这不会立即影响过程中断状态,但可能会影响后续中断。当行事件发生时,除了stop_here增加外,添加了Break_here的条件判断。断点的实现相对简单。在这里,当函数设置为设置断点时,代码将执行函数的函数。

  设置断点时,断点的linno是函数的第一行:

  当行事件执行到函数的第一行时,该行不会主动设置断点,而是线路事件的函数函数功能的函数函数函数功能的函数功能的函数功能的函数函数的函数函数的第一行断点的断点将被判断。

  断点的有效性判断通过了有效方法,该方法处理了忽略的配置并启用了通过CheckFuncname方法确定功能断点的有效性:

  当行事件发生在函数的第一行中时,尚未设置func_first_executable_line,因此将其设置为当前行号,并且断点生效。因此,对第一行的函数执行被中断。当行到达后一行时,因为func_first_executable_line已经值得,并且绝对不等于当前行号,因此break_here的判断无效,不会中断。

  以下结合了一个非常简单的Python代码调试示例,请查看上述命令的实现原理:

  在控制台中,命令行执行快照:

  在命令行中支付python test.py。python代码实际上是从第一行执行的,但是由于pdb.set_trace()在__ -main __中调用,因此实际上将其从set_trace的下一行安装到pdb到pdb到pdb,跟踪功能从帧的中断控制开始。

  此Python代码执行将通过3帧:

  调试过程:

  Python标准库提供的PDB的实现并不复杂。本文解释了源代码核心的逻辑。如果您理解其原则,您也可以自己自定义或重写Python调试器。他们已经开发了自己的Python调试器,以更好地适应IDE。但是,了解PDB的原理,重写和定制PDB的调试需求以满足调试需求也是一种低和有效的方法。

  MNN Workbench的终端调试能力也基于本机PDB,并支持由阿里巴巴集团计算出的各种研发方案。它在算法的研究,开发和部署方面具有很大的提高,请阅读原始文本,请访问www.mnn.zone下载MNN Workbench进行体验。

  作者:阿里巴巴移动技术