当前位置:文档之家› 断点和日志

断点和日志

断点和日志
断点和日志

调试,测试与日志

问题

“程序的显示看起来有点问题,你能不能修改一下?”

“没问题,改完我就提交给你。”

“不会太久吧?”

“5分钟就够了!”

在软件开发过程中,这种场景屡见不鲜,但是,看起来很见的任务,其实往往不是那么简单。

当修改了部分代码之后,程序不是像我们想象的那样工作,奇奇怪怪地问题开始出现,我们开始设置

一个个的断点,一遍一遍地重复执行,眼睛紧紧盯着显示器上的监视窗口,时间在飞快地流逝,然而,我们的思路却渐渐变得模糊......有的时候,甚至没有监视到希望的步骤,不得不再一次重新开始。

调试

调试,又称 Debug,是开发工具赋予我们的一大利器,允许我们将程序的执行过程暂停在某一个点上,然后仔细观察当前程序的执行状态,以便于发现错误的蛛丝马迹。因此,成为程序员解决开发中

问题的终极武器,甚至有的程序员在没有调试器的情况下,难以解决问题。

但是,有的程序确实是难以调试的,例如,已经部署到客户环境中的程序,或者是 Windows 的服务

程序,这个时候,我们是没有调试器可用的,那么,我们怎么办呢?

于是,问题来了,我们为什么一定要调试呢?

通过调试器,我们可以知道程序的运行状态。

那么,我们为什么要知道程序的运行状态呢?

因为程序太复杂了,我们不能一目了然地知道程序的运行状态。

测试

还有一种解决开发中问题的思路称为测试,又称为 Test,通过为程序编写一个个的测试用例,来保证程序在我们的掌控之中。由于从程序的第一步开始,我们就会通过测试来保证程序的正确,那么,在

每一次的修改之后,我们就可以迅速地发现修改造成的影响。

为了保证能够迅速写出测试,测试驱动的开发会强制你写出短小易懂、功能内聚、耦合松散的代码,

把你从调试中解放出来。

但是,对于复杂的操作,我们就不需要知道程序的状态了吗?完全通过测试就可以解决所有的问题吗?

当然不是,不过,可以借助于日志来帮助我们记录程序的状态。而不再需要我们紧盯着监视窗口。

日志

日志,又称为 Log,是我们开发人员的又一利器,其实,不管是在调试还是测试的时候,日志都可以

帮助我们解决问题,不过,很多的程序员迷恋于调试器,而忽视了日志。尤其是在测试驱动的开发中,日志更是我们的得力助手。

所谓的日志,其实是一种记录机制,允许我们在程序代码中插入一些特殊的输出代码,将程序当前的

运行状态随时输出,以便于在无人值守的情况下记录信息,在事后对程序的处理过程进行分析。

最简单的日志就是直接通过 Console 来输出,或者使用 alert, 或者MessageBox来输出,没准你

就使用过这些手法。这些方法会给程序带来副作用,在开发完成之后,往往需要你手工删除。不删除

的话会造成程序的效率问题。要是又发现有新的问题存在呢?是不是又要再来一遍?这可是开发人员

的噩梦呀!

一个完善的日志系统绝不是简单地在控制台输出,它至少需要支持下面的几个特征:

?使用一种方式就支持输出到多个目的地,例如:控制台,文本文件,数据库,甚至电子邮件等等。?允许控制输出的级别,过滤输出的内容,而不需要大幅度修改日志程序

?使用简单,可以使用简单的语法来记录日志

目前,存在着多个成熟的日志系统供我们选择,在 .NET 开发平台上,主要有两个日志系统:.NET

平台直接支持的日志系统和开源的 Log4Net。

今天,我们先看看 .NET 平台内置的日志系统。

这里我们首先了解三个概念:

?日志器:用来发送日志,在开发中,主要是用日志器来输出日志信息。

?监听器:日志器用来输出日志信息,日志信息输出到哪里呢? 监听器用来完成实际的日志记录功能,在日志系统中,存在多种监听器,用来将日志信息记录到不同的目的地。

?日志控制开关:在软件生命周期的不同阶段,我们需要不同的日志信息,在开发阶段,可能需要比较详细的日志来检查错误,在运行阶段,大部分的问题已经被处理,我们可能仅仅需要记录一些关键信息,通过控制开关,可以在不需要修改代码的情况下,调整日志输出的内容。

在 .NET 中,关于日志处理的相关类型,定义在命名空间System.Diagnostics中,有两个预定义的

日志器类型,Debug 和 Trace。

这两个日志记录器的工作机制是相同的,区别仅仅在于 Debug 仅仅在编译器定义了 DEBUG 常量的

情况下工作,而 Trace 仅仅在定义了 TRACE 常量的情况下工作,默认情况下,当我们使用 Debug

模式编译的时候,默认已经定义了这两个常量。所以,不管使用 Debug 还是 Trace 都可以输出日志

信息。如果我们将程序编译为发布模式,那么,将仅仅定义TRACE 常量,导致忽略Debug 的存在,只记录 Trace 的日志信息。

我们先看一看监听器,以便能够看到输出的日志信息。

所有的监听器都要从TraceListener 派生,这是定义在命名空间System.Diagnostics中的一个抽

象基类。通常我们直接使用系统的一些派生类。

作为文本格式的日志,System.Diagnostics.TextWriterTraceListener又有几个常用的派生类

Debug 和 Trace 使用相同的监听器,默认情况下,在它们的监听器集合属性 Listeners 中,已经添

加了一个System.Diagnostics.DefaultTraceListener的实例,以便输出到 Visual Studio 的Output 窗口中,所以,在使用了日志之后,我们可以打开 Output 窗口来看看实际的输出。如果我

们希望能够在控制台窗口中看到输出,那么只需要增加一个ConsoleTraceListener就可以了。

当然,在实际的开发中,我们可能需要的是一个文本文件,现在,你还需要提供一个文件名了。

这些监听器也可以不在程序中固定声明,而是通过配置文件来更加方便地定义。这样的话,我们就可

以动态地修改监听器,而不需要修改我们的代码了。

在程序的配置文件中,配置节system.diagnostics用来定义日志的配置参数,其子元素 trace 定义

