程序调试工具_微信小程序开发工具 蓝牙调试 - 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
    调试工具是那些那些使我们能够监测、控制和纠正其他程序的程序,它们能帮我们快速找到问题的原因,最终达到提高开发效率的目的。本文将针对不同开发者推荐几个较受欢迎的程序调试利器,如果您还有其他更好的选择,...
  • 最近做一个小程序,在开发者工具上完成之后,真机调试了一下发现数据都没有传过来,就很头疼。然后寻找解决的办法: 开始一直以为是域名有问题,服务器域名我都配置了,我点了不校验安全域名、web-view 域名、TLS ...
  • 程序开发工具调试

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

    万次阅读 2019-01-24 11:44:29
    由于小程序的火爆,于是去开源中国接了个私活,开发一个小程序。于是开始学习微信小程序开发文档,下载微信开发者工具,进行开发了。开发过程中需要调试,开始只是打日志或者断言,觉得很不方便,希望跟IDEA一样的调试器,...
  • 最近在使用微信开发者工具对开发的微信小程序进行调试,遇到过两次这种问题,查阅网上解决办法,做下记录。 1、重新启动微信开发者工具 2、等一段时间再试试 3、卸载重装。。。。。 这个问题好多人都有遇到,...
  • 可能是晚上更新了下微信开发者工具的原因,下班回家打开微信真机调试就一直这样,真是差点骂娘 重启开发者工具,重新下载最新版本开发者工具,甚至重启电脑都试了。 然并卵! 最后真的绝望了,下了个旧版本的...
  • 微信手机端调试工具[下载地址] ...如果安装调试工具-微信Web开发者工具需要卸载以前安装过的微信Web开发者工具(比如小程序-微信Web开发者工具),建议使用腾讯管家之类的清理干净。2.安装好后,选择移动调试,X5 Blin
  • uni-app开启微信小程序调试

    千次阅读 2019-04-03 16:40:06
    在开发uni-app项目过程如何开启微信小程序进行实时编译调试。首先根据官网做如下配置 1、点击“工具” -》 “设置” -》 “运行配置”,找到“微信Web开发者工具” 安装所在的文件夹。复制路径,填入到“小程序运行...
  • 刚刚微信小程序只有打开调试模式才能看到信息。查了一下,是因为服务器的域名没有设置。登录开发平台设置。这个然后呢,还要在开发工具中同步重新编译,OK!...
  • linux下如何用GDB调试c++程序

    万次阅读 多人点赞 2012-03-19 13:55:20
    GDB 是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大...
  • 解决方案:关闭开发工具,重启下就行了。 
  • 自己写的微信小程序,在手机上测试的时候只有打开调试模式才能用,在电脑上的开发工具上也能用,就是在手机上关闭调试模式后就不能用了,上传体验版也是这样,跪求大佬指点。。
  • Keil(MDK-ARM-STM32)系列教程(八)在线调试(Ⅰ)

    万次阅读 多人点赞 2018-09-11 06:44:53
    Keil在线调试的内容有很多,本文带来在线调试常用的内容:Debug Toolbar调试工具栏(复位、全速运行、停止运行、单步调试、逐行调试、跳出调试、运行到光标行、跳转到暂停行、调试窗口)快捷按钮的详细内容。...
  • 在开发工具调试,请求...后面发现在开发调试工具中,我将 项目设置中的 选项“不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书”勾选中了,去掉勾选后,请求时开发工具报错: 然后根据提示走下...
  • 程序开发者工具调试没有问题,手机扫码测试却没有数据怎么办?
  • Keil(MDK-ARM)系列教程(八)_在线调试(Ⅰ)

    万次阅读 多人点赞 2019-03-08 11:29:31
    推荐 分享一个大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!http://www.captainbed.net/strongerhuang 我的网站:https://www.strongerhuang.com ...K...
1 2 3 4 5 ... 20
收藏数 447,127
精华内容 178,850
关键字:

程序调试工具