精华内容
下载资源
问答
  • 调试
    万次阅读 多人点赞
    2021-10-17 19:28:51

    前言

    驱动、内核等大型工程包含众多 .c .h 文件,如果手动一个个去编译这些文件是不现实的,通常的做法是使用 make 命令进行自动化编译。make 命令执行时,需要 makefile 文件,以告诉 make 命令需要怎样去编译和链接程序。

    不过这些大型工程的 makefile 文件往往不止一个,且常常分散在各个层级。如果编译时报错,调试起来就比较麻烦了。联想到 C 语言 Debug 的方法,通常是在出现问题的语句前面添加打印,来判断变量的值是否符合预期,语句是否被执行等等。那么在 Makefile 中有没有类似的 Debug 方法呢?

    控制 make 的函数

    答案是有的,那就是控制 make 的函数(Functions That Control Make)。

    make 提供了一些函数,可以检测 makefile 的运行时信息,来控制 make 的运行。

    1. info 函数
    $(info <text ..>)
    

    功能:打印信息

    1. error 函数
    $(error <text ...>)
    

    功能:产生一个致命的错误,终止 make 运行,<text …> 是错误信息。

    1. warning 函数
    $(warning <text ...>)
    

    功能:这个函数很像 error 函数,只是它并不会让 make 退出,只是输出一段警告信息,而 make 继续执行。

    案例分析

    期望:config.mk 作为 Makefile 的配置文件,ARM = y 表明想编译出 ARM 架构程序,即用 arm-linux-gcc 进行编译。但是执行后,make 并没有按照预期使用 arm-linux-gcc 进行编译,而是使用默认的 cc 进行编译。问题出在哪呢?

    先看代码

    $ tree
    .
    ├── config.mk
    ├── hello.c
    └── Makefile
    

    config.mk

    ARM = y 
    

    Makefile

    include config.mk
    
    ifeq ($(ARM), y)
    CC = arm-linux-gcc
    endif
    
    all:
    	$(CC) hello.c
    
    

    hello.c

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
    	printf("hello world\n");
    
    	return EXIT_SUCCESS;
    }
    

    执行 make

    $ make
    cc hello.c
    

    看到执行结果,很显然 CC 没有被正确赋值为 arm-linux-gcc,难道 ifeq ($(ARM), y) 条件不成立?测试一下

    include config.mk
    
    ifeq ($(ARM), y)
    111
    CC = arm-linux-gcc
    endif
    
    all:
    	$(CC) hello.c
    

    ifeq ($(ARM), y) 下面加入错误语句 111,结果执行没有报错,说明 ifeq ($(ARM), y) 条件确实是不成立的。但是我已经包含了 config.mk 这个文件了啊,而且 config.mk 里面定义了变量 ARM,并且赋值了 y。为什么 ifeq ($(ARM), y) 条件就是不成立呢?百思不得其解!!

    这时候就可以启用我们的 make 调试方法了,先上 info 函数

    include config.mk
    
    $(info "ARM=$(ARM)")
    
    ifeq ($(ARM), y)
    111
    CC = arm-linux-gcc
    endif
    
    all:
    	$(CC) hello.c
    
    

    执行

    $ make
    "ARM=y "
    cc hello.c
    

    原来 y 后面多了一个空格,导致条件判断不通过。可以看到,使用 info 函数进行 make 打印调试,可以快速定位问题。

    其实这里 ifeq ($(ARM), y) 的写法不好,更好的写法是 ifeq ($(strip $(ARM)), y)。这样,即便在 y 前后有空格,strip 函数也会帮助我们去除,增强脚本的健壮性。

    include config.mk
    
    $(info "ARM=$(ARM)")
    
    ifeq ($(strip $(ARM)), y)
    CC = arm-linux-gcc
    endif
    
    all:
    	$(CC) hello.c
    

    运行

    $ make
    "ARM=y "
    arm-linux-gcc hello.c
    

    可以看到,即便 y 后面有空格,由于使用 strip 函数的作用,帮我们把空格去除了,ifeq ($(strip $(ARM)), y) 条件也就成立了,最终使用了 arm-linux-gcc 进行编译。

    回过头来,这一切还是要归功于 info 函数给我们调试 make 带来的便利性,才能有后面我们的解决方案和优化方案。

    除了 info 函数,我们还可以使用 warning 函数,它比 info 函数打印更多的信息:文件名称和行号。

    不过上述两个函数只能打印调试信息,并不能控制 make 的运行,我们在 make 大型工程时,可能 make 流程已经不符合我们的预设了,但是 make 还在继续执行,这时我们只能手动停止,然后向上滚动 log 查找出错位置。其实我们可以有更好的方法,那就是使用 error 函数,它可以让 make 停止在你想要停止的位置,方便迅速定位问题。比如上面示例中,我们想要使用 arm-linux-gcc 进行编译,如果 CC 没能被正确赋值为 arm-linux-gcc,我们就让 make 报错停止下来。

    include config.mk
    
    # $(info "ARM=$(ARM)")
    # $(error "ARM=$(ARM)")
    $(warning "ARM=$(ARM)")
    
    ifeq ($(ARM), y)
    CC = arm-linux-gcc
    else
    $(error "ARM=$(ARM)")
    endif
    
    all:
    	$(CC) hello.c
    
    

    运行

    $ make
    Makefile:5: "ARM=y "
    Makefile:10: *** "ARM=y "。 停止。
    
    更多相关内容
  • “USB调试助手”功能完善:  1、接收和发送可分别设置成ASCII格式或HEX(十六进制)格式  2、在原来中断传输和块传输的基础上增加了控制传输  3、可自动顺序发送多条命令,每条命令发送之间可设置发送间隔时间  4...
  • GDB调试

    千次阅读 2021-03-12 22:16:36
    转载至从 0 开始学习 Linux 系列之「08.15 个 gdb 调试基础命令」 此处仅想保存下来自己记录 gdb 简介 gdb 是 UNIX 及 UNIX-like 下的调试工具,在 Linux 下一般都直接在命令行中用 gdb 来调试程序,相比 Windows 上...

    转载至从 0 开始学习 Linux 系列之「08.15 个 gdb 调试基础命令」
    此处仅想保存下来自己记录

    gdb 简介

    gdb 是 UNIX 及 UNIX-like 下的调试工具,在 Linux 下一般都直接在命令行中用 gdb 来调试程序,相比 Windows 上的集成开发环境 IDE 提供的图形界面调试,一开始使用 gdb 调试可能会让你感到生无可恋,但是只要熟悉了 gdb 调试的常用命令,调试出程序会很有成就感,一方面因为这些命令就类似图形界面调试按钮背后的逻辑,另一方面用命令行来调试程序,逼格瞬间就上了一个档次,这次就跟大家分享 gdb 调试的基本技术和 15 个常用调试命令。

    在此之前,我们先来回顾下在 Windows 上使用 IDE 的图形界面调试过程。

    IDE 的调试步骤

    在 Windows 的 IDE 下调试程序,例如使用 VS,一般都有下面这几个操作:

    Debug 模式编译并启动程序
    程序运行出错,打断点分析出错的地方
    单步运行程序,包括:step over 单步执行;step into 跳入函数;step return 跳出函数
    还有全速运行,打印或者监视变量,冻结或解冻线程等调试技术
    在 IDE 中上面的这些步骤一般都有固定的按钮提供给我们使用,非常的简单方便,我们只要多练习练习,在图形界面调试程序不会很难,但是在 Linux 下用命令来调试程序就比图形界面要复杂很多了。

    其实,你知道真正的调试高手是什么样的吗?就是 Ta 对计算机原理和程序本身的逻辑理解非常深刻,在 Ta 的脑海中已经可以模拟程序的运行过程,并且知道可能出错的地方,这样连断点都不用打了,而且 Bug 的命中率也不低,或许这就是真正的大佬吧 😃

    我们回到正题,来介绍在 Linux 使用命令行的调试过程。

    gdb 的调试步骤

    在 Linux 下既然是使用命令行来调试,顾名思义就是手敲命令来调试程序,大体分为下面几个步骤,后面会详细介绍:

    1. 编译可以调试的程序
    2. 运行程序,打断点
    3. 单步调试,监控变量
    4. 可视化调试
    5. 其他调试技术
      可以看出,与 IDE 调试过程差不多,但是实际操作起来可是千差万别,可不是点按钮了,而是自己敲调试程序的命令,就相当于你正在学习那些调试按钮背后的原理,把这种方法学会,不用学就会使用 IDE 来调试程序,不管你信不信,我反正是信了 😃

    下面开始正式的调试技术介绍。

    15 个 gdb 调试基础命令

    下面来正式介绍 gdb 常用的调试技术,都是调试命令,只看不做比较乏味,还是建议你跟我一起动手调试下面的程序,这样才能真正的学会,这是本次要调试的 hello.c 程序,非常简单:

    #include <stdio.h>
    
    int add(int x, int y) {
        return x + y;
    }
    
    int main() {
        int a = 1;
        int b = 2;
        printf("a = %d\n", a);
        printf("b = %d\n", b);
    
        int c = add(a, b);
        printf("%d + %d = %d\n", a, b, c);
        return 0;
    }
    

    1. 编译可以调试的程序

    我们平常使用 gcc 编译的程序如果不加 [-g] 选项:

    gcc hello.c -o hello
    

    gdb 会提示该可执行文件没有调试符号,不能调试:

    gdb hello
    

    gdb 提示信息

    Reading symbols from a.out...(no debugging symbols found)...done.
    

    如果需要让程序可以调试,就必须在编译的时候加上 [-g] 参数:

    gcc -g hello.c -o hello
    

    2. 载入要调试的程序

    我们在命令行下需要手动载入待调试的程序,有 2 种方法:

    方法一 - gdb 可执行文件

    使用如下的命令来载入可执行文件 hello 到 gdb 中:

    gdb hello
    载入成功,gdb 会打印一段提示信息,并且命令行前缀变为 (gdb),下面是我的 Ubuntu 打印的信息:

    GNU gdb (Ubuntu 7.11.90.20161005-0ubuntu1) 7.11.90.20161005-git
    Copyright (C) 2016 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-linux-gnu".
    Type "show configuration" for configuration details.
    For bug reporting instructions, please see:
    <http://www.gnu.org/software/gdb/bugs/>.
    Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.
    For help, type "help".
    Type "apropos word" to search for commands related to "word"...
    Reading symbols from hello...done.
    (gdb) q
    

    注:按 q 退出 gdb

    方法二 - 使用 gdb 提供的 file 命令

    第二种方法是在 gdb 环境中使用 file 命令,我们需要先进入 gdb 环境下:

    gdb
    使用 file hello 载入待调试程序:

    (gdb) file hello
    Reading symbols from hello...done.
    (gdb) q
    

    3. 查看调试程序

    在 gdb 下查看调试程序使用命令 list 或简写 l,「回车」列出后面程序:

    (gdb) list
    1   #include <stdio.h>
    2   
    3   int add(int x, int y) {
    4       return x + y;
    5   }
    6   
    7   
    8   int main() {
    9       int a = 1;
    10      int b = 2;
    (gdb) 
    11      printf("a = %d\n", a);
    12      printf("b = %d\n", b);
    13      
    14      int c = add(a, b);
    15      printf("%d + %d = %d\n", a, b, c);
    16      return 0;
    17  }
    

    4. 添加断点

    在 gdb 下添加断点使用命令 break 或简写 b,有下面几个常见用法(这里统一用 b):

    b function_name
    b row_num
    b file_name:row_num
    b row_num if condition
    

    比如我们以第一个为例,在 main 函数上添加断点:

    (gdb) b main
    Breakpoint 1 at 0x6e8: file hello.c, line 4.
    

    打印的信息告诉我们在 hello.c 文件的第 4 行,地址 0x6e8 处添加了一个断点,那如何查看断点呢?

    5. 查看断点

    在 gdb 下查看断点使用命令 info break 或简写 i b,比如查看刚才打的断点:

    (gdb) i b
    Num     Type           Disp Enb Address            What
    1       breakpoint     keep y   0x00000000000006e8 in main at hello.c:4
    

    可以看到打印出刚才添加的 main 函数的断点信息:编号,类型,显示状态,是否启用,地址,其他信息,那又如何删除这个断点呢?

    6. 禁用断点

    在 gdb 下禁用断点使用命令 disable Num,比如禁用刚才打的断点:

    (gdb) disable 1
    (gdb) i b
    Num     Type           Disp Enb Address            What
    1       breakpoint     keep n   0x00000000000006e8 in main at hello.c:4
    

    可以看到字段「Enb」已经变为 n,表示这个断点已经被禁用了。

    7. 删除断点

    在 gdb 下删除断点使用命令 delete 断点 Num 或简写 d Num,比如删除刚才的 Num = 1 的断点:

    (gdb) d 1
    (gdb) i b
    No breakpoints or watchpoints.
    

    删除后再次查看断点,提示当前没有断点,说明删除成功啦,下面来运行程序试试。

    8. 运行程序

    在 gdb 下使用命令 run 或简写 r 来运行当前载入的程序:

    (gdb) r
    Starting program: /home/orange/Desktop/gdb/hello 
    a = 1
    b = 2
    1 + 2 = 3
    [Inferior 1 (process 10415) exited normally]
    

    我这次没有添加断点,程序全速运行,然后正常退出了。

    9. 单步执行下一步

    在 gdb 下使用命令 next 或简写 n 来单步执行下一步,假设我们在 main 打了断点:

    (gdb) b main
    Breakpoint 1 at 0x6e8: file hello.c, line 4.
    (gdb) r
    Starting program: /home/orange/Desktop/gdb/hello 
    
    Breakpoint 1, main () at hello.c:4
    4       int a = 1;
    (gdb) n
    5       printf("a = %d\n", a);
    

    可以看到当前停在 int a = 1; 这一行,按 n 执行了下一句代码 printf(“a = %d\n”, a);

    10. 跳入,跳出函数

    在 gdb 下使用命令 step 或简写 s 来跳入一个函数,使用 finish 来跳出一个函数,我们在第 14 行 int c = add(a, b); 添加一个断点:

    (gdb) b 14
    Breakpoint 1 at 0x6f6: file hello.c, line 14.
    (gdb) r
    Starting program: /home/orange/Desktop/gdb/hello 
    a = 1
    b = 2
    
    Breakpoint 1, main () at hello.c:14
    14      int c = add(a, b);
    (gdb) s
    add (x=1, y=2) at hello.c:4
    4       return x + y;
    (gdb) finish
    Run till exit from #0  add (x=1, y=2) at hello.c:4
    0x0000555555554705 in main () at hello.c:14
    14      int c = add(a, b);
    Value returned is $1 = 3
    (gdb) n
    15      printf("%d + %d = %d\n", a, b, c);
    

    这个过程是这样的:

    在 14 行 int c = add(a, b); 添加断点
    程序运行并停到 int c = add(a, b); 这一行
    s 跳入 add 函数
    finish 跳出 add 函数,并输出一些函数返回的信息

    11. 打印变量

    在 gdb 中使用命令 print var 或简写 p var 来打印一个变量或者函数的返回值,我们在第 10 行 int b = 2; 添加一个断点:

    (gdb) b 10
    Breakpoint 1 at 0x6c3: file hello.c, line 10.
    (gdb) r
    Starting program: /home/orange/Desktop/gdb/hello 
    
    Breakpoint 1, main () at hello.c:10
    10      int b = 2;
    (gdb) p a
    $1 = 1
    

    我们打印出变量 a 的值为 1,在调试中比较频繁的操作是「监视变量」,在 gdb 中如何做呢?

    12. 监控变量

    在 gdb 中使用命令 watch var 来监控一个变量,使用 info watch 来查看监控的变量,我们这里来监控变量 c:

    (gdb) b 14
    Breakpoint 1 at 0x6f6: file hello.c, line 14.
    (gdb) r
    Starting program: /home/orange/Desktop/gdb/hello 
    a = 1
    b = 2
    
    Breakpoint 1, main () at hello.c:14
    14      int c = add(a, b);
    (gdb) watch c
    Hardware watchpoint 2: c
    (gdb) info watch
    Num     Type           Disp Enb Address            What
    2       hw watchpoint  keep y                      c
    

    注意:程序必须要先运行才能监控。

    13. 查看变量类型

    在 gdb 下使用命令 whatis 查看一个变量的类型:

    (gdb) b 10
    Breakpoint 1 at 0x6c3: file hello.c, line 10.
    (gdb) r
    Starting program: /home/orange/Desktop/gdb/hello 
    
    Breakpoint 1, main () at hello.c:10
    10      int b = 2;
    (gdb) whatis b
    type = int
    

    这里变量 b 是 int 类型。

    14. 在 gdb 中进入 shell

    在 gdb 下使用命令 shell 启动 shell :

    (gdb) shell
    orange@ubuntu:~/Desktop/gdb$ exit
    exit
    (gdb) 
    

    使用 exit 会再次退回到 gdb 中。

    15. 在 gdb 中实现可视化调试

    谁说 gdb 只能在命令行调试呢?gdb 也支持「图形界面」,不过这里的图形界面都是用字符显示的,当然不如 VS 那种好看,不过使用可视化相比直接看命令行更加直观了。

    在 gdb 下使用 wi 启动可视化调试:

    (gdb) wi
    

    gdb 图形界面
    有了图形界面,就再对照着图形界面将前面的命令再练习练习,看看自己手敲的命令背后到底做了些什么,加深下影响。

    展开全文
  • 蓝牙调试助手

    千次下载 热门讨论 2014-05-17 19:57:53
    最近一直在搞Android上的蓝牙应用,每次在PC上调试蓝牙设备中的数据还可以,但是在Android手机上就非常不方便,所以自己写了个简单的Android蓝牙调试助手,希望各位下载使用,如有问题和Bug跟贴。教程:...
  • 设置调试断点与配置调试调试断点 查看或编辑断点 创建行断点 创建异常断点 配置调试器 在 Pycharm 里调试程序 调试程序 分布调试程序 现在我们已经学完了异常的知识,今天我们进行一个小的知识点普及,什么是bug...
    万叶集
    🎉 隐约雷鸣,阴霾天空。 🎉
    🎉 但盼风雨来,能留你在此。 🎉

    前言
    ✌ 作者简介:渴望力量的哈士奇 ✌,大家可以叫我 🐶哈士奇🐶 ,一位致力于 TFS 赋能的博主 ✌
    🏆 CSDN博客专家认证、新星计划第三季全栈赛道 top_1 、华为云享专家、阿里云专家博主 🏆
    📫 如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
    💬 人生格言:优于别人,并不高贵,真正的高贵应该是优于过去的自己。💬
    🔥 如果感觉博主的文章还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主哦


    专栏系列(点击解锁)学习路线指引知识定位
    🔥Python全栈白皮书🔥 零基础入门篇 以浅显易懂的方式轻松入门,让你彻底爱上Python的魅力。
    语法进阶篇 主要围绕多线程编程、正则表达式学习、含贴近实战的项目练习 。
    自动化办公篇 实现日常办公软件的自动化操作,节省时间、提高办公效率。
    自动化测试实战篇 从实战的角度出发,先人一步,快速转型测试开发工程师。
    数据库开发实战篇 更新中
    爬虫入门与实战 更新中
    数据分析篇 更新中
    前端入门+flask 全栈篇 更新中
    django+vue全栈篇 更新中
    拓展-人工智能入门 更新中
    网络安全之路 踩坑篇 记录学习及演练过程中遇到的坑,便于后来居上者
    网安知识扫盲篇 三天打鱼,不深入了解原理,只会让你成为脚本小子。
    vulhub靶场漏洞复现 让漏洞复现变得简单,让安全研究者更加专注于漏洞原理本身。
    shell编程篇 不涉及linux基础,最终案例会偏向于安全加固方向。 [待完结]
    WEB漏洞攻防篇 2021年9月3日停止更新,转战先知社区等安全社区及小密圈
    渗透工具使用集锦 2021年9月3日停止更新,转战先知社区等安全社区及小密圈
    点点点工程师 测试神器 - Charles 软件测试数据包抓包分析神器
    测试神器 - Fiddler 一文学会 fiddle ,学不会倒立吃翔,稀得!
    测试神器 - Jmeter 不仅是性能测试神器,更可用于搭建轻量级接口自动化测试框架。
    RobotFrameWork Python实现的自动化测试利器,该篇章仅介绍UI自动化部分。
    Java实现UI自动化 文档写于2016年,Java实现的UI自动化,仍有借鉴意义。
    MonkeyRunner 该工具目前的应用场景已不多,文档已删,为了排版好看才留着。


    现在我们已经学完了异常的知识,今天我们进行一个小的知识点普及,什么是bug?以及在日常工作中如何对bug进行程序调试。

    什么是bug?

    程序中出现的错误,但又没有通过异常去捕获,以至于直接抛出,从能导致程序的崩溃,继而造成对应的功能未达到想要的效果,这就是我们经常说的 程序出bug了。测试工程师一般也会将软件缺陷叫做 bug,当然了这是一种广义上的bug(分类:功能错误、内容相关、用户界面的UI、代码错误、需求变更等)。今天我们所说的bug指的是代码错误导致的程序错误。

    设置调试断点与配置调试器

    实际学习工作过程中, 很少出现写完代码一次就能运行成功的请款,通常都需要不断的调试,最终才能使程序能成功执行,接下来我们就介绍一下与调试相关的功能,重点是 配置调试器如何设置断点

    调试断点

    断点其实就是是 源代码标记 ,可以在特定点暂停程序de执行并检查其行为。设置断电后,断点将保留在当前项目中,直到人工手动的显式删除它;断点又分为 行断点异常断点

    设断点最直接的方式是在编辑器中,在需要设置断点的代码行的左侧边栏执行点击操作;或者按 Ctrl + F8(Mac使用 ⌘ + F8 快捷键) 就设置了行断点,然后会在代码行左侧边栏出现红色的圆点图标。如下图:



    查看或编辑断点

    主菜单 Run -> View Breakpoints , 或者按 Ctrl + Shift + F8(Mac使用 ⇧ + ⌘ + F8 快捷键),可以查看当前项目所有断点。

    PS:断点虽然有多个属性,最常用的也就前两项,所以通常使用默认就可以了。其余属性做为一般了解。



    在编辑器内, 右键点击断点图标,可以查看与编辑单个断点的属性。



    如果想要使断点失效, 参考上图,将属性 “Enabled” 不选中即可,失效的断点图标是空心红色圆的。



    创建行断点

    在可执行代码行上设置行断点,在执行该断点以前,线程执行将被挂起,PyCharm 显示该线程堆栈上的堆栈帧。

    在编辑器中,点击需要设置断点的代码行左侧边栏或者按 Ctrl + F8(Mac 使用 ⌘ + F8 快捷键) 就设置了行断点。如下图:

    如果想移除断点,只需点击断点图标就可以了,移除断点的方法是在 Debugger 中设置的。


    创建异常断点

    在PyCharm中,其为 Python、Django、Jinja2 和 JavaScript 提供了异常断点。当引发指定的异常时触发异常断点。它们全局应用于异常条件,不需要特定的源代码引用。

    主菜单 Run -> View Breakpoints , 点击 + 按钮, 选择 Python Exception Breakpoint。



    在"Select Exception Class"对话框中,指定库或项目中的异常类。



    新增加的异常断点会显示在对应分类下,如果想删除,可以点击 — 按钮或者选择要删除断点,点击键盘上的删除按钮。



    配置调试器

    通常我们在调试前还需要配置调试器,主要包括通用 Debugger 与 Python Debugger:

    主菜单: PyCharm/File -> Preference/Settings -> Build, Execution, Delopyment -> Debugger (分别对应 Windows 与 Mac 的操作方式), 下面列出各选项的解释,可根据需要进行设置。



    主菜单: PyCharm/File -> Preference/Settings -> Build, Execution, Delopyment -> Python Debugger (分别对应 Windows 与 Mac 的操作方式) 通常使用默认设置即可,不需要更改。除非你的程序使用了PyQt 或者 Gevent



    在 Pycharm 里调试程序

    前文已经讲了调试程序的准备工作,在设置断点后,然后从选定的运行/调试配置开始,就可以启动一个调试会话了。接下来的主要内容是讲解如何逐步完成程序调试,如何监控调试信息及停止与暂停等相关功能。

    调试程序

    1. 在编辑器中打开所需的 Python 脚本,或在"Project"工具窗口中选择文件。
    2. 从上下文菜单中选择 “debug 脚本名”。Python 脚本的调试会话将从默认的临时运行/调试配置开始,如果已经配置永久的运行/调试配置为当前脚本,此时菜单显示 “debug 配置名”。


    3.调试会话启动后,程序会在击中的第一个断点处挂起,PyCharm会自动打开Debug 工具窗口。会包括Debugger 与 Console 选项卡。



    4.在调试过程中, 可以通过工具栏按钮暂停与恢复调试。对应的菜单 暂停: Run -> Debugging Actions -> Pause Program 恢复 Run -![>](//img.mukewang.com/wiki/5f1d2d4009ffeec115260808.jpg) Debugging Actions -> Resume Program


    PS:如果对断点执行的静音操作(mute breakpoints), 所有断点图标将变为灰色,如下图所示。在此种状态调试程序,相当于没有断点直接运行了程序。如果要恢复断点,再点击一下静音断点的按钮即可。


    5.当执行到达断点或手动挂起程序时,可以通过分析栈帧来检查应用程序。所有当前活动的帧都显示在Debugger 工具窗口的"Frames"窗格中。这种场景多用于多线程的情况。(栈帧就是一个函数执行的环境。实际上可以简单理解为:栈帧就是存储在用户栈上的每一次函数调用涉及的相关信息的记录单元。)



    分布调试程序

    PyCharm 提供了一组步进操作,可以分步调试程序,步进按钮位于调试工具窗口工具栏上。



    下面从左到右分别介绍这些按钮的作用:

    注意:是分别从左到右依次介绍这些按钮,上图少画了一个,置灰的那个按钮也计算在内了

    1. Show Exception point (Art + F10) :点击该按钮,会让代码编辑窗口的光标回到程序运行的地方

    2. step over (F8): 单步执行,执行当前代码行,并带你到下一行,即使行中包含方法调用,将跳过方法的实现,不进入方法内部,直接移动到调用方方法的下一行。

    3. step into (F7): 单步执行,与step over 不同,如果包含方法调用可跳到当前执行点调用的方法内部当中去。

    ​ 下面分别演示了step over 与 step into



    1. step into my code (Alt + Shift + F7 (Mac 使用 ⌥ + ⇧ + F7 快捷键): ) 调试时,你可能只专注于自己的代码,对于系统模块的方法并不打算进入,此时可点击这个代替step into。看下面的例子logger.xxx都是系统模块logger的方法,而Solver()是自定义类,当点击step into my code 时只会进入自定义类的方法中。


    1. force step into: 强制调试器跳到当前执行点中调用的方法。对于调试python 程序,大多数情况下这个按钮是不可用状态,不是很常用。

    2. step out (Mac ⇧ + F8 快捷键): 单击此按钮可使调试器退出当前方法,并执行其后执行的行返回到上一层。 下面的例子先进入方法内部,然后step out 回到主程序,再点击step out, 直接跳到下一个断点。



    1. Run to Cursor(Alt + F9 Mac 使用 ⌥ + F9 快捷键: ) 继续执行,直到达到光标所在行的位置停止。在调试过程中,你点击代码中任意一行,然后点击这个按钮,调试器就会直接跳到这行,相当给这行加了一个临时断点。


    展开全文
  • Xcode调试技巧总结

    千次阅读 2022-01-21 11:09:56
    本来觉得调试是一件很简单的事情,但是看了很多介绍调试方法的文章,发现有些技巧并不知道,有必要对常用的Xcode调试技巧做一个总结,提高工作效率。 一、调试面板 上方:断点开关、继续执行、单步执行、单步...

    前言

    本来觉得调试是一件很简单的事情,但是看了很多介绍调试方法的文章,发现有些技巧并不知道,有必要对常用的Xcode调试技巧做一个总结,提高工作效率。

    一、调试面板

    上方:断点开关、继续执行、单步执行、单步步入、单步步过等命令;
    左边:watch窗口,负责变量信息显示,如果想查看寄存器的内容,可以将左下角的Auto切换为All
    右边:日志窗口,接受和显示程序日志,左下角可以选择All/Debugger/Target output

    二、断点

    1- 普通断点

    找到下断点的代码行,可以通过下面3种方式下断点:
    (1)导航栏:Debug->Breakpoint->Add Breakpoint at Current Line
    (2)快捷键:command +
    (3)鼠标:直接在编辑区域左边行号的地方左键

    大部分情况普通断点就满足需求了,但是对于一些特殊的调试情况,还需要掌握一些其他类型的断点。

    2- 条件断点

    适用场景
    (1)一个函数重复多次被调用,但是只需要调试其中某一次的情况时;
    (2)对于一些因为异常数据导致的bug调试也很实用;
    下断点: 右键普通断点 -> Edit Breakpoint,条件断点和普通断点相比只是多了一个条件判断而已,和我们手动在断点代码加一个if条件判断效果一样,只有满足条件的情况才会断下来;

    3- 符号断点

    符号断点: 其实就是对一个特定的函数名下断点,这里的方法可以是OC方法或者C++函数名;
    适用场景: 调试一些没有源码的模块时比较有用,比如调试一个第三方提供的Lib库,或者系统模块,可以给相应函数下断点,调试程序的运行流程,查看一些参数信息;
    下断点 :断点Tab页 -> 点击下面+号 -> Symbolic Breakpoint

    设置符号断点可以输入类名+函数名,也可以只输入函数名,xcode会自动匹配不同类中同名的方法进行断点,如下DJTPerson和DJTAnimal都有-(void)djt_run方法,会自动生成两个断点,一旦被调用就会命中断点:

    4- 异常断点

    适用场景: 异常断点用来调试程序抛出异常而导致退出,下个异常断点很快就能定位运行到那行代码出了问题;
    下断点: 断点Tab -> 左下角+号 -> Exception Breakpoint
    Exception Breakpoint也是可以编辑的,可以选择Exception类型,也可以选择在抛出异常或者捕获异常的时候断点等;

    注:有的程序会使用异常来组织程序逻辑,比如微信扫一扫,所以如果Exception选了All,那么异常断点会频繁触发,所以这种情况可以只选择Objective-C异常。

    下面是一个异常断点,在DJTPerson类中只有djt_run方法的声明没有实现,触发断点:

    5- watch断点

    顾名思义:watch断点就是当某个变量发生改变时触发的断点;
    适用场景: watch断点对于要跟踪某个变量或者某个状态的变化时非常有用的,可以方便的跟踪到哪些地方改变了变量的值。
    下断点: 在xcode的watch窗口 -> 右键需要watch的变量 -> watch "Xxx":

    如例子中,当_name变量发生变化时调试器会自动断下来,同时输出变化信息:

    6- 线程断点

    线程断点: 线程断点适用在调试多线程代码的时候,一段代码可能会被多个线程同时执行,如果下普通断点,那么你会在不同线程之间切来切去,最后自己都迷糊了,这个时候可以使用多线程断点。
    下断点: 调试区域右边控制台输出 -> breakpoint set –f 文件名 –l 行号 –t 线程id

    下面例子在28行设置普通断点,就可以在控制台打印 thread-id,控制台输入:

    thread info
    复制代码

    获取当前线程id,在控制台通过命令行给32行设置线程断点:

    breakpoint set -f ViewController.m -l 32 -t 0x331854
    复制代码

    7- 断点后的Action

    断点后的Action: 当断点被触发可以执行的一些操作;
    下断点: 右键断点 -> Edit Breakpoint -> Add action

    action类型很多,有调试命令、apple script、shell script等:

    下边是在运行到断点后po一下person.name,直接打印了name的值:

    如果觉得仅仅输出对象信息不够,还想加一些自己指定的内容,可以使用Log Message。

    三、常用命令

    1- p命令

    p命令:查看基本数据类型的值
    po命令:查看oc对象
    简单查看一个变量或者OC对象的值在watch窗口完全可以满足,但是如果需要查看一个oc对象的属性,或者一个oc对象方法的返回值怎么办呢?p和po命令后面都可以接相应的表达式,如:

    2- expr命令

    expr命令:全称expression,可以在调试时动态修改变量的值,同时打印出结果。使用expr命令动态修改变量的值,可以在调试的时候覆盖一些异常路径,对调试异常处理的代码很有用。

    3- call命令

    call命令用来动态调用函数,可以在不增加代码不重新编译的情况下动态调用一个方法。下例动态将view1从父view移除:

    4- image命令

    image命令可以列出当前app中的所有模块,可以查找一个地址对应的代码位置,在调试越狱插件时,可以用image list命令查看越狱插件是否注入自己的App。当遇到crash时,查看线程栈只能看到栈帧的地址,使用image lookup -address 地址命令可以方便的定位这个地址对应的代码行。

    5- bt命令

    bt命令可以查看线程的堆栈信息,该信息也可以在导航区的Debug Navigator看到;
    bt:打印当前线程栈 bt all:打印所有线程栈

    分割线:上边介绍了基本的调试技巧,下面是一些不同场景下的调试经验

    四、多线程

    场景:在调试的时候bug不出现,一旦关闭调试直接运行bug就出现:这种问题大部分是因为多线程bug,而调试影响了多线程的执行顺序。
    技巧:这种问题可以在关键点输出log,之前介绍的断点action中的Log Message就派上用场,这样的好处是不需要在代码中添加冗余的log即可调试;在调试多线程问题时,合理使用线程断点和条件断点也是很有帮助的;

    五、UI调试

    1-控件信息

    查看控件信息除了使用p和po命令,还可以使用expr命令修改控件属性,如内容、坐标、大小等,这样可以不重启程序看到界面的变化;

    2-界面结构

    查看界面结构:po [view recursiveDescription],该命令可以打印出view的所有子view的结构关系,对于调试界面层级关系很有用;

    3-快速预览

    xcode支持在调试时对变量进行快速预览,调试时将鼠标放在变量上,然后点击快速预览按钮即可看到控件的显示。

    4-符号断点跟踪UI变化

    对于一些系统控件的信息,如果发现最终显示和自己设置的不一样,可以使用符号断点,在一些设置函数下断点,这样就可以很清晰的看到是从哪里改变了这个属性的值。比如一个UIButton的title在显示的时候和设置的不一样,只需要符号断点设置setTitle就可以跟踪哪里改了值;

    六、其他

    后续再添加


    作者:D___
    链接:https://juejin.cn/post/6950852311346315271
    来源:稀土掘金
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    展开全文
  • 【VSCode】调试器debugger详细使用手册

    千次阅读 2022-04-01 14:09:01
    Visual Studio Code 的主要功能之一是其出色的调试支持。VS Code 的内置调试器有助于加速您的编辑、编译和调试循环。 调试器扩展 VS Code 具有对Node.js运行时的内置调试支持,并且可以调试 JavaScript、TypeScript...
  • CodeBlocks调试简要教程

    千次阅读 2021-12-08 16:46:47
    这篇文章我主要会介绍CodeBlocks与Visual Studio Code的调试功能,并简单介绍如何使用它。
  • 蓝牙调试器-划时代无线调试

    千次阅读 多人点赞 2019-08-14 16:57:54
    蓝牙调试器 这篇文章的受众是本专科院校有理想的青年或已经踏入社会的电子工程师们。本文章旨在介绍一款在Android设备上通过使用蓝牙功能实现无线调试的应用。 一、蓝牙调试器介绍 此蓝牙调试器历时一个多月...
  • 《程序是调试出来的》嵌入式Keil5的调试技巧

    千次阅读 多人点赞 2021-12-10 22:58:35
    调试手段是教不会的,而是自己亲身实践出来的。那笔者撰写这篇文章的意义何在?一个人的发展始终会受限于自己的眼界,会当凌绝顶,一览众山小,笔者想要带你们览下群山风景,至于最终能不能攀登上来就看你们各自的本事...
  • DAP调试适配协议

    万次阅读 2021-12-14 09:13:56
    DAP调试适配协议 什么是 DAP 协议 DAP 即调试适配协议( Debug Adapter Protocol ),顾名思义,它是用来对多种调试器进行抽象统一的适配层,将原有 IDE 和调试工具直接交互的模式更改为和 DAP 进行交互。该模式可以让...
  • LabVIEW串口调试助手

    千次阅读 2022-05-03 17:21:16
    该串口调试助手支持:自定义COM口、通信波特率、循环定时发送、HEX/字符显示、发送/接收错误状态提示等功能。
  • TCP和MODBUS-TCP通讯调试软件V1.2_Wince_Winxp_通用版

    千次下载 热门讨论 2015-01-06 11:44:56
    还可做TCP调试器, 此软件免费使用。 功能如下: 1.多网卡支持,点击“网卡X”处可自动切换网卡IP。 2.增加MODBUS寄存器个数至9999。 3.修改一次最多读写寄存器个数120个。 4.增加WIN7等高版本系统支持。 5....
  • 如何调试程序及调试程序基本步骤、方法详解

    万次阅读 多人点赞 2019-07-02 20:46:05
    1.为什么要进行程序调试调试程序的目的? 程序调试是将编制的程序投入实际运行前,用手工或 编译程序等方法进行测试,修正语法错误和逻辑错误的过程。这是保证计算机信息系统正确性的必不可少的步骤。 测试时程序...
  • APP动态分析-Eclipse调试

    千次阅读 2021-12-20 16:46:44
    之前说过,用Android Studio和Eclipse对应用进行动态调试的机会会很少,但是最近接触一个项目就需要用到动态调试的技术,而之前已经讲过Android Studio对smali的动态调试了,这里讲下Eclipse对java的动态调试。...
  • 关于DevC++调试问题,还不会调试的同学看这里!!! DevC++该如何调试? 这篇是关于Devc该如何调试的,有些刚接触的同学因为某些因素可能还不会调试,所以我在这里就教大家简单的调试吧! 首先,这里是我用来演示的...
  • 一、硬件调试的四个目标 二、硬件调试心得: 三、一块新的板子的调试思路 四、硬件调试,一些网络资料 五、单片机硬件调试中常见的案例(杂记) 一、硬件调试的四个目标 1、元器件焊接正确(错焊、漏焊、虚焊...
  • 移动端调试神器vConsole

    千次阅读 2022-04-15 10:16:53
    一个轻量、可拓展、针对手机网页的前端开发者调试面板。 vConsole 是框架无关的,可以在 Vue、React 或其他任何框架中使用。 现在 vConsole 是微信小程序的官方调试工具。 功能特性 日志(Logs): console.log|info|...
  • ADB无线调试
  • iOS10.3真机调试包工具

    千次下载 热门讨论 2017-03-28 18:37:24
    iOS10.3真机调试xcode包,使xcode能在真机10.3上调试
  • vscode使用lldb调试C++程序

    千次阅读 2022-01-24 23:15:04
    一般情况下,在linux下使用gdb调试,windows下使用Visual Studio调试。本文介绍使用vscode + lldb调试C++的cmake工程。
  • 串口/I2C调试工具

    2014-01-13 14:26:56
    很好用的串口通信软件,小而强大, 还有I2C调试功能
  • C++编程调试秘笈,完整扫描版

    千次下载 热门讨论 2014-10-09 07:23:05
    《C++编程调试秘笈》内容简介:当你使用C++进行编程时,很容易犯下各种各样的错误。有哪些常见的错误和陷阱?它们有什么一般的规律和特点?如何避免犯这样的错误?《C++编程调试秘笈》针对这些问题一一解答。 《C++...
  • GDB调试操作

    万次阅读 多人点赞 2022-03-23 17:47:55
    GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。 对于一名Linux下工作的c/c++程序员,gdb是必不可少的工具。 1、启动gdb 使用vim编辑器编写一个简单的测试程序并...
  • STM32在线调试、看门狗、跑飞调试

    千次阅读 2020-02-11 20:38:41
    1. STM32的调试模式 对于STM32的CPU,支持调试模式,即CPU可以被暂停,用户可以在CPU暂停后查看寄存器或变量的状态。 2. 在线调试工具 由于版权问题,JLink调试工具渐渐淡出,现在大部分使用ST-Link,它与JTAG...
  • IDEA 开启远程调试

    千次阅读 2022-02-20 20:06:58
    idea 远程调试 背景 在编写代码时, 总会遇到这样或者那样的bug. 这有些bug 特别是业务逻辑的bug . 在生产或测试环境好复现而在开发环境不好复现. 现在提供的一种思路, 就是远程调试: 我们可以在本地直接调试生产...
  • Pycharm断点调试

    千次阅读 2022-01-30 20:38:33
    很多时候可以通过提示的信息修改程序,但是有时我们想得到更多的信息,这个时候就需要进行断点调试。 在Pycharm里设置断点如下: 这样启动debug模式后(Shift+F9),程序就会暂停在断点处。 如上面所示,暂停在第15...
  • CodeBlocks单步调试入门

    热门讨论 2013-11-12 21:04:21
    单步调试是发现运行错误和逻辑错误的“利器”,可用于 (1)跟踪程序的执行流程,发现错误的线索 ——发现该走A路径,却走了B路径 (2)跟踪过程中,还可以观察变量的变化,从而发现其中存在的问题 ——该是 1,执行...
  • 2.手机打开USB调试模式 3. 查找你需要连接的Android(安卓)设备的ip (方式一)手机开热点电脑连接(手机分享蓝牙网络给电脑连接): 1)电脑打开cmd窗口(win+R) 输入: cmd 2)在cmd里面输入: ipconfig 3)...
  • 【程序员基本功】——VS调试技巧

    千次阅读 多人点赞 2022-03-20 20:14:37
    调试(英语:Debugging / Debug),又称除错,是发现和减少计算机程序或电子仪器设备中程序错误的一个过程。 调试的基本步骤 发现程序错误的存在 1.程序员自己 2.测试人员-专业找bug的 3.用户-使用者 以隔离、消除等...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,210,808
精华内容 884,323
关键字:

调试

友情链接: ceshimohu1106.zip