日志的参数,trace 的子元素 listeners 定义日志的监听器。我们可以通过下面的配置参数来增加一

个文件的监听器。其中的initializeData用来配置文件名。

当监听器配置好之后,就可以使用日志器输出日志了。不管是 Debug 还是 Trace 都提供了多个方法来输出日志。

最简单的方式就是使用WriteLine来输出日志,就跟使用 Console 一样。

不过,对于日志来说,存在的一个问题就是,我们并不总想输出所有的日志,比如程序已经经过测试,我们可能并不需要大量的日志信息来干扰我们,怎么减少实际输出的日志呢?修改程序当然不是一个

好主意,我们可以通过条件输出来限制输出的日志内容,仅仅在某种条件下,才输出日志,通过WriteLineIf,我们可以指定一个条件,仅仅当条件满足的时候,才会输出日志。

条件仅仅是一个条件,什么样的条件都可以,只要你需要。

为了方便使用,在 .NET 中又提供了一个日志的开关,来方便我们指定条件,所谓日志的开关其实就

是一个从 0 到 4 的整数,通过一个枚举TraceLevel来方便使用这个整数

?0. 关闭,不希望输出日志

? 1. 错误级别的日志

? 2. 建议输出错误和警告级别的日志

? 3. 一般信息的日志也输出

? 4. 详细日志

不过,实际上输出什么日志还是看你的日志输出语句,你在日志输出语句中可以通过这个开关来判断

该不该输出。

那么,这个开关从哪里取得呢?还是配置文件。在配置文件的system.diagnostics中,子元素switches 用来配置一个日志级别,你需要为你的级别起一个名字,以便在程序中

取得这个设置。

在程序中,你可以这样取得配置文件中日志的开关

在程序中,你可以通过这个开关的设置来决定输出什么,配合开关的级别,在 Trace 中又提供了几个匹配的方法

当然,它们仅仅用来输出分类的日志,注意,判断是否输出是你的事情,所以,程序的代码往往如下:

Visual Studio调试之断点进阶篇

在上一篇文章Visual Studio调试之断点基础篇里面介绍了什么是断点,INT 是Intel 系列CPU的一个指令,可以让程序产生一个中断或者异常。程序中如果有中断或者异常发生了以后,CPU会中断程序的执行,去一个叫做IDT的部件查找处理这个中断(或者异常)的例程(Handler)。IDT是操作系统在启动的时候初始化的,至于IDT的细节问题,例如什么是IDT,怎样编写一个IDT的例程,怎样初始化IDT,可以去网上搜索一些资料。 总之,这里我们只要知道,CPU在执行程序指令过程中,碰到INT 3中断程序的执行,CPU 然后去IDT表里面找到处理断点的例程入口。这个例程要做的事情就是: 1.先看看机器里面是不是安装了一个调试器—记住,这一步很重要,之所以重要以 后的文章里面会介绍。 2.如果机器里面没有安装调试器,那么操作系统就会终止程序的执行。 3.否则操作系统启动调试器,并将调试器附到进程上。 4.这样,我们才能在调试器里面检查程序内部变量的值。 前面文章里面的INT 3 (或者DebugBreak(),或者Debugger.Break())指令是我们自己在代码里面硬编码进去的,因此我们在Visual Studio里,在相应的代码行里面点一下,出现一个小红球,也就是说Visual Studio在程序指令集某个地方动态地添加了一个INT 3指令。现在的问题来了,Visual Studio是如何在程序中正确找到插入INT 3指令的位置的? 或者更具体一些,我们在源代码(文本文件)里面设置断点的,Visual Studio需要把代码行翻译成在程序指令集中的位置。Visual Studio之所以需要做翻译,是因为通常一行C++或者C#代码都会对应好几行汇编指令。 因此,Visual Studio需要一个额外的文件来执行这个翻译过程,这个额外的文件叫做调试符号文件(Symbols),是由编译器生成的。Visual Studio系列的编译器,不论是C#、https://www.doczj.com/doc/2e5092014.html,还是C++编译器都会生成这个调试符号文件,.pdb 文件。所以如果你花一点时间看看Debug文件夹的话,你就会发现这个文件。 因此我们来看看Visual Studio支持的各种断点,并解释各种断点的实现方式 条件断点 首先我们先看看如何设置条件断点,条件断点有两种,一种是根据触发的次数来设置,另外一种是根据一条预置的条件来设置。 根据触发次数设置 比如说,你有一个循环,循环1000次,你知道有一个BUG总是在500次之后才会出现,因此肯定希望在循环内设置一个断点,但是前面500次都不会触发这个断点,否则连续按500次的F5的确不是一件轻松的差事。

设计更改断点控制流程

南京依维柯汽车有限公司管理标准 设计更改断点控制流程 NAVECO/G0413-2011 版/次:A/0 1目的和范围 1.1本办法规定了设计更改断点控制的流程,以期达到对产品设计更改计划过程受控管理,快速服务于设计更改件的验证;对新旧物料顺利切换,以减少滞库物料,减低供应链损失。 1.2本办法适用于公司现生产产品设计更改和新品开发设计冻结后更改的计划监督和断点管理。 2引用(相关)标准和文件 NAVECO/G 0401产品设计控制流程 NAVECO/G 0403产品设计更改流程 NAVECO/G 0617外购生产物料库存控制和外购滞库物料处置管理办法 3定义 3.1产品设计更改 指在系统(零部件)的基本功能不变的前提下/不影响整车配置的情况下,对稳定批产或新品开发中设计已冻结的产品的外观、结构、性能、材料等做的更改。 4职贲 4.1物流部 a)负责组织设计更改过程管理; b)负责组织设计更改申请的初审、评审、报批及跟踪; c)负责再更改物料的接收、标记、贮存、发交; d)负责综合评估最利公司利益的原则制订老状态件的减货计划,并负责对供应链旧状态物料按计划处置。 4.2采购部 a)负责完成产品设计更改零部件的PPAP; b)负责监督供方按技术状态做好开发件的标识。 4.3产品工程部 a)负责产品设计更改申请审批中技术方案可行性的评估; b)负责按产品设计流程完成更改件开发; 第1页

