程序调试工具 - CSDN
精华内容
参与话题
  • 程序猿必备调试工具postman

    千次阅读 2019-07-05 10:12:20
    那么对于服务端的开发人员来说,写好了代码后,对外提供了API,这时候没有页面可以调用调试,如果等着客户端写完代码再测试的话,那样工作的效率是及其低下的。那么服务端要学会模拟客户端的调用,来调试自己的代码...

     

    前言

     

    现在很多公司写后端代码和前端代码已经分工很明确了,前后端把接口定义好,然后各自写各自的代码就可以了。那么对于服务端的开发人员来说,写好了代码后,对外提供了API,这时候没有页面可以调用调试,如果等着客户端写完代码再测试的话,那样工作的效率是及其低下的。那么服务端要学会模拟客户端的调用,来调试自己的代码,提早发现问题,这样后续跟客户端进行联调的时候,就大大提高了效率。

     

    我们今天讲讲Postman模拟客户端调试工具,这是我平时工作中最常用的工具之一。

     

    Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。它只要在Chrome里安装一个插件即可完成强大的功能。

     

    但是由于2018年初chrome停止对chrome应用程序的支持,你的postman可能无法正常使用了。目前chrome应用商店能使用的就是chrome扩展程序和主题背景。

     

    不过Postman也提供了应用程序的下载。https://www.getpostman.com/apps

    根据自己的操作系统,下载不同的版本即可。

     

    官网需要翻墙才能下载,所以我提前下载下来,小伙伴们直接在公众号回复“postman”即可获取下载地址。包括windows版本和mac版本。如果有需要linux版本的话,可以给我留言,我帮你下载。

     

    Postman介绍

     

    下面是在网上随便抓了一个请求地址来做演示,把请求地址填入地址栏,此请求为GET请求。点击Send发送请求,请求结果将会在下方显示出来。每次的请求历史数据,会被记录下来,但是经常使用的请求,还是保存一下,这么每次用的时候,选择就行了,及其方便。

     

    另外,最好创建一个账号,这样数据将会永久保存下来,不至于重装了系统或者换了台电脑数据都没了的尴尬。

     

    640?wx_fmt=png

     

    保存的时候起个好听的名字

     

    640?wx_fmt=png

     

    Header会传输一些我们需要的一些通用的数据,定义好之后,每个接口几乎都是一样的。所以,把这些数据进行预置,这样就不用每新建一个请求,都要重复的添加Header了。

     

    请求的时候,会把请求状态,请求的时间,以及返回的数据大小返回回来。这样一目了然。最常见的status就是200表示成功,400表示未找到资源。500开头的基本都是服务端异常等等。我之前写了一篇很详细的状态说明,请参见“HTTP状态码大全

     

    640?wx_fmt=png

     

    640?wx_fmt=png

     

    点击params可以把url里的参数以列表的形式展现出来,方便编写

     

    640?wx_fmt=png

     

    还有一种更方便的编辑方式,点击Bulk Edit ,直接修改字符串的方式修改,而且可以复制粘贴,方便迁移到其它地方。而且这个功能在其它参数编辑的地方都适用。

     

    640?wx_fmt=png

     

    我们来看看如何发送POST接口

     

    640?wx_fmt=png

     

    form-data、x-www-form-urlencoded、raw、binary的区别

     

    x-www-form-urlencoded

     

    当用户通过form表单提交数据的时候,例如:

     

    <form method="post"action="http://api.test.com/user" >
    
        <inputtype="text" name="name">
    
        <inputtype="text" name="age">
    
    </form>
    

     

    提交时会向服务器端发出这样的数据(已经去除部分不相关的头信息),数据如下:

     

    POST /user HTTP/1.1
    
    Content-Type:application/x-www-form-urlencoded
    
    Accept-Encoding: gzip, deflate
    
    Host: api.test.com
    
    Content-Length: 21
    
    Connection: Keep-Alive
    
    Cache-Control: no-cache
    
    name=互扯程序&age=18
    

     

    它的Content-Type是application/x-www-form-urlencoded,这表示消息内容会经过URL编码

     

    form-data

     

    当需要上传文件(可以上传多个文件),并且有参数同时传递的时候,选择这个选项可以上传文件。

    举个例子

     

    <form method="post"action="http://api.test.com/user/upload.do" enctype=”multipart/form-data”>
    
        <inputtype="text" name="desc">
    
        <inputtype="file" name="pic">
    
    </form>
    

     

    浏览器将会发送以下数据:

     

    POST /user/upload.do HTTP/1.1
    
    Accept-Language: zh-cn,zh;q=0.5
    
    Accept-Charset: GBK,utf-8;q=0.7,*;q=0.7
    
    Connection: keep-alive
    
    Content-Length: 60408
    
    Content-Type:multipart/form-data; boundary=ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC
    
    Host: api.test.com
    

     

    我们看到Content-Type:multipart/form-data;

     

    当需要上传数据的时候,必须设置enctype=“multipart/form-data”,

     

    enctype:规定在发送到服务器之前应该如何对表单数据进行编码,他有如下的三个值:

     

    1. application/x-www-form-urlencoded。默认的编码方式。所有字符都会进行编码(空格转换为 "+" 加号,特殊符号转换为 ASCII HEX 值)。

    2. multipart/form-data 。 指定传输数据为二进制类型,比如图片、mp3、文件。 不对字符编码。在使用包含文件上传控件的表单时,必须使用该值。

    3. text/plain。纯文体的传输。空格转换为 “+” 加号,但不对特殊字符编码。

     

    其实form表单在你不写enctype属性时,也默认为其添加了enctype属性值,默认值是enctype="application/x- www-form-urlencoded",所以上面注册用户的时候虽然没写,其实默认加上了。

     

    raw

     

    当需要给服务端传递json,xml等数据的时候选择raw,当选择了raw的时候,header里会自动加上

    Content-Type: application/json

     

    例如:

     

    $.ajax({
    
    ‍    url:"/user/",
    
        data:JSON.stringify(user),
    
        method:"POST",
    
        contentType:"application/json",
    
        success: function(res){
    
            console.info("添加成功")
    
        }‍
    
    });
    

     

     

     

     

    640?wx_fmt=png

     

    binary

     

    只能上传一个文件,也不能添加参数。

     

    640?wx_fmt=png

     

    压力测试

     

    当你需要验证你的接口的抗压能力的时候,可以点击Runner,进行压力测试

     

    640?wx_fmt=png

     

    注意:压力测试只能以文件夹的方式执行多个接口,不能单独执行,如果想要测试某一个接口,就创一个文件夹,这个文件夹里只有一个要测试的接口。

     

    640?wx_fmt=png

     

    点击执行,并发执行了500次。每次再100毫秒内返回结果。

     

    640?wx_fmt=png

     

    由于篇幅问题,还有其他功能等下次再讲解吧。

     

    推荐阅读

     

    技术:jenkins和docker实现自动化构建部署

    技术:设计图都不会画,还想做”架构师“?

    技术:玩转linux 这些命令就够了 

    技术:Kafka、RabbitMQ、RocketMQ等消息中间件的对比

    技术:玩转linux 这些命令就够了

    技术:30分钟如何学会使用Shiro 

     

    工具:如何通过技术手段 “干掉” 视频APP里讨厌广告?

    工具:通过技术手段 “干掉” 视频APP里讨厌的广告之(腾讯视频)

     

    干货分享:

     

    分享:1T 软件开发视频资源分享

    分享:深度机器学习56G视频资源分享

     

    博主11年java开发经验,现从事智能语音工作的研发,关注微信公众号与博主进行技术交流!更过干货资源等你来拿!

    640?wx_fmt=jpeg

     

    展开全文
  • C实战:强大的程序调试工具GDB

    千次阅读 2015-06-12 21:21:02
    C实战:强大的程序调试工具GDB1.基本调试这里只列举最最常用的GDB命令。1.1 启动GDBgdb program:准备调试程序。也可以直接进入gdb,再通过file命令加载。1.2 添加断点b function:为函数设置断点。b是break的缩写,...

    C实战:强大的程序调试工具GDB

    1.基本调试

    这里只列举最最常用的GDB命令。

    1.1 启动GDB

    gdb program:准备调试程序。也可以直接进入gdb,再通过file命令加载。

    1.2 添加断点

    b function:为函数设置断点。b是break的缩写,除了函数名,还可以是地址、当前执行处的+/-偏移等。

    1.3 运行程序

    run args:开始运行程序,run后面可以加程序需要的参数,就像在命令行正常运行时那样。

    1.4 单步调试

    s/n/si/c/kill:s即step in,进入下一行代码执行;n即step next,执行下一行代码但不进入;si即step instruction,执行下一条汇编/CPU指令;c即continue,继续执行直到下一个断点处;kill终止调试;quit退出GDB。

    1.5 打印调试信息

    bt:bt是backtrace的缩写,打印当前所在函数的堆栈路径。
    info frame id:打印选中的栈帧的信息。
    info args:打印选中栈帧的参数。
    print variable:打印指定变量的值。
    list:列出相应的源代码。
    info registers:查看所有寄存器的值。

    还有个更灵活强大的是直接打印%esp开始的前N个元素,例如打印栈上前10个元素就是:x/10x $sp

    2.GDB实战

    下面是一个使用了上述命令的实战例子:

    [root@BC-VM-edce4ac67d304079868c0bb265337bd4 bufbomb]# gdb bufbomb 
    GNU gdb (GDB) Red Hat Enterprise Linux (7.2-75.el6)
    Copyright (C) 2010 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
    and "show warranty" for details.
    This GDB was configured as "x86_64-redhat-linux-gnu".
    For bug reporting instructions, please see:
    <http://www.gnu.org/software/gdb/bugs/>...
    Reading symbols from /root/Temp/bufbomb/bufbomb...done.
    (gdb) b getbuf
    Breakpoint 1 at 0x8048ad6
    (gdb) run -t cdai
    Starting program: /root/Temp/bufbomb/bufbomb -t cdai
    Team: cdai
    Cookie: 0x5e5ee04e
    
    Breakpoint 1, 0x08048ad6 in getbuf ()
    Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.149.el6_6.4.i686
    
    (gdb) bt
    #0  0x08048ad6 in getbuf ()
    #1  0x08048db2 in test ()
    #2  0x08049085 in launch ()
    #3  0x08049257 in main ()
    (gdb) info frame 0
    Stack frame at 0xffffb540:
     eip = 0x8048ad6 in getbuf; saved eip 0x8048db2
     called by frame at 0xffffb560
     Arglist at 0xffffb538, args: 
     Locals at 0xffffb538, Previous frame's sp is 0xffffb540
     Saved registers:
      ebp at 0xffffb538, eip at 0xffffb53c
    (gdb) info registers
    eax            0xc      12
    ecx            0xffffb548       -19128
    edx            0xc8c340 13157184
    ebx            0x0      0
    esp            0xffffb510       0xffffb510
    ebp            0xffffb538       0xffffb538
    esi            0x804b018        134524952
    edi            0xffffffff       -1
    eip            0x8048ad6        0x8048ad6 <getbuf+6>
    eflags         0x282    [ SF IF ]
    cs             0x23     35
    ss             0x2b     43
    ds             0x2b     43
    es             0x2b     43
    fs             0x0      0
    gs             0x63     99
    (gdb) x/10x $sp
    0xffffb510:     0xf7ffc6b0      0x00000001      0x00000001      0xffffb564
    0xffffb520:     0x08048448      0x0804a12c      0xffffb548      0x00c8aff4
    0xffffb530:     0x0804b018      0xffffffff
    
    (gdb) si
    0x08048ad9 in getbuf ()
    (gdb) si
    0x08048adc in getbuf ()
    (gdb) si
    0x080489c0 in Gets ()
    (gdb) n
    Single stepping until exit from function Gets,
    which has no line number information.
    Type string:123
    0x08048ae1 in getbuf ()
    (gdb) si
    0x08048ae2 in getbuf ()
    (gdb) c
    Continuing.
    Dud: getbuf returned 0x1
    Better luck next time
    
    Program exited normally.
    (gdb) quit

    3.逆向调试

    GDB 7.0后加入了Reversal Debugging功能。具体来说,比如我在getbuf()和main()上设置了断点,当启动程序时会停在main()函数的断点上。此时敲入record后continue到下一断点getbuf(),GDB就会记录从main()到getbuf()的运行时信息。现在用rn就可以逆向地从getbuf()调试到main()。就像《X战警:逆转未来》里一样,挺神奇吧!

    这种方式适合从bug处反向去找引起bug的代码,实用性因情况而异。当然,它也是有局限性的。像程序假如有I/O输出等外部条件改变时,GDB是没法“逆转”的。

    [root@vm bufbomb]# gdb bufbomb 
    GNU gdb (GDB) Red Hat Enterprise Linux (7.2-75.el6)
    Copyright (C) 2010 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
    and "show warranty" for details.
    This GDB was configured as "x86_64-redhat-linux-gnu".
    For bug reporting instructions, please see:
    <http://www.gnu.org/software/gdb/bugs/>...
    Reading symbols from /root/Temp/bufbomb/bufbomb...done.
    
    (gdb) b getbuf
    Breakpoint 1 at 0x8048ad6
    (gdb) b main
    Breakpoint 2 at 0x80490c6
    
    (gdb) run -t cdai
    The program being debugged has been started already.
    Start it from the beginning? (y or n) y
    
    Starting program: /root/Temp/bufbomb/bufbomb -t cdai
    
    Breakpoint 2, 0x080490c6 in main ()
    (gdb) record
    (gdb) c
    Continuing.
    Team: cdai
    Cookie: 0x5e5ee04e
    
    Breakpoint 1, 0x08048ad6 in getbuf ()
    
    (gdb) rn
    Single stepping until exit from function getbuf,
    which has no line number information.
    0x08048dad in test ()
    (gdb) rn
    Single stepping until exit from function test,
    which has no line number information.
    0x08049080 in launch ()
    (gdb) rn
    Single stepping until exit from function launch,
    which has no line number information.
    0x08049252 in main ()
    展开全文
  • 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调试
    在这里插入图片描述

    展开全文
  • 程序调试

    2018-04-11 20:08:40
    在我们写程序中,调试是... 而且,调试工具也是一个非常好的学习工具,能让我们更好地观察运行过程和中间结果,这对于初学者理解一些抽象的概念是非常有好处的。 (1) 出现语法错误,一定要看错误提示,看不懂可...

    在我们写程序中,调试是必不可少的,下面介绍一下调试的原理和方法:

    1.为什么需要调试?

      因为程序出现问题的概率很高,甚至几乎是肯定的,那么排除错误的能力对于程序员而言就至关重要了。在实际项目中,调试的时间往往多余开发时间。

      而且,调试工具也是一个非常好的学习工具,能让我们更好地观察运行过程和中间结果,这对于初学者理解一些抽象的概念是非常有好处的。

     (1) 出现语法错误,一定要看错误提示,看不懂可以借助于翻译工具。并且要把错误记录下来,以后再碰到这样的错误就知道是什么错误,也知道如何修正。

     (2)逻辑错误

      逻辑错误指的是:程序语法没有问题,也可以运行,但是运行结果和预期不一致。由于程序是计算机自动高速运行的,我们很难准确判断问题错在哪里,所以逻辑错误的排除比较困难。当然掌握好相应的调试知识和技巧,这个问题有简单了。

    2 调试的原理

      程序是高速自动运行的,我们无法观察到程序是怎样运行的,所以就无从判断问题所在。那么要想去判定问题所在。需要去解决两个问题。

    (1)能控制程序运行的节奏。

    (2)能观察程序运行的状态。

    (3)那么怎么去控制节奏和查看状态呢?

    3 调试的方法

    怎么控制节奏?

    (1)打断点(breakpoint

    如果程序以调试模式运行,碰到断点程序暂停运行。

    Step overF8):一步一步执行。

    Step intoF7):进入函数一步一步调试每一个语句。

    Cursor:光标。

    怎么观察状态?

    1.观察变量或者表达式

    2. 观察程序的运行轨迹

    测试工具会标识出将要执行的指令,据此我们就可以观察到程序的运行轨迹。



    展开全文
  • 开发者常用的程序调试工具

    千次阅读 2018-04-26 09:39:18
    调试工具是那些那些使我们能够监测、控制和纠正其他程序的程序,它们能帮我们快速找到问题的原因,最终达到提高开发效率的目的。本文将针对不同开发者推荐几个较受欢迎的程序调试利器,如果您还有其他更好的选择,...
  • Java程序调试工具——jdb

    千次阅读 2017-12-18 10:15:52
    一般继承开发环境(IDE)都...其实JDK在自己的bin目录下边也有这样一套工具——jdb帮我们完成调试。 这里给出一个简单的程序“Hello.java”1 public class Hello 2 { 3 public static void main(String[] args) 4 { 5
  • 程序开发工具调试

    千次阅读 2018-08-17 22:44:51
    程序开发过程中,调试是让程序跑起来的关键。 第一步:点击调试器 第二步:点击sources 第三步:在目录中找到需要调试的js文件,打开图中文件,注意不是后缀为js的文件,而是js?[sm]的文件 第四步: 在...
  • 【转】gdb程序调试工具使用简介

    千次阅读 2016-04-01 22:33:32
    这篇博客可以说是我看过的非常不错的,相当全面地介绍gdb的使用方法的博客了,故在这里存下地址,方便以后不断学习。Linux 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 ...
  • godebug是一个跨平台的Go程序调试工具,传统的编译型语言调试器使用底层系统调用并读取二进制文件用于调试各类符号。使用起来很麻烦而且很难移植。 godebug使用不同的方法,直接把源码作为目标程序,在每一行插入...
  • Linux下的程序调试工具-----gdb(1)

    千次阅读 2016-09-06 21:40:05
     调试程序的方法有两种,一是输出日志,二是设置断点一步步调试,观察当前状况是不是想要的结果。  由于我的电脑出了问题,只能通过gdb进行调试,所以下面着重记录关于gdb的用法。  首先,先要通过gcc来生成文件...
  • Linux下的调试工具

    千次阅读 2018-11-05 12:48:47
    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow也欢迎大家转载本篇...分享知识,造福人民,实现我们中华民族伟大复兴!&nbsp;&nbsp;&nbsp;... Linux下的调试工具
  • 下面对微信web开发者工具做个简单的介绍 下载: 在上篇已经介绍过下载式了,可到微信小程序开发详细流程 一 (注册小程序及开发工具的下载)查看详细内容 下载地址: 前往开发者工具下载页面 模拟器:UI视图 这里...
  • Windows驱动开发调试工具

    千次阅读 2016-04-16 15:10:10
    针对Windows驱动开发,有一些好的调试工具可以推荐。 Windbg:和VM配合实现双机联合调试,完成双机调试功能,可以结合《软件调试》这本书对Windbg有较为深入的认识。 DebugView: 可以捕获程序中由TRACE(debug版本)...
  • 程序开发者调试工具使用说明

    千次阅读 2018-09-01 12:29:29
    微信开发者工作是微信官方提供的针对微信小程序的开发工具,集中了开发,调试,预览,上传等功能。微信团队发布了微信小程序开发者工具、微信小程序开发文档和微信小程序设计指南,全新的...调试工具分为9大功能模...
  • 蚂蚁开发者工具也就是支付宝小程序开发工具,支付宝小程序已经进入公测阶段,目前公测主要面向的是企业级开发者,蚂蚁开发者工具是支付宝小程序必备的工具! 小程序介绍: 支付宝小程序是手机应用嵌入支付宝...
  • 微信小程序开发调试工具

    千次阅读 2018-09-12 18:04:45
    为了帮助开发者简单和高效地开发微信小程序,我们...程序调试主要有三大功能区:模拟器、调试工具和小程序操作区 模拟器 模拟器模拟微信小程序在客户端真实的逻辑表现,对于绝大部分的 API 均能够在模拟器上呈现出...
  • 微信小程序调试时,点击调试样式按钮时,出现一个警告:‘请先切换至 WXml Pannel’,刚开始一直按‘编译’都不管用,其实很简单,如下图: 只要从source 切换到Wxml即可调试
  • 打开project.config.json,在setting下面增加 “checkSiteMap”: false
  • 应用程序调试,需要有个常规的调试思路,应对各类问题最基本的调试手段是什么,不能一头雾水的上手而乱了阵脚,而且根据经验统计这些基本的步骤可以解决大多数的问题。   问题分类   第一种,应用程序不工作...
1 2 3 4 5 ... 20
收藏数 448,273
精华内容 179,309
热门标签
关键字:

程序调试工具