程序调试_程序调试工具 - CSDN
精华内容
参与话题
  • 1.为什么要进行程序调试及调试程序的目的? 程序调试是将编制的程序投入实际运行前,用手工或 编译程序等方法进行测试,修正语法错误和逻辑错误的过程。这是保证计算机信息系统正确性的必不可少的步骤。 测试时程序...
    1.为什么要进行程序调试及调试程序的目的?

    程序调试是将编制的程序投入实际运行前,用手工或 编译程序等方法进行测试,修正语法错误和逻辑错误的过程。这是保证计算机信息系统正确性的必不可少的步骤。

    测试时程序运行错误,无法根据提示的错误信息准确定位错误原因及错误位置。

    根据测试时所发现的错误信息和利用调试工具追踪的提示信息,两者相互结合综合判断错误发生原因和位置。找出错误原因具体的错误位置*,最终方便进行修正。

    测试本身也就属于程序调试的过程中的一部分。
    调试是验证程序的运行是否符合自己的设计。

    2.调试的原则

    ​ 一、用头脑去分析思考与错误征兆有关的提示信息。

    ​ 二、避开死胡同。同一个问题验证完成,办法行不通。这样需要换种思路处理问题。

    ​ 三、只把调试工具当做查找错误位置及错误原因的手段。利用调试工具,理清楚程序中数据流转逻辑,可以帮助思考,但不能代替思考,因为调试工具只是辅助性的定位错误的方法。而解决实际问题需要根据调试的提示信息,自己判断思考出正确的处理方式。

    ​ 四、避免用试探法,最多只能把它当做最后手段。

    ​ 五、修改错误的一个常见失误是只修改了这个错误的征兆或这个错误的表现,而没有修改错误本身。如果提出的修改不能解释与这个错误有关的全部线索,那就表明只修改了错误的一部分。要找到问题的根源。思考为什么会引起这样的错误,是否是设计上就出现不合理的问题。

    3.调试程序的思想

    首先要了解清楚系统功能的业务,业务了解清楚后,根据业务功能进行测试来使业务数据流转(业务产生数据,数据体现业务)。

    当错误发生时,首先应该想到并且知道这个问题的产生所依赖的业务数据流程。

    比如:当点击表单提后出现错误。这时应该思考点击提交按钮后应该发生了哪些些数据流转过程:点击提交按钮后,这个按钮触发的是提交form表单的action 指向的是控制层的哪个方法或js脚本中的某个function, 下来就是控制程方法接收数据后又调用的时service的哪个方法,继续直到到后台调用的是哪个数据库的sql再就是返回值返回页面数据的过程。

    在这个过程中业务数据跟着业务程序逻辑在流转。再根据页面展现的错误现象及报错提示信息,推测该错误可能会发生在这个业务数据流转过程中的哪个位置,从而确定我们调试的断点位置。调试,找出错误原因,提出解决方案,解决后再次测试。

    4.程序调试步骤方法

    ​ 1)根据错误提示信息及业务功能逻辑的推理等相关信息【与错误征兆有关的提示信息】找到有可能会导致错误发生的位置
    异常错误日志信息定位错误发生位置
    日志信息的输出位置一是控制台输出,这时最及时的一种方式,在程序运行时可以很容易就看到日志输出信息。二是输出日志信息到日志文件中,这种方式根据项目要求配置日志相关信息[日志输出级别、日志输出路径]
    这些日志信息分为以下几种
    【1】系统程序代码中自己标记的日志信息
    在这里插入图片描述
    错误日志
    在这里插入图片描述
    当程序执行发生错误时,在日志文件或控制台输出时就会输出到已标记的日志信息,根据输出的已标记信息通过工具搜索定位到具体的打印日志的方法。
    【2】 错误信息没有我们标记的日志,而是在程序执行中发生错误导致的异常错误信息提示如下:

    在这里插入图片描述

    1》2019-07-01-13-05 [http-nio-192.168.200.169-8443-exec-1] [org.thymeleaf.TemplateEngine] [ERROR] - [THYMELEAF][http-nio-192.168.200.169-8443-exec-1] Exception processing template "findFlpcList": An error happened during template parsing (template: "class path resource [templates/findFlpcList.html]")
    org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templates/findFlpcList.html]")
    2》Caused by: org.attoparser.ParseException: Exception evaluating SpringEL expression: "#strings.substring(flpcDTO.createTime,0,10)" (template: "findFlpcList" - line 27, col 25)
    3》Caused by: org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression: "#strings.substring(flpcDTO.createTime,0,10)" (template: "findFlpcList" - line 27, col 25)
    4》Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: 10
    
    这种在日志文件或控制台中输出的异常错误信息,我们看日志错误信息按照这种思路
    
    1》中表示了错误发生的位置,比如:
    An error happened during template parsing (template: "class path resource [templates/findFlpcList.html
    可以推测出发生错误的地方应该templates/findFlpcList.html文件中,原因是An error happened during template parsing模板解析时出错。在调试排查错误位置点时重点就可以在代码中的查找findFlpcList.html文件。
    		2》、3》、4》的 Caused by中就显示了错误造成的原因。比如:
    		Exception evaluating SpringEL expression: "#strings.substring(flpcDTO.createTime,0,10)" (template: "findFlpcList" - line 27, col 25)就显示了在模版findFlpcList 的27行 "#strings.substring(flpcDTO.createTime,0,10)"发生 SpringEL expression异常
    紧接着看下一句
    Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: 10
    可以看出错误原因就是字符索引越界了,这样我们就可以推测可能为flpcDTO.createTime 取值有问题或者(0,10)截取不对。下来要做的就是 将flpcDTO.createTime 的值打印输出 查看具体值是什么,判断错误发生原因。这一步就是下面的调试。
    
    

    ​ 2.1)在IDE中进行启动debug调试模式,进行***标记断点***”“ 。注意:一般打断点的方式及位置是

    ​ 【1】在有可能发生错误的方法的第一行逻辑程序打程序断点。

    ​ 【2】方法中最有可能发生错误的那一行打程序断点。

    ​ 【3】在程序运行到断点位置暂停时,进行下一步调试,这时需要特别***注意观察***程序运行的每一步的数据是否为业务流程处理的正确数据。

    ​ 2.2)打印输出相关信息 ->system.out.println()

    ​ 【1】打印信息在方法中最有可能发生错误的那一行上一行或下一行,将程序执行的参数、返回结果值在控制台进行输出,检查输出的结果值是否为程序执行咱们想要的结果,进而判断错误发生点。

    ​ 【2】这种打印输出信息的方法也是在某些不支持debug的系统调试的一个重要方法。

    ​ 3)在打断点和标记打印输出后,现在开始进行debug模式调试。

    ​ 当程序运行到断点,这时程序在一个暂停状态,我们需要进行程序单步向下执行,观察每一步中的输入参数数据是否正确或调用方法的返回值数据是否正确,当程序运行到一个方法时我们可以继续单步向下执行不管方法内部的逻辑只关心返回值,也可以使用程序调试方法中的进入方法内部继续追踪程序(进入方法内部后继续单步执行或跳出方法内部),直到程序执行发生错误,判断是否为程序错误发生的实际位置

    ​ 另一种情况当程序运行起来后,业务处理发生错误,并没有进入我们的断点或打印输出语句,这时就是我们推测的程序发生的位置不对,需要根据错误信息和业务处理流程逻辑重新推测错误发生位置,重新再次进行第2步。

    ​ 4)当查找问题时注意将问题细化拆解,看看一个大问题中,程序正确执行到哪一步,精确定位错误点。

    5.1后台调试工具

    调试的主要方法,(1)单步走 (2)进入方法内部(3)跳出方法,不管在那个工具中应该都有这样的功能,只是这些功能的快捷键不同。下面介绍几种工具

    idea的debug调试功能

    1)向下单步执行 [step over F8] ,就是程序一句一句的执行。

    2)进入内部[step into F7],就是进入调用方法的内部,接下在单步执行,一句一句的检查程序的执行情况。

    1. 强制进入内部[force step into Alt+shifit+F7]

    4)跳出内部 [step out shift+F8] 就是跳出方法。
    idea中的调试按钮
    idea调试模式

    eclipse的debug调试功能

    1)进入内部[step into F5]

    1. 向下单步执行 [step over F6]

    3)跳出内部 [step return F7]
    eclipse中的调试按钮

    日志控制台的输出logger.error()、logger.info(),根据日志信息提示,寻找问题出错的位置及出错原因。常说一句话“看日志或控制台有没有报错输出。“
    自己指定的system.out.println() 的打印输出,这种方式是在自己根据预测的错误点的位置进行打印相关信息,进而验证和查看自己对错误原因及错误位置的定位。

    模拟浏览器发送请求的工具 有: Postman、curl

    5.2.前台浏览器调试工具方法

    和后端调试工具应具有的调试功能相似,

    在chrome,fireFox、ie、qq、360、浏览器中的调试快捷键通常都为 F12

    按下F12快捷键进入调试模式,浏览器的调试目标 针对 js 、html、css 样式。
    打印输出 console.log()、弹出信息方式alert()。

    js脚本调试
    js 脚本调试
    html及css调试
    在这里插入图片描述

    展开全文
  • 程序调试方法

    2019-11-01 20:43:52
    程序调试方法 程序是一分编写,三分调试,九分测试。在调试方面,所有的集成开发环境都支持调试功能。 调试功能分成断点的设置和取消。运行的单步执行,执行时进入方法体内,执行时跳出方法体外。执行整个程序。执行...

    程序调试方法
    程序是一分编写,三分调试,九分测试。在调试方面,所有的集成开发环境都支持调试功能。
    调试功能分成断点的设置和取消。运行的单步执行,执行时进入方法体内,执行时跳出方法体外。执行整个程序。执行到下一个断点处。设置变量值使程序执行到特定的条件语句块内。查看变量的值。
    调试的作用,发现执行的死循环情况。发现程序的条件设置错误。发现赋值语句的顺序错误。发现变量未赋值引用情况,发现对象未初始化就被引用的错误,发现内存泄露的错误。
    调试的方法:
    一是在开发环境中设置调试模式。例如在eclipse中设置程序以调试模式运行。在gcc的编译中加入调试选项,在gdb中执行编译过的可调试的可执行程序。
    二在某些特殊情况下,调试器失效时,必须加入打印语句代替调试器进入最原始的调试状态。
    三断点设在何处语句的问题,这是软件工程师体现工作经验的地方。
    例如程序长时间执行,断点设置在循环体内,执行到下一个断点的操作,根据执行情况,判断死循环的位置和循环终止条件。
    总之断点的设置之处是怀疑程序最可能出错的位置的前面。再让程序一步步执行到可能出错处,查看相关变量的值,看是否符合预想的值,如果符合,检查下一个可疑之处。如果不符合就可能找到了出错处。这个过程像修车师傅检查车胎泄气处的过程。抛砖引玉了,望大家批评指正,讨论学习,一起提高编程技能。
     

    展开全文
  • c/c++ 程序调试方法

    千次阅读 2019-01-08 10:34:05
    总结一下自己常用的c/c++程序调试方法,首先介绍一下我的开发环境 系统 Linux xx 3.2.0-4-686-pae #1 SMP Debian 3.2.60-1+deb7u1 i686 GNU/Linux 编辑器 VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Feb ...

     

    总结一下自己常用的c/c++程序调试方法,首先介绍一下我的开发环境

    系统

    Linux xx 3.2.0-4-686-pae #1 SMP Debian 3.2.60-1+deb7u1 i686 GNU/Linux
    

    编辑器

    VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Feb 10 2013 06:46:29)

    编译器

    
     
    1. Thread model: posix

    2. gcc version 4.7.2 (Debian 4.7.2-5)

    交叉编译工具链忽略不计。

    调试器

    GNU gdb (GDB) 7.4.1-debian


    总的来说, 按照使用率来排序,本人最常用的方法如下:
    1. printf 大法(日志)
    2. core-dump/map 调试
    3. gdb

    4. 注释

     

    一、日志

    首先来说printf大法,虽然说用printf调试听起来有点low,但是不可否认的是,现实情况中绝大多数的逻辑错误、异常情况通过查看打印输出、日志就能定位bug所在,当然,直接用printf的话稍微有点麻烦。不如自己封装一下:

    
     
    1. #ifdefine DEBUG_EN

    2. #define DEBUG(fmt, args...) \

    3. do { \

    4. printf("DEBUG:%s-%d-%s "fmt, __FILE__, __LINE__, __FUNCTION__, ##args);\

    5. }while(0)

    6.  
    7. #define ERROR(fmt, args...) \

    8. do { \

    9. printf("ERROR:%s-%d-%s "fmt, __FILE__, __LINE__, __FUNCTION__, ##args);\

    10. }while(0)

    11. #else

    12. #define DEBUG(fmt, args) do{}while(0)

    13. #define ERROR(fmt, args) do{}while(0)

    14. #endif

     这样编译的时候, 就可以通过gcc -DDEBUG_EN 打开调试信息输出,当调试完成之后,去掉这个参数即可。这两个宏调用方式与printf完全一样, 输出内容如下图:

    当然,对于多线程的情况,可以考虑增加打印tid、加锁、解锁等操作。

    二、core-dump/map 调试

    当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump.

    MAP 文件是程序的全局符号、源文件和代码行号信息的唯一的文本表示方法,是整个程序工程信息的静态文本,通常由linker生成。

    core-dump

    注意,在编译可执行文件前,要使用-g选项,否则找不到符号,无法精确定位。一般使用"ulimit -c unlimited"打开这个机制,其实这个命令是限制core-dump文件大小。"ulimit -c 0"将禁用这个机制。可通过修改/proc/sys/kernel/core_pattern修改保存路径、文件名等等参数。默认情况下, 这个文件保存在崩溃的可执行程序目录下。得到这个文件之后,执行"gdb execute-file core-file"即可看到程序崩溃原因以及奔溃前执行的代码。

    例如: main.c

    
     
    1. #include <stdio.h>

    2.  
    3. int crash_func(int i, int j)

    4. {

    5.         int ret = 0;

    6.         ret     = i / j;

    7.         return ret;

    8. }

    9.  
    10. int main(void)

    11. {

    12.         crash_func(5, 0);

    13.         return 0;

    14. }

    编译运行这个程序,提示“Floating point exception (core dumped)”,这时执行"gdb main.out core"

    map文件

    编译可执行程序时增加一个gcc参数"gcc -Wl,-Map,map-file" (-Wl表示将后面的参数传递给链接器ld)。是程序链接的内存映像,表示了某个符号(函数和全局变量等)的地址。值得注意的是,Linux内核在编译时也会产生一个System.map文件,便于在oops时帮助定位bug。

    三、gdb

    与第二种方法中用到的gdb不同的是,第三种方法通过运行程序,打断点、单步、查看变量的值等方式在运行时定位bug。第二种方式更像是破案,由犯罪现场推导“凶手”。

    按照命令使用的顺序, 介绍gdb常用命令

     

    file <文件名> 加载被调试的可执行程序文件
    b <行号>/<函数名称> 在第几行或者某个函数第一行代码前设置断点
    r 运行
    s 单步执行一行代码
    n 执行一行代码,执行函数调用(如果有)
    c 继续运行程序至下一个断点或者结束
    p<变量名称> 查看变量值
    q 退出

    四、 注释

    注意,这种办法意味着你用尽了浑身解数,都无法定位出问题的地方。也就意味着你对你的代码失去了掌控,这几乎是最后一招了。这种方法就是不断注释掉可疑代码片段,或者直接回滚到出问题之前的版本,对比代码不同之处,定位bug。

     

    最后附上一个牛人对精通编程的判断标准:“精通就是,没有你调不出的程序”。

    展开全文
  • 1、在应用程序开发中,点击一个按钮或或点一个链接,页面的响应结果与我们预期的结果不一样,我们可以通过在后台应用程序打断点,debug调试,也可以通过浏览器查看、抓取后台返回数据。2、怎样通过浏览器查看和抓取呢...

    1、在应用程序开发中,点击一个按钮或或点一个链接,页面的响应结果与我们预期的结果不一样,我们可以通过在后台应用程序打断点,debug调试,也可以通过浏览器查看、抓取后台返回数据。

    2、怎样通过浏览器查看和抓取呢?
    浏览器我用的是google的chrome。
    如下图,我点查询按钮。
    这里写图片描述
    一、进入调试界面
    点查谒按钮之前,进入浏览器的调试界面。
    浏览器的调试界面的方式(windows下面,直接F12,我用的是mac):
    方式1:在浏览器页面空白处,点左键,然后点“审查元素”,就可以进入调式页面;

    方式2:点浏览器右上角,这里写图片描述 ,–>更多工具–>开发者工具。
    调试页面如下图:
    这里写图片描述

    二、在调试界面查看、抓取数据
    怎样查看、抓取数据呢?
    如下图:
    第一步:点查询按钮;
    第二步:点Network页签;
    第三步:点getAllUser.do链接;
    这里写图片描述

    可以在下图查看请求状态:
    如下图点下部的Headers页签,查看请求状态Status Code:200 OK,和查看请求头部信息
    这里写图片描述

    然后点Response页签,查看后台响应的数据

    这里写图片描述
    我们也可以将这里的json数据copy一下,在网上找一个json在线格式要具如
    这里写图片描述
    三、借助json在线解析工具,格式化json数据
    借助这个json在线解析工具,我们可以在下图中更清晰的查看、分析后台抓取的数据
    这里写图片描述

    展开全文
  • 程序调试

    2018-09-25 16:19:21
    每一个程序都离不开反复的调试、修改最终才能完成,所以说,调试程序是编程过程中必不可少的一个过骤,那么,程序调试应该如何做呢? 程序设计中常见的错误可以分为三类: 1.语法错误 2.语义(逻辑)错误 3.运行...
  • 用GDB调试程序(一)

    万次阅读 多人点赞 2003-07-02 00:03:00
    用GDB调试程序GDB概述————GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比...
  • 程序调试

    2018-05-17 13:30:47
    程序调试是将编制的程序投入实际运行前,用编译程序的方法进行测试,修正语法错误和逻辑错误的过程。这个呢,是编写一个程序必不可少的步骤。 比如,现在来看个简单的例子; 图1 ...
  • Android程序调试方法介绍

    千次阅读 多人点赞 2019-02-21 11:48:09
    静态调试 适用于:通过打印变量的值来查看某一时刻值是否正确 Toast(Snackbar)打印法 一般的Android开发人员最爱的调试法,使用简便,仅需一行代码,轻松打印: Toast.makeText(MainActivity.this, &amp;quot;...
  • 程序调试的常用方法

    千次阅读 2017-03-30 21:50:34
    常用的程序调试方法有四种: --单步调试(一步一步观察程序是如何运行的,理清逻辑思路) --局部变量(打开局部变量观看其是否被赋值) --打log,在可疑的地方打赏log观看其值是否被打印出来 --内存泄漏(用专门...
  • C++程序调试方法:

    万次阅读 2018-09-03 20:18:57
    VS下写C++程序调试方法: 1.  逐过程调试(遇到函数调用的地方,则执行函数,不进入函数内部) 逐语句调试(遇到函数调用的地方,则进去函数内部执行) 跳出(如执行到一个函数内部,或cout语句定义的地方,...
  • 自己写的微信小程序,在手机上测试的时候只有打开调试模式才能用,在电脑上的开发工具上也能用,就是在手机上关闭调试模式后就不能用了,上传体验版也是这样,跪求大佬指点。。
  • 刚刚微信小程序只有打开调试模式才能看到信息。查了一下,是因为服务器的域名没有设置。登录开发平台设置。这个然后呢,还要在开发工具中同步重新编译,OK!...
  • 程序-真机调试遇到的问题

    万次阅读 热门讨论 2018-06-26 13:34:55
    1、在勾选不校验合法域名,HTTPS的情况下在模拟器上http://IP地址是可以请求服务器并成功获取数据,但是真机上调试需要合法的域名才可以访问服务器。2、真机上需要点击远程调试才可以访问服务器并调试。3、如果需要...
  • 微信小程序里面的单步调试和变量查看

    万次阅读 多人点赞 2017-01-24 18:32:57
    总有一些东西,想看看它跑起来的内容与我们编程时想的是否一致,于是就想到了能不能单步调试或者打出一些我们想要的变量的内容,以便我们做进一步的开发和调整,现在我就要介绍下微信小程序的一般用到的调试方法和...
  • 微信小程序 真机调试无法请求localhost

    万次阅读 热门讨论 2018-12-27 21:10:09
    问题描述: 在微信开发者工具里能正常请求后台数据 但真机调试时 却报localhost请求失败的错误 解决方案: 在客户端的config.js中 把host里的localhost改成本机在局域网里的ip地址即可 服务端可继续沿用...
  • 微信小程序调试模式

    千次阅读 2018-04-29 16:54:16
    “Console”:小程序调试控制台;“Wxml”:和查看html页面结构类似;“Sources”:显示项目的脚本文件;“Appdata”:查看项目的数据情况;“Storage”:储存器窗口(用于显示项目在使用wx.setStorage接口或者wx....
  • 微信小程序——上线后如何调试

    千次阅读 2018-03-15 11:01:22
    线上版本没有调试 由于博主也是遇到了同样的问题,偶然间发现同事那里显示了调试,所以新生疑问,为何博主没有??? 尝试了很久发现,其实只需要如下操作则可以打开调试: 只需要在开发版本中打开调试,然后在...
  • 最近在开发当中遇到了一个问题,上传体验版之后用手机打开没有数据,打开调试之后才会有数据。 出现这种问题的主要原因就是后台的域名没有配置,在微信公众平台设置--&gt;开发设置下面有一个服务器域名, 把...
  • 手机上打开调试其实和在微信开发工具上点了不校验合法域名是一样的,所以这个时候应该检查域名是否都设置好了。这是我遇到的一个坑,欢迎大家来补充。。...
  • 之前开发小程序地图模块的使用,只要开启调试模式,地图怎么都好用,体验版怎么都不行。问题原来在这开发时候为了方便,开启了不验证合法域名后来把它关了问题就暴露了,https://apis.map.qq.com这个域名不在合法...
1 2 3 4 5 ... 20
收藏数 959,465
精华内容 383,786
关键字:

程序调试