版/次:A/0 NAVECO/G0413-2011 c)负责车型装置级PBOM的维护。 第2页

4.4质量保证部 a)负责产品设计更改申请审批中品质提升的评估; b)负责对滞库物料质量的判定。 4.4财务部 a)负责产品设计更改申请审批中成本的评估。 b)负责滞库物料处置方式的会签和滞库物料返工、返修费用的审核。4.5各工厂/分公司 a)负责产品设计更改申请审批中工艺可行性的评估。 b)负责装置下级PBOM的维护。 5管理流程 5.1设计更改与断点控制流程 5.1.1流程图 第3页

AS断点调试

1.设置断点 选定要设置断点的代码行,在行号的区域后面单击鼠标左键即可。 2.开启调试会话 点击红色箭头指向的小虫子,开始进入调试。 IDE下方出现Debug视图,红色的箭头指向的是现在调试程序停留的代码行,方法f2()中,程序的第11行。红色箭头悬停的区域是程

序的方法调用栈区。在这个区域中显示了程序执行到断点处所调用过的所用方法,越下面的方法被调用的越早。 3.单步调试 3.1 step over 点击红色箭头指向的按钮,程序向下执行一行(如果当前行有方法调用,这个方法将被执行完毕返回,然后到下一行) 3.2 step into 点击红色箭头指向的按钮,程序向下执行一行。如果该行有自定义方法,则运行进入自定义方法(不会进入官方类库的方法)。具体步骤如下:在自定义方法发f1()处设置断点,执行调试

点击

3.3 Force step into 该按钮在调试的时候能进入任何方法。 3.4 step out 如果在调试的时候你进入了一个方法(如f2()),并觉得该方法没有问题,你就可以使用stepout跳出该方法,返回到该方法被调用处的下一行语句。值得注意的是,该方法已执行完毕。 3.5 Drop frame

点击该按钮后,你将返回到当前方法的调用处(如上图,程序会回到main()中)重新执行,并且所有上下文变量的值也回到那个时候。只要调用链中还有上级方法,可以跳到其中的任何一个方法。 4. 高级调试 4.1 跨断点调试 设置多个断点,开启调试。

想移动到下一个断点,点击如下图: 程序将运行一个断点到下一个断点之间需要执行的代码。如果后面代码没有断点,再次点击该按钮将会执行完程序。 4.2 查看断点

如何高效使用GDB断点

在gdb中,断点通常有三种形式 断点(BreakPoint): 在代码的指定位置中断,这个是我们用得最多的一种。设置断点的命令是break,它通常有如下方式: 可以通过info breakpoints [n]命令查看当前断点信息。此外,还有如下几个配套的常用命令: 观察点(WatchPoint): 在变量读、写或变化时中断,这类方式常用来定位bug。

捕捉点(CatchPoint): 捕捉点用来补捉程序运行时的一些事件。如:载入共享库(动态链接库)、C++的异常等。通常也是用来定位bug。 捕捉点的命令格式是:catch ,event可以是下面的内容 自动删除。 捕捉点信息的查看方式和代码断点的命令是一样的,这里就不多介绍了。 在特定线程中中断 你可以定义你的断点是否在所有的线程上,或是在某个特定的线程。GDB很容易帮你完成这一工作。

break thread break thread if ... linespec指定了断点设置在的源程序的行号。threadno指定了线程的ID,注意,这个ID是GDB分配的,你可以通过"info threads"命令来查看正在运行程序中的线程信息。如果你不指定thread 则表示你的断点设在所有线程上面。你还可以为某线程指定断点条件。如: (gdb) break frik.c:13 thread 28 if bartab > lim 当你的程序被GDB停住时,所有的运行线程都会被停住。这方便你你查看运行程序的总体情况。而在你恢复程序运行时,所有的线程也会被恢复运行。那怕是主进程在被单步调试时。 在特定条件下中断 条件断点的一种特殊场景是在断点命中指定次数后停下来。事实上每个断点都有一个 ignore count, 他是一个正整数。通常情况下它的值为0,所以看不出来它的存在。但是如果它是一个非0值, 那么它将在每次命中后都将 count 减 1,直到它为 0. ignore bnum count 恢复程序运行和单步调试 在gdb中,和调试步进相关的命令主要有如下几条: 参考资料

断点管理系统实用实用标准1

1.0目的 本标准致力于识别和控制产品断点过程中的各种风险,提前做好预警和准备,避免断点产品在公司内部及客户处预期使用和不必要的浪费,减少客户(内部客户、外部客户)抱怨。 2.0 范围 适用于公司内外所有需要断点的成品、半成品、在制品、原材料、辅料的管理和控制。 3.0 内容 3.1 术语: 3.1.1断点:在客户车型停产、客户工程更改、公司内部设计变更、质量改善等情况下需要对更改前产品、材料的管理和处置的控制时间点。主要断点包括常规、可预见、可控制的断点和突发性、不可遇见的断点。 3.1.2断点信息:断点描述和断点提出后个各责任部门需要提交的信息,对信息评审和沟通后的结果,决策和通知内容; 3.1.3断点预警:断点主导人在客户提出断点或公司内部提出断点前,就需要通过与客户的积极沟通提前拿到断点的预警信息,并及时将该信息进行评审后组织正式断点前的预警断点会议,提

