当前位置: 首页 > news >正文

C语言 实用调试技巧

我们的博客已经更新到了数据结构,但是当我在深耕数据结构时我发现我在C语言是遗漏了一个重要的东西,那就是C语言的使用调试技巧。这篇博客对数据结构非常重要,请大家耐心观看。

1. 什么是bug? 

第一次被发现的导致计算机错误的飞蛾,也是第一个计算机程序错误。

注:参考资料 https://zh.wikipedia.org/wiki/%E7%A8%8B%E5%BA%8F%E9%94%99%E8%AF%AF

 2. 调试是什么?有多重要?

所有发生的事情都一定有迹可循,如果问心无愧,就不需要掩盖也就没有迹象了,如果问心有愧,
就必然需要掩盖,那就一定会有迹象,迹象越多就越容易顺藤而上,这就是推理的途径。
顺着这条途径顺流而下就是犯罪,逆流而上,就是真相。

一名优秀的程序员是一名出色的侦探。

每一次调试都是尝试破案的过程

我们是如何写代码的?

又是如何排查出现的问题的呢? 

拒绝-迷信式调试!!!!

2.1 调试是什么?

调试(英语:Debugging / Debug),又称除错,是发现和减少计算机程序或电子仪器设备中程序
错误的一个过程。

2.2 调试的基本步骤

发现程序错误的存在
以隔离、消除等方式对错误进行定位
确定错误产生的原因
提出纠正错误的解决办法
对程序错误予以改正,重新测试

2.3 Debug和Release的介绍。

Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。
Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优
的,以便用户很好地使用。

从上述我们不难观察出debug和release它们的大小差异很大(debug 61KB    release 11KB)

那这是为什么呢?

这是因为debug包含了调试等其他的一系列的过程所以大小会更大。

3. Windows环境调试介绍

注:linux开发环境调试工具是gdb,后期博客会介绍。

3.1 调试环境的准备

在windows环境中选择 debug 选项,才能使代码正常调试 。

3.2 学会快捷键

最常使用的几个快捷键:

F5
启动调试,经常用来直接跳到下一个断点处。
F9
创建断点和取消断点
断点的重要作用,可以在程序的任意位置设置断点。
这样就可以使得程序在想要的位置随意停止执行,继而一步步执行下去。
F10
逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句。
F11
逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部(这是最
长用的)。
CTRL + F5
开始执行不调试,如果你想让程序直接运行起来而不调试就可以直接使用 。

VS中常用的快捷键_vs快捷键-CSDN博客

3.3 调试的时候查看程序当前信息

3.3.1 查看临时变量的值

在调试开始之后,用于观察变量的值。

3.3.2 查看内存信息 

3.3.3 查看调用堆栈 

通过调用堆栈,可以清晰的反应函数的调用关系以及当前调用所处的位置。

3.3.4 查看汇编信息 

在调试开始之后,有两种方式转到汇编:
(1)第一种方式:右击鼠标,选择【转到反汇编】:

(2)第二种方式:

可以切换到汇编代码。 

3.3.5 查看寄存器信息

可以查看当前运行环境的寄存器的使用信息。

一定要熟练掌握调试技巧。
初学者可能80%的时间在写代码,20%的时间在调试。但是一个程序员可能20%的时间在写
程序,但是80%的时间在调试。
我们所讲的都是一些简单的调试。
以后可能会出现很复杂调试场景:多线程程序的调试等。
多多使用快捷键,提升效率。

本期的内容就到这里了,目的是为了帮助大家更好的学习数据结构相关知识。

感谢你的观看

后续会持续为大家更新数据结构知识。

http://www.lryc.cn/news/320989.html

相关文章:

  • GPT的实现细节
  • docker安装Milvus
  • HTML静态网页成品作业(HTML+CSS)——世博园介绍(2个页面)
  • 微信小程序订阅消息授权弹窗事件
  • 谷歌的后量子密码学威胁模型
  • 机器人在果园内行巡检仿真
  • 蓝桥杯算法基础(14):十大排序算法(归并排序)c语言版
  • 力扣刷题(DAY09-DAY11)
  • IPC之管道
  • VUE-组件间通信(二)$emit
  • java 程序连接 redis 集群 的时候报错 MUTLI is currently not supported in cluster mode
  • AVP-SLAM:自动泊车系统中的语义SLAM_
  • PHP反序列化--pop链
  • 单片机中的几种周期(振动/时钟,状态,机械,指令周期)表示的含义(51为例)
  • Spring Boot+Vue前后端分离项目如何部署到服务器
  • 【学习总结】Ubuntu中vscode用ROS插件调试C++程序
  • html--蝴蝶
  • 线程的 sleep()方法和 yield()方法有什么区别?为什么 Thread 类的 sleep()和 yield ()方法是静态的?
  • Java进阶 Maven基础
  • Spring Boot(六十八):SpringBoot 整合Apache tika 实现文档内容解析
  • jQuery+CSS3自动轮播焦点图特效源码
  • 面试经典150题(114-118)
  • HTML表单标签详解:如何用HTML标签打造互动网页?
  • Web 服务器-Tomcat
  • (德迅零域)微隔离安全平台是什么,有什么作用?
  • 这些问题,每年软考报名时都有人问
  • JavaScript爬虫进阶攻略:从网页采集到数据可视化
  • MATLAB教程
  • 爱恩斯坦棋小游戏使用C语言+ege/easyx实现
  • png格式怎么转成gif?一个小窍门快速转换