-
2016-06-11 12:59:20
调试器简介
严格的讲,调试器是帮助程序员跟踪,分隔和从软件中移除bug的工具。它帮助程序员更进一步理解程序。一开始,主要是开发人员使用它,后来测试人员,维护人员也开始使用它。
调试器的发展历程:
- 1. 静态存储
- 2. 交互式存储分析器
- 3. 二进制调试器
- 4. 基本的符号调试器(源码调试器)
- 5. 命令行符号调试器
- 6. 全屏文本模式调试器
- 7. 图形用户接口调试器
- 8. 集成开发环境调试器
调试器的设计和开发要遵循四个关键的原则:
- 1. 在开发过程中,不能改变被调试程序的行为;
- 2. 提供真实可靠的调试信息;
- 3. 提供详细的信息,是调试人员知道他们调试到代码的哪一行并且知道他们是怎么到达的;
- 4. 非常不幸的是,我们使用的调试总是不能满足我们的需求。
按照划分的标准不同,调试器主要分为一下几类:
- 1. 源码调试器与机器码调试器
- 2. 单独的调试器与集成开发环境的调试器
- 3. 第四代语言调试器与第三代语言调试器
- 4. 操作系统内核调试器与应用程序调试器
- 5. 利用处理器提供的功能的调试器与利用自行仿真处理器进行调试的调试器
-
调试器的架构
调试器之间的区别更多的是体现在他们展现给用户的窗口。至于底层结构都是很相近的。下图展示了调试器的总体架构:
调试器内核
调试器服务于所有的调试器视图。包括进程控制,执行引擎,表达式计算,符号表管理四部分。
操作系统接口
调试器内核为了访问被调试程序,必须使用操作系统提供的一系列例程。
硬件调试功能
调试器控制被调试程序的能力主要是依靠硬件支持和操作系统的调试机制。调试器需要最少三种的硬件功能的支持:
1. 提供设置断点的方法;
2. 通知操作系统发生中断或者陷阱的功能;
3. 当中断或者陷阱发生时,直接读写寄存器,包括程序计数器。
通用的硬件调试机制
1. 断点支持
断点功能是通过特定的指令来实现的。对于变长指令的处理器,断点指令通常是最短的指令,下图给出了四个处理器的断点指令:
2. 单步调试支持
单步调试是指执行一条指令就产生一次中断,是用户可以查找每条指令的执行状态。一般的处理器都提供一个模式位来实现单步调试功能。
3. 错误检测支持
错误检测功能是指当操作系统检测到错误发生时,他通知调试器被它调试的程序发生了错误。
4. 检测点支持
用来查看被调试程序的地址空间(数据空间)。
5. 多线程支持
6. 多处理器支持
调试器的操作系统支持功能
为了控制一个被调试程序的过程,调试器需要一种机制去通知操作系统该可执行文件希望被控制。即一旦被调试程序由于某些原因停止的时候,调试器需要获取详细的信息使得他知道被调试程序是什么原因造成他停止的。
调试器是用户级的程序,并不是操作系统的一部分,并不能运行特权级指令,因此,它只能通过调用操作系统的系统调用来实现对特权级指令的访问。
调试器运行被调试程序,并将控制权转交给被调试程序,需要进行上下文切换。在一个简单的断点功能实现,有6个主要的转换:
1. 当调试器运行到断点指令的时候,产生陷阱跳转到操作系统;
2. 通过操作系统,跳转到调试器,调试器开始运行;
3. 调试器请求被调试程序的状态信息,该请求送到操作系统进行处理;
4. 转换到被调试程序文本以获取信息,被调试程序激活;
5. 返回信息给操作系统;
6. 转换到调试器以处理信息。
一旦使用图形界面调试器,过程会更加的复杂。
对于多线程调试的支持;
l 一旦进程创建和删除,操作系统必须通知调试器;
l 能够询问和设置特定进程的进程状态;
l 能够检测到应用程序停止,或者线程停止。
例子:UNIX ptrace()
UNIX ptrace 是操作系统支持调试器的一个真实的API。
控制执行
调试器的核心是它的进程控制和运行控制。为了能够调试程序,调试器必须能够对被调试程序进行状态设置,断点设置,运行进程,终止进程。
控制执行主要包含一下几个功能:
1. 创建被调试程序
调试器做的第一件工作,就是创建被调试程序。一般通过两种手段:一种是为调试程序创建被调试进程,另一种是将调试器附到被调试进程上。
2. 附到被调试进程
当一个进程发生错误异常,并且在被刷出(内存刷新)内存的时候,允许调试器挂到出错进程以此来检查内存镜像。这个时候,用户不能再继续执行进程。
3. 设置断点
设置断点的功能是在可执行文本中插入特殊的指令来实现的。当程序执行到该特殊指令的时候,就产生陷阱,陷到操作系统。
4. 使被调试程序运行
当调试中断产生的时候,调试器属于激活进程,而被调试程序属于未激活进程。调试器产生一个系统中断请求恢复被调用函数的执行,操作系统对被调试程序进行上下文切换,恢复被调用程序的现场状态,然后执行被调用程序。
执行区间的调试事件生成类型:
l 断点,单步调试事件
l 线程创建/删除事件
l 进程创建/删除事件
l 检测点事件
l 模块加载/卸载事件
l 异常事件
l 其他事件
断点和单步调试
断点通常需要两层的表示:
l 逻辑表示:指在源代码中设置的断点,用来告诉用户的;
l 物理表示:指真实的在机器码中写入,是用来告诉物理机器的。断点必须存储写入位置的机器指令,以便能够在移除断点的时候恢复原来的指令。
断点存在条件断点。
断点存在多对一的关系,即多个用户在同一个地方设置断点(多个逻辑断点对应一个物理断点),当然也有多对多的关系。下图展示了这样的一个关系:
临时断点
临时断点是指只运行一次的断点。
内部断点
内部断点对用户是不可见的。他们是被调试器设置的。
一般主要用于:
l 单步调试:内部断点和运行到内部断点;
l 跳出函数:在函数返回地址设置内部断点;
l 进入函数
查看程序的上下文信息
一般要查找程序的上下文信息主要有以下几种方法:
- 源代码窗口
通过源代码查看程序执行到代码的那一部分
- 程序堆栈
程序堆栈是由硬件,操作系统和编译器共同支持的:
硬件: 提供堆栈指针;
操作系统:为每个进程建立堆栈空间,并管理堆栈。一旦堆栈溢出,而产生一个错误;
- 汇编级调试:反汇编,查看寄存器,查看内存
更多相关内容 -
谷歌浏览器的前端代码调试
2021-07-01 20:08:13前端代码调试在入门的时候我使用过如下的几种方法: 1、在代码中写入alter 2、在代码中写入console.log,在控制台输出 但是两种方法都并不能说是正经的调试,具体算是什么我也不知道该怎么定义。前端代码的调试在...在Javaweb的开发中后端的调试我们在后端代码打断点,debug运行即可,但是前端的调试又应该如何进行呢?
前端代码调试在入门的时候我使用过如下的几种方法:
1、在代码中写入alter
2、在代码中写入console.log,在控制台输出
但是两种方法都并不能说是正经的调试,具体算是什么我也不知道该怎么定义。前端代码的调试在我们今天的文章中说的主要是代码时在本地运行的,在本地运行的情况下我们前端的调试可以是在浏览器(Google Chrome)中的也可以是在开发工具中的,今天我们主要说的是在浏览器中打断点的。
代码要能被调试的前置条件是浏览器可以请求到代码,也就是说静态资源的权限项目是放开了的,这时候进行调试分为如下几步:
1、在开发工具(IDEA)中启动项目的时候要以Debug的模式启动
2、项目启动后在浏览器显示的页面中F12进入开发者模式
3、点击Source,在Page下面找我们的需要的代码文件,如果找到的当然好,找不到的话看第四步
4、点击FileSystem引入需要的文件
有时候由于浏览器设置的原因,在点击添加后会出现一个请求访问对应目录的请求框,这时候只需要点击确认即可,如果要是弹出的迟或是你自己忽略了,就也会造成引入不成功
-
【C语言精讲】——代码调试方法
2022-02-06 12:26:151.1什么是调试 调试(Debugging / Debug),又称除错,是发现和减少计算机程序或电子仪器设备中程序 错误的一个过程。 1.2调试的基本步骤 发现程序错误的存在 以隔离、消除等方式对错误进行定位 确定错误产生...1. 调试
调试(Debugging / Debug),又称除错,是发现和减少计算机程序或电子仪器设备中程序 错误的一个过程。
1.1 调试的基本步骤
- 发现程序错误的存在
- 以隔离、消除等方式对错误进行定位
- 确定错误产生的原因
- 提出纠正错误的解决办法
- 对程序错误予以改正,重新测试
1.2 Debug和Release
Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。
Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优 的,以便用户很好地使用。
2. 调试快捷键
F5
启动调试,会向后执行代码到下一个逻辑上的断点。(通常使用F5跳到想要的断点处)
F9
设置断点,程序执行到断点处就会主动停下来
断点的重要作用,可以在程序的任意位置设置断点。这样就可以使得程序在想要的位置随意停止执行,继而一步步执行下去。
F10
逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句。
(遇到函数直接跳过)
F11
逐语句,每次都执行一条语句,可以执行进入函数内部(常用)。
Ctrl + F5
开始执行不调试,直接运行程序。
3. 调试时查看程序当前信息
按F10或F11进入调整状态以后:
3.1 查看临时变量的值
3.2 查看内存信息
3.3 查看调用堆栈
3.4 查看汇编信息
方法一(在调试→窗口选择反汇编)
方法二(直接在代码行右击选择反汇编)
3.5 查看寄存器信息
-
IDEA远程调试Java代码
2022-03-08 23:10:59文章目录1 前言2 远程 Debug 调试原理2.1 理论基础2.2 远程调试分类3 主动连接调试3.1 ...当我们的代码在线上/测试环境运行出现异常需要进行问题定位时,之前的传统做法是:查看异常日志,根据日志定位到出错代码,然文章目录
1 前言
当我们的代码在线上/测试环境运行出现异常需要进行问题定位时,之前的传统做法是:查看异常日志,根据日志定位到出错代码,然后再根据相关参数及异常信息进行推断。但是很多异常问题需要更细致的进行debug才能够更精准的去定位和解决,这种情况下,我们希望能够像在本地调试一样去debug线上/测试环境的代码,这样可以大大提升bug修复的效率。IDEA 远程调试为我们提供了解决方案,像运行本地代码一样调试远程主机上的程序,以排查远程程序的BUG或代码执行流程。
2 远程 Debug 调试原理
在本地远程调试服务器端的代码原理:本地和服务器端建立一个socket连接监听,当客户端访问服务器的时候,服务器端会先去问本地idea有没有断点,如果有会停在当前断点,如果没有就返回给客户端。
2.1 理论基础
JPDA
(Java Platform Debugger Architecture)是Java平台调试体系结构的缩写。由3个规范组成,分别是JVMTI
(JVM Tool Interface),JDWP
(Java Debug Wire Protocol),JDI
(Java Debug Interface) 。- 1.
JVMTI
定义了虚拟机应该提供的调试服务,包括调试信息(Information譬如栈信息)、调试行为(Action譬如客户端设置一个断点)和通知(Notification譬如到达某个断点时通知客户端),该接口由虚拟机实现者提供实现,并结合在虚拟机中 - 2.
JDWP
定义调试服务和调试器之间的通信,包括定义调试信息格式和调试请求机制 - 3.
JDI
在语言的高层次上定义了调试者可以使用的调试接口以能方便地与远程的调试服务进行交互,Java语言实现,调试器实现者可直接使用该接口访问虚拟机调试服务。
2.2 远程调试分类
远程调试分为主动连接调试,和被动连接调试。
主动连接调试:服务端配置监控端口,本地IDE连接远程监听端口进行调试,一般调试问题用这种方式。
被动连接调试:本地IDE监听某端口,等待远程连接本地端口。一般用于远程服务启动不了,启动时连接到本地调试分析。
3 主动连接调试
3.1 远程服务中开启 Debug 服务
3.1.1 对于 SpringBoot
命令行添加选项,并重启,注意新参数必须在 -jar 之前
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 -jar springbootfirst.jar
3.1.2 对于 Tomcat
启动脚本中添加选项,并重启:
## sudo vim $CATALINA_HOME/bin/catalina.sh JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005"
3.2 IDEA 中指定 Debug 服务器
-
点击主窗口菜单
Run / Edit Configurations
,打开Run/Debug Configurations
窗口; -
点击工具栏上的
+
按钮,下拉菜单中选择Remote
; -
设置 Host 为远程服务器的域名或IP,保持 Port=5005 无需调整;
-
Use module classpath
配置为程序模块名称; -
Command line arguments for remote JVM
配置:配置Debug远程服务的命令行启动参数,形如
-Xdebug -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
,参数说明如下:- -Xdebug:JVM在DEBUG模式下工作;
- -Xrunjdwp:JVM使用(java debug wire protocol)来运行调试环境;
- transport:监听Socket端口连接方式,常用的dt_socket表示使用socket连接;
- server:=y表示当前是调试服务端,=n表示当前是调试客户端;
- suspend:=n表示启动时不中断(如果启动时中断,一般用于调试启动不了的问题);
- address:表示本地监听的地址和端口。
3.3 远程服务器防火墙端口放行
如果调试服务器与远程服务器网络不相通则需要开放端口
### sudo vim /etc/sysconfig/iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 5005 -j ACCEPT ### 重启生效: sudo systemctl restart iptables
4 被动连接调试
首先需要IDEA配置监听,如主动连接调试的IDEA配置图片,Debugger mode选择:Listen to remote JVM,配置本地监听端口,比如默认5005。点击Debug开始等待远程连接调试。
4.1 对于 Tomcat
配置远程服务启动脚本:
JAVA_OPTS="$JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,address=127.0.0.1:5005,suspend=y"
4.2 对于 SpringBoot
命令行添加选项,并重启,注意新参数必须在 -jar 之前
java -Xdebug -Xrunjdwp:transport=dt_socket,address=127.0.0.1:5005,suspend=y -jar springbootfirst.jar
参数含义和主动连接调试一样,只是这里suspend=y表示启动时就中断,需要连接本地IDE调试启动。address=ip:port,ip需要修改为本地的对外IP。
这样远程项目启动时就连接到本地,方便调试项目启动不了的问题。
5 开始调试
- 要求:双方代码一致,否则远程调试无法启动;
- 本地启动刚刚配置的 Remote Server,正常时会看到日志:
Connected to the target VM, address: 'xxx:5005', transport: 'socket'
- 本地 IDEA 代码中设置断点
- 浏览器或手机 HTTP 访问服务器
- IDEA 即可在断点暂停并跟踪
6 关闭调试
服务器上多开放个端口是不安全的,调试完毕后可恢复防火墙设置。
Java 服务器关闭 Debug 服务器的功能,因为debug会影响性能。
- 1.
-
关于调试代码什么的
2018-04-07 15:32:01一,什么是debug调试有关debug调试相信大家都不陌生,但是到底什么是debug调试?debug的由来,计算机初学者可能就有点陌生。debug是一种计算机程序,是由世界最早的程序员之一葛丽思·霍波命名,她在一次调试设备时... -
Python之pdb代码调试
2020-07-11 20:10:07究其原因,还是因为这类Python工程师没有意识到Python的强大,仅仅用Python来解决一些很简单的事情,如果总是写非常短小的Python代码,可能确实不需要调试器。但是,如果代码量大,逻辑复杂以后,还是用print函数... -
PHP代码调试
2016-09-28 23:40:42PHP语言没有多线程、同步等概念,大多由...php代码调试的实现方式主要有两种: 通过PHP的调试函数实现 通过断点调试工具实现 1. PHP的调试函数 对于一般的PHP代码,使用几个常用的输出函数就可实现代码调试。常 -
IDEA - 2020.1 版本针对调试器和代码分析器的改进,值得期待
2020-02-05 18:51:52IDEA - 2020.1 版本针对调试器和代码分析器的改进,值得期待1、对于调试器的加强:数据流分析辅助2、调试加强:属性置顶功能3、调试加强:IPV6 调试4、性能分析的改进,剔除额外的东西5、支持读取内存快照文件6、... -
看完这篇带你完全理清IDE、编辑器、编译器、解释器和调试器的概念
2020-08-10 17:38:11集成开发环境,一般包括代码编辑器、编译器、调试器和图形用户界面工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。所有具备这一特性的软件或者软件套(组)都可以叫集成开发环境。... -
Android应用逆向——最好用的两个无源码调试器
2016-07-22 00:00:29要逆向分析并修改一个Android应用,首先是对APK进行解包和打包,这一部分网上资料...关于如何解包和打包、反编译为JAVA代码、修改smali代码的资料很多,按部就班做起来也比较简单。dex2jar、JD-GUI获得了反编译的JAVA代 -
Qt Creator配置MSVC调试器(解决为什么Qt可以运行但是无法调试)
2021-08-17 09:31:33Qt Creator配置MSVC调试器(解决为什么Qt可以运行但是无法调试)Qt Creator单步调试模式一:使用MinGW编译器和调试器模式二:Qt Creator配置MSVC调试器 Qt Creator单步调试 在Windows环境下,使用Qt Creator开发Qt... -
谷歌浏览器调试JavaScript代码
2018-08-07 10:39:15谷歌浏览器调试JavaScript代码 由于在前端是一个弱类型语言,虽然现在增加了ESLint,Flow等静态检查,但是这些检查工具只能帮你检查出一些代码的显式问题,很多隐藏的逻辑性问题我们只能通过console去输出,但是... -
谷歌浏览器调试js代码
2020-05-28 21:24:33谷歌浏览器调试js代码 前言 在没有开发环境的情况下,特别是代理无法使用,定位一个js问题是很麻烦的。谷歌浏览器F12,在源代码处有多种调试js代码的方法,我只用过一种哈。 调试js代码 打开F12,在sources找到... -
火狐浏览器调试的时候没有显示对应的页面代码以及js
2019-04-22 15:59:09于是用谷歌浏览器进行测试,结果谷歌浏览器可以显示,后来发现是火狐浏览器使用了隐身模式,然后也顺便测试一下谷歌浏览器在隐身模式下进行调试是否也不显示对应的页面代码以及js,测试结果是谷歌是会显示的 ... -
微信开发者工具 微信小程序中调试器console界面不显示跑出的代码结果的问题解决
2020-04-10 11:33:39最初的console 界面可能以下这样的, 当ctrl + s 保存并跑了一段代码,但是不显示结果. 解决办法就是把旁边的设置按钮 (蓝色的小齿轮) 点击一下就可以切换界面并看到跑代码的结果了 点击一下设置按钮,显示界面改变... -
Python代码调试
2018-11-01 14:15:28有的bug很简单,看看错误信息就知道,有的bug很复杂,我们需要知道出错时,哪些变量的值是正确的,哪些变量的值是错误的,因此,需要一整套调试程序的手段来修复bug。 第一种方法简单直接粗暴有效,就是用print()把... -
VS Code调试C代码
2022-03-13 17:29:40首先说明的是vscode是代码编辑器,并不是编译器,它本身并不能编译C语言。 在这里我们使用的是MinGW-w64作为C语言的编译器。MinGW-w64的前身是MinGW的全称是:Minimalist GNU on Windows。它实际上是将经典的开源 ... -
前端vue代码如何调试?
2022-04-23 15:35:47解决方法: 在想要调试的方法中加入debugger...代码运行到 debugger所在位置,按F10一步一步运行代码,右侧本地,可以查看对应的参数,想要结束调试按F8直接运行结束。 这样比console.log方便、直观、全面。 < -
Visual Studio 调试器的功能教程
2018-03-21 14:01:04将官网的技术文档摘了下来链接 https://docs.microsoft.com/zh-cn/visualstudio/debugger/debugger-feature-tourVisual Studio 调试器的功能教程2017/05/19作者 本主题介绍 Visual Studio 调试器的功能。... -
【VSCode】调试器debugger详细使用手册
2022-04-01 14:09:01VS Code 的内置调试器有助于加速您的编辑、编译和调试循环。 调试器扩展 VS Code 具有对Node.js运行时的内置调试支持,并且可以调试 JavaScript、TypeScript 或任何其他转换为 JavaScript 的语言。 开始调试 以下... -
Python 代码调试技巧
2019-09-13 15:46:23pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点、单步调试、进入函数调试、查看当前代码、查看栈片段、动态改变变量的值等。pdb 提供了一些常用的调试命令,详情... -
python IDLE 的调试器
2018-08-23 17:44:38调试器将运行一行代码,然后等待你告诉它继续。像这样让程序运行“在调试器之下”,你可以随便花多少时间,检查程序运行时任意一个时刻的变量的值。对于追踪缺陷,这是一个很有价值的工具。要启用 IDLE 的调试器,就... -
蓝牙调试器app HC05、HC06(功能非常强大)
2021-10-01 17:45:54可以在百度搜索蓝牙调试器可下载。 里面分基础模式和专业模式, 基础模式 基础模式非常的简单,设置相应的按键的值就可以显现发送数据,例如用按键控制灯的亮灭。具体设置1、点击编辑模式就可以编辑相应的按... -
微信开发者工具-调试器
2019-07-23 19:56:48微信开发者工具-调试器 调试器常用的 6 大功能模块有:Console、Sources、Network、Appdata、Storage、Wxml Console Console有两大功能: 1)开发者可以在此输入和调试代码 2)小程序的错误输出,会显示... -
Android Studio代码调试大全
2016-06-02 02:21:20Android Studio目前已经成为开发Android的...正所谓,工欲善其事必先利其器,和其他开发工具一样,如Eclipse、Idea,Android Studio也为我们提供了强大的调试技巧,今天我们就来看看Android Studio中有关调试的技巧。 -
解决 “调试器已暂停。鼠标选择器等部分功能将同时被停用”
2018-11-16 22:27:40前段阵子使用 F12 查看器 的时候一直出现这个提示,导致鼠标选择一直使用不了。前几天无意中在 调试器 中发现了 断点 选项,然后把它子项全部不选就可以了。 ... -
如何调试Linux下vim编辑器写的代码?含实用快捷指令make和Makefile
2021-11-13 15:17:24Linux的gdb调试 Linux中,程序默认生成的可执行程序是:release版本。 默认动态链接,使用动态库。 gdb 文件名 -g 如上可以改为debug版本,进行调试。 release和debug版本的区别 1、debug可以调试,release不可调试... -
Node之使用调试器
2019-12-24 17:39:45启动调试器 node debug<需要被执行的脚本文件名> 继续执行剩余代码 cont或者c 执行下一步 next或者n 进入函数内部 step或者s 执行函数内部剩余所有代码 在函数内部代码被逐句执行的时候,可以使用“out”... -
代码调试系列之前端代码调试的几种基本方法
2019-02-03 21:59:40github文章地址:... ... 针对前端代码的调试,我们更多的是对javascript代码的调试,我们常用的可能就是向alert、console等方式,同样的对于DOM元素变化的js脚本也可以进行监听调试,然后就是简单的HTML元... -
QtCreator 调试器配置
2017-05-12 15:51:23QtCreator 默认是没有调试器的,因此需要用户额外安装。 win10请下载安装: win8、win7请下载,使用与32位和64位:http://download.csdn.net/detail/qq_35488967/9840722配置教程 安装时,会有很多工具让你选择,...