前识别风险,将损失降到最低。 3.1.4断点的分类:涉及到产品的包装方式变更的断点(公司内部变更断点、客户要求的变更断点)、涉及到产品和原材料及辅料变更的断点(公司内部变更断点、客户要求的变更断点)。3.1.5断点的方式:自然断点(有充分的时间,让老状态的产品、辅料、包装消耗完毕后形成的断点)、垂直断点(客户直接提出时就立即实施断点方式)。 3.2 相关标准: 3.2.1《4M变更管理程序》《呆滞物料管理程序》《不合格品管理程序》 4.职责 4.1 物流部是断点管理的归口管理部门,负责客户车型停产引起断点的预警、库存统计汇总、组织评审分析控制断点,并对断点中变化点的应对措施进行验证,对整个断点的执行效果负责; 4.2技术中心负责新项目工程变更引起的断点预警、发起、汇报、组织评审分析、控制断点,并对断点中变化点的应对措施进行验证,对整个断点的执行效果负责; 4.3 质量部负责断点产品的标识及质量问题引起的断点预警、发起、汇报、组织评审分析、控制断点,并对断点中变化点的的应对措施进行验证,对整个断点的执行效果负责。 4.4 制造部负责断点时的在制品库存排查、隔离。 4.5 物流部采购组及采购部负责产品断点时对供应商的断点信息的通知、库存排查、处置跟踪4.6制造工程师负责量产产品改善引起的断点的预警、发起、汇报、组织评审分析、控制断点、并对断点中变化点的应对措施进行验证,对整个断点的执行效果负责 4.7市场部负责客户断点信息的传达及客户垂直断点引起的公司产品损失的沟通。 5.规定描述: 5.1 客户车型停产引起产品断点的管理规定见《车型断点管理过程价值流程图》; 5.2 客户要求的工程变更引起的产品断点管理规定见《工程变更断点管理过程价值流程图》;

eclipse断点调试指导

1.进入debug模式(基础知识列表) 1、设置断点 2、启动servers端的debug模式 3、运行程序,在后台遇到断点时,进入debug调试状态 ============================= 作用域功能快捷键 全局单步返回F7 全局单步跳过F6 全局单步跳入F5 全局单步跳入选择Ctrl+F5 全局调试上次启动F11 全局继续F8 全局使用过滤器单步执行Shift+F5 全局添加/去除断点Ctrl+Shift+B 全局显示Ctrl+D 全局运行上次启动Ctrl+F11 全局运行至行Ctrl+R 全局执行Ctrl+U ============================= 1.Step Into (also F5) 跳入 2.Step Over (also F6) 跳过 3.Step Return (also F7) 执行完当前method,然后return跳出此

method 4.step Filter 逐步过滤一直执行直到遇到未经过滤的位置或断点(设置Filter:window-preferences-java-Debug-step Filtering) 5.resume 重新开始执行debug,一直运行直到遇到breakpoint。 例如:A和B两个断点,debug过程中发现A断点已经无用,去除A 断点,运行resume就会跳过A直接到达B断点。 6.hit count 设置执行次数适合程序中的for循环(设置breakpoint view-右键hit count) 7.inspect 检查运算。执行一个表达式显示执行值 8.watch 实时地监视对象、方法或变量的变化 9.我们常说的断点(breakpoints)是指line breakpoints,除了line breakpoints,还有其他的断点类型:field(watchpoint)breakpoint,method breakpoint ,exception breakpoint. 10.field breakpoint 也叫watchpoint(监视点) 当成员变量被读取或修改时暂挂 11.添加method breakpoint 进入/离开此方法时暂挂(Run-method breakpoint) 12.添加Exception breakpoint 捕抓到Execption时暂挂(待续...) 断点属性: 1.hit count 执行多少次数后暂挂用于循环 2.enable condition 遇到符合你输入条件(为ture\改变时)就暂挂 3.suspend thread 多线程时暂挂此线程 4.suspend VM 暂挂虚拟机 13.variables 视图里的变量可以改变变量值,在variables 视图选择变

断点回归设计的步骤

近在做一个需要利用断点回归设计的研究。为了保证实践的规范性,并且避免未来审稿中可能面对的质疑,花了几天时间梳理了一下断点回归设计的标准操作,整理出来,供来人参考。本文参考了三篇文献,先摆在这里,建议大家去读原文: 第一篇:Lee, and Lemieux, 2010," Regression Discontinuity Designs in Economics ",Journal of Economic Literature, Vol. 48: 281–355. 第二篇:Pinotti, Paolo. "Clicking on heaven's door: The effect of immigrant legalization on crime." American Economic Review107.1 (2017): 138-68. 第三篇:Thoemmes, Felix, Wang Liao, and Ze Jin. "The Analysis of the Regression-Discontinuity Design in R." Journal of Educational and Behavioral Statistics 42.3 (2017): 341-360. 1.断点回归常规操作流程 第1步检查配置变量(assignment variable,又叫running variable、forcing variable)是否被操纵。这里的配置变量,其实就是RD中决定是否进入实验的分数(Score),是否被操纵的意思就是,是否存在某种跳跃性的变化。在实际操作中有两种方式来检验,一是画出配置变量的分布图。最直接的方法,是使用一定数量的箱体(bin),画出配置变量的历史直方图(histogrm)。为了观察出分布的总体形状,箱体的宽度要尽量小。频数(frequencies)在箱体间的跳跃式变化,能就断点处的跳跃是否正常给我们一些启发。从这个角度来说,最好利用核密度估计做出一个光滑的函数曲线。二是利用McCrary(2008)的核密度函数检验。(命令是DCdensity,介绍见陈强编著的《高级计量经济学及Stata应用》(第二版)第569页), Frandsen (2013)提出了一种新的检验方法,但目前被使用 的并不多。 第2步画因变量均值对配置变量的散点图,并选择带宽(bandwidth selection)。首先,挑选出一定数目的箱体,求因变量在每个箱体内的均值,画出均值对箱体中间点的散点图。一定要画每个箱体平均值的图。如果直接画原始数据的散点图,那么噪音太大,看不出潜在函数的形状。不要画非参数估计的连续统,因为这个方法自然地倾向于给出存在断点的印象,尽管总体中本来不存在这样的断点。然后,选择第三步骤中需要的带宽。Lee和Lemieux(2010)介绍了两种确定最优带宽的方法:拇指规则法(rule of thumb)和交叉验证法(CV)。还有另外两种比较受关注的方法:IK法和CCT法。IK法以Imbens和Kalyanaraman两个人命名,对应着论文Imbens和Kalyanaraman(2012)。这篇论文发表在Review of Economic Studies,Lee和Lemieux(2010)文中提到过此文2009年的NBER工作论文版。CCT法以Calonico、Cattaneo和Titiunik三个人命名,对应着论文Calonico、Cattaneo和Titiunik(2014a)。用非参数法做断点回归估计时的stata命令rd,就是用IK发确定最优带宽。stata命令rdrobust、rdbwselect,提供CV、IK、CCT三种不同的最优带宽计算方法选项。但是实际上rdrobust中已经更新了IK带宽选择函数,更新的算法与IK算法的区别有待考证,后续会补充。实际操作中一般是两种算法都会采纳,并汇报参数估计对带宽选择是不敏感的。

WinDBG技巧:设断点命令详解

WinDBG技巧:设断点命令详解(bp, bu, bm, ba 以及bl, bc, bd, be) WinDBG 提供了多种设断点的命令:bp, bu, bm, ba bp命令是在某个地址下断点,可以bp 0x7783FEB 也可以bp MyApp!SomeFuncti on。对于后者,WinDBG 会自动找到MyApp!SomeFunction对应的地址并设置断点。但是使用bp的问题在于:1)当代码修改之后,函数地址改变,该断点仍然保持在相同位置,不一定继续有效;2)WinDBG 不会把bp断点保存工作空间中。所以,我比较喜欢用bu 命令。 bu 命令是针对某个符号下断点。比如bu MyApp!SomeFunction。在代码被修改之后,该断点可以随着函数地址改变而自动更新到最新位置。而且bu 断点会保存在Win Dbg工作空间中,下次启动Windbg 的时候该断点会自动设置上去。 另外,在模块没有被加载的时候,bp 断点会失败(因为函数地址不存在),而bu 断点则可以成功。新版的WinDBG中bp失败后会自动被转成bu 。 bm命令也是针对符号下断点。但是它支持匹配表达式。很多时候你下好几个断点。比如,把MyClass 所有的成员函数都下断点:bu MyApp!MyClass::*,或者把所有以CreateWindow开头的函数都下断点:bu user32!CreateWindow* 。 以上三个命令是对代码下断点,我们还可以对数据下断点。 ba命令就是针对数据下断点的命令,该断点在指定内存被访问时触发。命令格式为 ba Access Size [地址] Access 是访问的方式,比如e(执行),r(读/写),w(写) Size是监控访问的位置的大小,以字节为单位。值为1、2或4,还可以是8(64位机)。 比如要对内存0x0483DFE进行写操作的时候下断点,可以用命令ba w4 0x0483DFE 这里顺便提以下其他断点命令: bl列出所有断点

VS环境断点调试技巧_85920453_597709898

VS环境断点调试技巧 设置断点:在如下图中的红色圆点处设置断点,红色圆点表示已经在这行设置断点。 启动调试:按F5或者点击左边红框中的按钮。右边框是开始执行(不调试)Ctrl+F5。 调试工具栏:下面是工具栏中对应的名称和快捷键。 在调试过程中F5是执行到下一个断点。F11是逐语句,在执行到下图中的断点时,按F11会执行到Fibonacci方法里面逐步记录执行过程。F10是逐过程,与逐语句不同的是,在执行到下图中断点时,再执行会执行断点下面的语句,而不是去执行语句中的方法。

局部变量:在调试过程中可以查看局部变量窗口,如下图里面会有变量的当前状态。如果找不到的话在 数组的状态表示如下图: InteliTrace记录每一步的调试状态。

条件中断 开发人员设置断点,运行程序,利用不同的输入触发断点,然后在断点处手工检查是否满足某些特定的条件,从而决定是否继续调查。如果当前场景不是他们想要的,按F5继续运行程序,尝试别的输入,手动重复刚才的过程。 针对上述情况,Visual Studio提供了一个方便得多的功能——“条件中断”。只有当程序满足了开发人员预设的条件后,条件断点才会被触发,调试器中断。这将避免频繁地手工检查/恢复程序运行,大量减少调试过程中的手工和烦琐工作。 如何设置条件断点: 设置条件断点非常容易。在特定的行上,按F9设置断点。 然后右击断点–编辑窗口左侧的红点,在上下文菜单上选择“条件”。 这时弹出一个对话框供你设置激活该断点所需的条件。比如:我们希望只有当x==5时,调试才中断。我们可以写出如下的表达式:

现在我再运行这个程序按F5达到条件断点,只有当x等于5时,程序运行才会被中断。对于其它条件下的x值,断点将被跳过。 记录到达断点次数 有时你希望,只有当第N次满足条件的运行到达断点时,才中断程序运行。例如:当第一次命中断点。可以通过右击断点,然后在弹出菜单上选择“命中次数”菜单命令实现。 这时系统弹出一个对话框,它允许你指定:(1)当满足条件,而且进入断点的累计次数等于N时,断点命中一次。(2)当满足条件,而且进入断点的累计次数是N的倍数时,断点命中一次。(3)当满足条件,而且进入断点的累计次数大于N时,每次命中断点。 注意:如果多个条件同时用的话,结果取交集。

STVD在调试的时候出现无法设置断点的问题

STVD在调试的时候出现无法设置断点的问题,提示One or more breakpoints are not positioned in valid files (no debug information or not a project file) --------------------------- ST Visual Develop --------------------------- One or more breakpoints are not positioned in valid files (no debug information or not a project file). These breakpoints have been removed. ---------------------------一个或多个断点未放置在有效文件(没有调试信息,或者不是一个项目文件)。这些断点已被删除(谷歌翻译)。 上图,如果点击确定,设置的断点便被清除,同时也会发现,右侧的反汇编窗口不能同时显示具体的汇编信息是由那句C语句生成的。 如果要设置断点,需要在Debug环境下才能放置断点。在Release环境下可以进行在线仿真,但是不能放置断点,并且仿真暂停的时候,也不知道程序停在了什么地方,不能进行单步调试等等。如下图:

1.一般情况下,我们新建的工程,都是在Release环境下建工程。并且project>settings中, 只在Release环境的设置,忽略了Debug的设置。如果在Release环境下进行了其他设置,同样的Debug下也要同样的设置。不然在调试环境下,无法通过编译,更不用提在线仿真,设置断点的问题。 2.一般进行程序编写编译的时候在Release环境中操作,此时可以进行在线仿真,但是无 法设置断点,给程序的调试带来很大的障碍,STVD环境下的设置方法如下,打开 project>settings,如下如: 此处默认设置,一般不做更改,是为了避免最后发行使用的程序忘记修改此处,避免编译的程序不是最优的。 在Debug环境下,如下图:

断点管理流程

1 目的 识别和控制在断点过程中的各种风险,提前做预警和准备,避免断点产品的非预期使用和不必要的浪费。 2 适用范围 适用于公司内外部所有需要断点的产成品、半成品、在制品、原材料、工装、检具等的管理和控制。3定义 3.1断点:在客户车型停产、EWO更改、公司内部设计更改等情况下需要对更改前产品、材料和工装检 具等的管理和处置的控制时间点。这种断点包括常规、可预见、可控制性的断点和突发性、不可预见的断点。 4职责 4.1销售部负责接收客户断点信息,及时向内部传递;负责关于断点事项与客户沟通; 4.2技术部负责设计变更、工艺变更引起的产品断点的管理;负责参与断点评审工作,提出技术和工艺方 面意见。 4.3生产部负责参与断点评审工作,提出生产制造方面意见;负责对生产现场断点产品的清点;负责断点 产品的物料标识。 4.4质量部负责质量问题产品断点的管理;负责参与断点评审工作,提出质量方面意见;负责对断点前后 产品的检测。 4.5采购部供应商产品断点的管理;负责参与断点评审工作,提出采购方面意见;。 4.6财务部负责断点产品仓库数量的清点;负责断点前后产品的先进先出。 5工作要求 5.1客户断点 5.1.1销售部销售经理与客户保持顺畅沟通,当客户发布断点信息时,立即将断点信息传递到公司内部 技术部、质量部、生产部、采购部等相关部门,传递信息包括:产品图号、产品名称、断点原因、断点时间、断点要求等相关信息。 5.1.2收到断点信息,采购部立即停止原材料、子零件的采购工作,并将信息传递到供应商。 5.1.3收到断点信息后,生产部计划员组织销售部、生产部、质量部、技术部、采购部、财务部召开产 品断点会议,会议内容包括评审断点影响、断点风险、评审断点产品库存的处理方案、评审断点产品工装模具检具料架处理方案、评估断点造成的积压风险/断线风险等,并完成《产品断点评审表》提交总工程师复核、总经理批准。 5.1.4评审会议召开前:

od破解调试秘籍断点

拦截窗口: bp CreateWindow 创建窗口 bp CreateWindowEx(A) 创建窗口 bp ShowWindow 显示窗口 bp UpdateWindow 更新窗口 bp GetWindowText(A) 获取窗口文本 拦截消息框: bp MessageBox(A) 创建消息框 bp MessageBoxExA 创建消息框 bp MessageBoxIndirect(A) 创建定制消息框 拦截警告声: bp MessageBeep 发出系统警告声(如果没有声卡就直接驱动系统喇叭发声) 拦截对话框: bp DialogBox 创建模态对话框 bp DialogBoxParam(A) 创建模态对话框 bp DialogBoxIndirect 创建模态对话框 bp DialogBoxIndirectParam(A) 创建模态对话框 bp CreateDialog 创建非模态对话框 bp CreateDialogParam(A) 创建非模态对话框 bp CreateDialogIndirect 创建非模态对话框 bp CreateDialogIndirectParam(A) 创建非模态对话框 bp GetDlgItemText(A) 获取对话框文本 bp GetDlgItemInt 获取对话框整数值 拦截剪贴板: bp GetClipboardData 获取剪贴板数据 拦截注册表: bp RegOpenKey(A) 打开子健 bp RegOpenKeyEx 打开子健 bp RegQueryValue(A) 查找子健 bp RegQueryValueEx 查找子健 bp RegSetValue(A) 设置子健 bp RegSetValueEx(A) 设置子健 功能限制拦截断点: bp EnableMenuItem 禁止或允许菜单项 bp EnableWindow 禁止或允许窗口 拦截时间:

三菱FX系列PLC的程序流程控制功能指令

1、条件跳转指令CJ CJ、CJP指令用于跳过顺序程序某一部分的场合,以减少扫描时间。 2、子程序调用指令CALL与返回指令SRET 子程序应写在主程序之后,即子程序的标号应写在指令FEND之后,且子程序必须以SRET指令结束 3、中断返回指令IRET、允许中断指令EI与禁止中断指令DI PLC一般处在禁止中断状态。指令EI~DI之间的程序段为允许中断区间,而DI~EI之间为禁止中断区间。当程序执行到允许中断区间并且出现中断请求信号时,PLC停止执行主程序,去执行相应的中断子程序,遇到中断返回指令IRET 时返回断点处继续执行主程序。 4、主程序结束指令FEND FEND指令表示主程序的结束,子程序的开始。程序执行到FEND指令时,进行输出处理、输入处理、监视定时器刷新,完成后返回第0步。 FEND 指令通常与CJ-P-FEND、CALL-P-SRET和I-IRET结构一起使用(P 表示程序指针、I表示中断指针)。CALL指令的指针及子程序、中断指针及中断子程序都应放在FEND指令之后。CALL指令调用的子程序必须以子程序返回指令SRET结束。中断子程序必须以中断返回指令IRET结束。 5、监视定时器刷新指令WDT 如果扫描时间(从第0步到END或FEND)超过100ms,三菱PLC将停止运行。在这种情况之下,应将WDT指令插到合适的程序步(扫描时间不超过100ms)中刷新监视定时器。 6、循环开始指令FOR与循环结束指令NEXT FOR~NEXT之间的程序重复执行n次(由操作数指定)后再执行NEXT指令后的程序。循环次数n的范围为1~32767。若n的取值范围为-32767~0,循环次数作1处理。 FOR与NEXT总是成对出现,且应FOR在前,NEXT在后。FOR~NEXT 循环指令最多可以嵌套5层。 利用CJ指令可以跳出FOR~NEXT循环体。 艾驰商城是国内最专业的MRO工业品网购平台,正品现货、优势价格、迅

中断的应用中对断点的保护

【016】中断的应用中对断点的保护 [51] 点击数:430 发布日期:2006-8-22 20:37:00 【收藏】【评论】【打印】【编程爱好者论坛】【关闭】 实验参考: 笨笨工作室-实验八、按键控制跑马灯(中断)。(查看) 实验板: FB51A。(查看) 实验目的: <1> 掌握堆栈在中断程序中的作用。 <2> 掌握让程序保护现场的方法。 实验现象: 二极管作左右跑马灯,当按下外部按键 K1 时, 8 个二极管全部闪烁 5 次后从 K1 按下之前的位置继续作跑马灯。 在应用中断时,若主程序在正常运行的过程中响应了中断就要转而去执行中断服务程序。那如何在执行完中断服务程序之后完全恢复原来的主程序呢?这就需要在执行中断服务程序之前将相关的状态保护起来,在中断完成后再将这些状态恢复,从而继续执行主程序。 51单片机中允许我们从内部 RAM 中指定一个空间专门保存这些断点处的状态,这个空间就是堆栈。并且还专门给了我们一个 8 位的堆栈指针,让我们用它来开辟堆栈空间。例如我们给堆栈指针赋值: mov sp, #70h ,就表示我们把内部数据 RAM 的地址为 70H 开始的单元设为堆栈。 MCS-51的片内存储器(RAM)共有256字节,高128字节是特殊功能寄存器,地址范围80H~FFH。这一部分可看作系统资源,不能随便利用。而剩下的低12 8字节区分如下: ──┬────────────┐ 7FHㄧ用户RAM区ㄧ ㄧ(数据缓冲区、堆栈区)ㄧ 30Hㄧ 80 byte ㄧ ──┼────────────┤ 2FHㄧ可位寻址区ㄧ 20Hㄧ 16 byte ㄧ ──┼────────────┤ 1FHㄧ第3组工作寄存器区ㄧ 18Hㄧ 8 byte ㄧ ──┼────────────┤ 17Hㄧ第2组工作寄存器区ㄧ 10Hㄧ 8 byte ㄧ ──┼────────────┤ 0FHㄧ第1组工作寄存器区ㄧ

黑马程序员java教程:断点调试模式运行java程序

断点调试模式运行java程序 1断点调试的目的 ●跟踪源代码; ●观察程序运行状态; 2调试程序1 编写求和代码 ●设置断点; ●debug运行; ●进入debug透视图; ●程序会运行到断点处停住; ●当前行还没有运行; ●查看变量值:选中变量→鼠标右键→Watch; ●F5(跳入)、F6(跳过)、F7(跳出); 3调试程序2 使用Arrays.binarySearch()编写折半搜索数组元素代码 ●设置断点; ●测试跳入; ●测试跳过; ●测试跳出; ●添加断点; ●测试进入下一断点; ●测试返回当前方法栈的头部(Drop To Frame); ●清除断点; ●清除表达式; ●注意,停止程序! MyEclipse快捷键 1MyEclipse常用快捷键1 ●Alt + /(内容助理):补全; ●Ctrl + 1(快速定位):出错时定位错误,与点击“红X”效果一样;

●Ctrl + Shift + O:导包; ●Ctrl + Shift + F:格式化代码块; 2MyEclipse常用快捷键2 ●Ctrl + Shift + T:查看源代码; ●Ctrl + 点击源代码:查看源代码; ●F3:查看选中类的源代码; ●Alt + 左键:查看源代码时的“原路返回”; ●Ctrl + Shift + X:把小写修改为大写; ●Ctrl + Shift + Y:把小写修改为小写; ●Ctrl + Alt + 下键:复制当前行; ●Ctrl + /:添加或撤销行注释; ●Ctrl + Shift + /:对选中代码添加段注释; ●Ctrl + Shift + \:撤销当前段注释; ●Alt + 上键:向上移动当前行; ●Alt + 下键:向上移动当前行; ●Ctrl + D:删除当前行; MyEclipse: ●工作空间; ●项目名称; ●包名; ●类名; ●Alt + /、Ctrl + 1、Ctrl + shift + o、Ctrl + shift + f

keil c 的在线调试与断点设置

Keil 的调试命令、在线汇编与断点设置 上一讲中我们学习了如何建立工程、汇编、连接工程,并获得目标代码,但是做到这一步仅仅代表你的源程序没有语法错误,至于源程序中存在着的其它错误,必须通过调试才能发现并解决,事实上,除了极简单的程序以外,绝大部份的程序都要通过反复调试才能得到正确的结果,因此,调试是软件开发中重要的一个环节,这一讲将介绍常用的调试命令、利用在线汇编、各种设置断点进行程序调试的方法,并通过实例介绍这些方法的使用。 一、常用调试命令 在对工程成功地进行汇编、连接以后,按Ctrl+F5 或者使用菜单 Debug->Start/Stop Debug Session 即可进入调试状态,Keil 内建了一个仿真CPU 用来模拟执行程序,该仿真CPU 功能强大,可以在没有硬件和仿真机的情况下进行程序的调试,下面将要学的就是该模拟调试功能。不过在学习之前必须明确,模拟毕竟只是模拟,与真实的硬件执行程序肯定还是有区别的,其中最明显的就是时序,软件模拟是不可能和真实的硬件具有相同的时序的,具体的表现就是程序执行的速度和各人使用的计算机有关,计算机性能越好,运行速度越快。 进入调试状态后,界面与编缉状态相比有明显的变化,Debug 菜单项中原来不能用的命令现在已可以使用了,工具栏会多出一个用于运行和调试的工具条,如图1 所示,Debug 菜单上的大部份命令可以在此找到对应的快捷按钮,从左到右依次是复位、运行、暂停、单步、过程单步、执行完当前子程序、运行到当前行、下一状态、打开跟踪、观察跟踪、反汇编窗口、观察窗口、代码作用范围分析、1#串行窗口、内存窗口、性能分析、工具按钮等命令。 接着执行下一行程序,中间不停止,这样程序执行的速度很快,并可以看到该 段程序执行的总体效果,即最终结果正确还是错误,但如果程序有错,则难 以确认错误出现在哪些程序行。单步执行是每次执行一行程序,执行完该行 程序以后即停止,等待命令执行下一行程序,此时可以观察该行程序执行完 以后得到的结果,是否与我们写该行程序所想要得到的结果相同,借此可以 找到程序中问题所在。程序调试中,这两种运行方式都要用到。 使用菜单STEP 或相应的命令按钮或使用快捷键F11 可以单步执行程序, 使用菜单STEP OVER 或功能键F10 可以以过程单步形式执行命令,所谓 过程单步,是指将汇编语言中的子程序或高级语言中的函数作为一个语句来

IATF16949 断点管理流程(含表格)

断点管理流程 1 目的 识别和控制在断点过程中的各种风险,提前做预警和准备,避免断点产品的非预期使用和不必要的浪费。 2 适用范围 适用于公司内外部所有需要断点的产成品、半成品、在制品、原材料、工装、检具等的管理和控制。3定义 3.1断点:在客户车型停产、EWO更改、公司内部设计更改等情况下需要对更改前产品、材料和工装检 具等的管理和处置的控制时间点。这种断点包括常规、可预见、可控制性的断点和突发性、不可预见的断点。 4职责 4.1销售部负责接收客户断点信息,及时向内部传递;负责关于断点事项与客户沟通; 4.2技术部负责设计变更、工艺变更引起的产品断点的管理;负责参与断点评审工作,提出技术和工艺方 面意见。 4.3生产部负责参与断点评审工作,提出生产制造方面意见;负责对生产现场断点产品的清点;负责断点 产品的物料标识。 4.4质量部负责质量问题产品断点的管理;负责参与断点评审工作,提出质量方面意见;负责对断点前后 产品的检测。 4.5采购部供应商产品断点的管理;负责参与断点评审工作,提出采购方面意见;。 4.6财务部负责断点产品仓库数量的清点;负责断点前后产品的先进先出。 5工作要求 5.1客户断点 5.1.1销售部销售经理与客户保持顺畅沟通,当客户发布断点信息时,立即将断点信息传递到公司内部 技术部、质量部、生产部、采购部等相关部门,传递信息包括:产品图号、产品名称、断点原因、断点时间、断点要求等相关信息。 5.1.2收到断点信息,采购部立即停止原材料、子零件的采购工作,并将信息传递到供应商。 5.1.3收到断点信息后,生产部计划员组织销售部、生产部、质量部、技术部、采购部、财务部召开产 品断点会议,会议内容包括评审断点影响、断点风险、评审断点产品库存的处理方案、评审断点产品工装模具检具料架处理方案、评估断点造成的积压风险/断线风险等,并完成《产品断点评审表》提交总工程师复核、总经理批准。 5.1.4评审会议召开前:

断点管理流程图

附录 流程图相关部门流程简述 销售公司生产制造部1.销售公司/生产制造部必须在零件断点实施前及时传递EWO和发布非技术断点通知单,以书面版为准,特殊情况下可先发电子版,2个工作日内补发书面版。 2.销售公司与客户落实断点方式。 3.采购部门得到信息后立即通知供应商做好断点准备。 技术中心1.组织对EWO或《非技术更改断点零件通知单》进行评审。 技术中心采购物流部区域工厂1.技术中心负责组织断点实施前新状态零件技术状态认可工作。 2.技术中心负责及时发布新状态零件技术状态认可情况。 技术中心1.技术中心在新状态零件技术状态未得到客户认可前,提前发布《产品工程工作指令》;在接到《非技术更改断点零件通知单》3个工作日内发布非技术更改断点零件细化清单》。以书面版为准,特殊情况下可先发电子版,2个工作日内补发书面版。 生产制造部采购物流部区域工厂1.生产制造部在接收到《零件状态变更对照》表后,根据需要发布《断点零件盘点通知单》组织盘点,并及时发布老状态零件库存信息。 2.采购物流部负责将相关断点信息传递到供应商。 生产制造部区域工厂采购物流部1.生产制造根据老状态零件库存及客户消耗情况,确定可否按时断点。 2.因异常不能按时切换的,技术中心、区域工厂或采购部门要及时向生产制造部反馈。 生产制造部销售公司采购物流部区域工厂1.生产制造部根据老状态零件库存信息及客户消耗情况,判定不能按客户计划进行断点的,及时将信息传递到销售处,由销售公司及时与客户进行沟通,确定新的断点方式。 2.在断点过程中区域工厂或采购部门出现断点异常,造成不能按计划断点的,要及时向生产制造部反馈,由生产制造部将信息传递到销售公司,由销售公司及时与客户进行沟通,确定新的断点方式。 3.生产制造部根据需要再次组织老状态零件库存盘点。 4.断点过程中断点信息出现重大变更时,由生产制造部断点工程师发布《零件断点提醒通知单》。

附录:程序的调试(单步执行与断点法)

附录:程序的调试(单步执行与断点法) 1单步执行 任何一个天才都不敢说,他编的程序是100%正确的。几乎每一个稍微复杂一点的程序都必须经过反复的调试,修改,最终才完成。所以说,程序的调试是编程中的一项重要技术。我们现在就来掌握一下基本的程序调试。我们以下的示范,是以时下比较流行的Borland Pascal 7.0为例子,其他的编程环境可能略有不同,但大致上是一致的。 我们先编一个比较简单的程序,看看程序是如何调试的。program tiaoshi; var i:integer; begin for i:=1 to 300 do

begin if i mod 2 = 0 then if i mod 3 = 0 then if i mod 5 = 0 then writeln(i); end; end. 该程序是输出300以内同时能被2,3,5整除的整数。现在我们开始调试。调试有多种方法,先介绍一种,权且叫步骤法,步骤法就是模拟计算机的运算,把程序每一步执行的情况都反映出来。通常,我们有F8即STEP这个功能来实现,如图:不断地按F8,计算机就会一步步地执行程序,直到执行到最后的“end.”为止。

可能你还没有发现F8的威力,我们不妨把上面的程序略微修改一下,再配合另外的一种调试的利器watch,你就会发现步骤法的用处。 program tiaoshi; var i:integer; a,b,c:boolean; begin for i:=1 to 300 do begin a:=false; b:=false; c:=false; if i mod 2 = 0 then a:=true; if i mod 3 = 0 then b:=true; if i mod 5 = 0 then c:=true; if a and b and c then writeln(i); end; end. 如图,我们单击菜单栏中debug选项,里面有一项叫watch的选项,我们单击它。

相关主题
文本预览
相关文档 最新文档