文章目录
保持空杯心态,为自己打气!
bug是计算机领域专业术语,bug原意是“臭虫”,现在用来指代计算机上存在的漏洞,原因是系统安全策略上存在的缺陷,有攻击者能够在未授权的情况下访问的危害。
漏洞是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,从而可以使攻击者能够在未授权的情况下访问或破坏系统。
调试简单来说就是调试是保证所提供的设备能够正常运行的必须程序。
通过一些工具对代码进行检测,修复bug。
1.确认程序是错误的
2.用各种方法对错误进行定位
3.用工具确认错误原因
4.对错误提出解决方案
5.对程序进行更改,重新测试
Debug通常是调试版本,它包含调试信息,并且不做任何优化,便于程序员调试(这个版本是专门给程序员使用的)
release称为发布版本,它往往对代码运行速度和代码大小进行了优化,以便于用户使用。
Debug版本和release版本比较:

显然,release版本的空间大小要比debug空间大小要小。
还有一点就是:release版本是没有调试的,debug版本具有调试信息,因为release版本是给用户使用的,而用户又不懂编程调试,所以就没有调试信息。
了解到debug版本是可以调试的,所以在使用visual studio 2022版本时首先环境是配置是debug版本:

Ctrl+Shift+B:生成解决方案
Ctrl+F7:编译
Alt+F11:对解决方案进行运行代码分析
Ctrl+Shift+F9:删除所有断点
Ctrl+Alt+E:异常
Ctrl+Alt+Q:快速监视(或者Shift+F9)
Ctrl+Shift+F5:重启(在调试起来后使用)
Ctrl+F10:运行到光标处
F5:启动调试,经常和断点搭配使用。先是F9找到想要检测的位置,然后F5进行调试,可以直接从断点处检测。
Ctrl+F5:不调试直接运行处结果。
F11:逐语句,更加细节的观察,可以直接跳进函数内部检测。
Shift+F11:单步跳出(跳出调试)
F10:逐过程,可以处理一个过程(函数、语句)
F9:创建断点和取消断点
断点的作用就是可以让程序跳到想要的位置随意执行,继而一步步执行下去。
Alt+6:启动内存1(需要先F10调试起来后才能使用,启动内存2:Ctrl+Alt+2;启动内存3:Ctrl+Alt+3)
Ctrl+Alt+V+A 自动窗口(调试后才能使用)
Ctrl+Alt+C:调用堆栈(调试后才能使用,或者用Alt+7)
Alt+8:转到反汇编
Ctrl+Alt+W+1:启动监视窗口1(启动监视窗口2:Ctrl+Alt+W+2;启动监视窗口3;Ctrl+Alt+W+3;启动监视窗口4:Ctrl+Alt+W+4)
Alt+4:局部变量窗口
Alt+5:寄存器
Shift+F5:停止调试
Alt+向右键:完成单词(Ctrl+空格键)
Ctrl+F:查找
Ctrl+Shift+F:在文件中查找
Ctrl+G:转到
Ctrl+F12:转到声明
F12:转到定义(前提是必须要有声明)
Ctrl+,:导航到
Alt+F12:查看定义
Ctrl+H:替换
Ctrl+Z:撤销
Ctrl+K+C:注释所选内容
Ctrl+K+U:取消所选注释内容
Alt+F4:退出文件
Ctrl+N:新建文件
Ctrl+Shift+N:新建项目
Ctrl+O:打开文件
Ctrl+Shift+O:打开项目
F2:重命名(鼠标必须指在文件名上才能重命名操作)
Ctrl+Shift+S:全部保存
Shift+Alt+A:添加现有项
Ctrl+Shift+A:添加新项
以上快捷是根据我的默认的visual studio 2022选出的常用实用快捷键,如果在你们的编译器上不同话可根据编译器上提供的快捷消息来采取,也可以看看这个链接:visual studio 2022键盘快捷方式





求 1!+2!+3! …+ n! ;不考虑溢出.
int main()
{
int i = 0;
int sum = 0;//保存最终结果
int n = 0;
int ret = 1;//保存n的阶乘
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
int j = 0;
for (j = 1; j <= i; j++)
{
ret *= j;
}
sum += ret;
}
printf("%d\n", sum);
return 0;
}
这段代码输出;

为什么1!+2!+3!的阶乘是15呢?不应该是9吗?,下面F10调试起来看一看:

最终解决后的代码:
int main()
{
int i = 0;
int sum = 0;//保存最终结果
int n = 0;
int ret = 1;//保存n的阶乘
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
int j = 0;
ret = 1;
for (j = 1; j <= i; j++)
{
ret *= j;
}
sum += ret;
}
printf("%d\n", sum);
return 0;
}
问这段代码在debug版本下x86平台下,为什么是死循环?
#include <stdio.h>
int main()
{
int i = 0;
int arr[10] = { 0 };
for (i = 0; i <= 12; i++)
{
arr[i] = 0;
printf("hehe\n");
}
return 0;
}
下面我们来通过调试来解释这个为什么?

真有这么巧吗?
其实并不是在VC6.0中arr[9]和i变量中间其实没有多余空间,在gcc编译器下arr[9]和i变量中间有一个整型的空间,visual studio 2022\2019\2013中的x86平台下arr[9]和i变量之间是由两个整型的空间。这些都不是巧合,而是编辑器本身规定的,不同的编译器有不同的规定。
1.代码运行正常
2.bug很少
3.效率高
4.可维护性高
5.可读性高
6.注释清晰
7.文档齐全
模拟实现库函数:strcpy
首先是创建两个数组,一个数组是目标数组一个数组是源头数组,strcpy库函数就是把源头数组拷贝到目标数组上,那么我们可以用指针创建指针,分别指向两个数组起始位置,然后用指针偏移把源头数组的元素放在目标数组中,最后’\0’也放在目标数组中,从而达到实现库函数strcpy(根基思路)
void my_strcpy(char* dest, char* src)
{
while (*src != '\0')
{
*dest++ = *src++;
}
*dest = *src;
}
int main()
{
char arr1[20] = "xxxxxxxxxx";
//xxxxxxxxxx
char arr2[] = "hello";
my_strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
void my_strcpy(char* dest, char* src)
{
//停止条件就是'\0','\0'对应的ASCII码值是0
while (*dest++ = *src++)
{
;
}
}
int main()
{
char arr1[20] = "xxxxxxxxxx";
//xxxxxxxxxx
char arr2[] = "hello";
my_strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
对assert函数介绍:

简单来说,assert库函数就是为了保证指针的有效性。
void my_strcpy(char* dest, char* src)
{
assert(dest != NULL);//断言
assert(src != NULL);//断言
//NULL是#define NULL ((void *)0)
while (*dest++ = *src++)
{
;
}
}
int main()
{
char arr1[20] = "xxxxxxxxxx";
char arr2[] = "hello";
my_strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
void my_strcpy(char* dest, char* src)
{
assert(dest&&src);
//NULL是#define NULL ((void *)0)
while (*dest++ = *src++)
{
;
}
}
int main()
{
char arr1[20] = "xxxxxxxxxx";
char arr2[] = "hello";
my_strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
//strcpy有返回类型,源头数组不可变这些要求
char* my_strcpy(char* dest, const char* src)
{
char* ret = dest;
assert(dest && src);//断言
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[20] = "xxxxxxxxxx";
char arr2[] = "hello";
printf("%s\n", my_strcpy(arr1, arr2));
return 0;
}
这就是调试后慢慢对细节的慢慢优化的过程。过程比结果重要,所以重在把握过程细节。
首先我们要知道const的作用:
告知程序员这里不能修改,具有“自描述”意思
告知编辑器这里不能修改,如果修复就会报错

这里的const修饰的是变量,所以这个变量是不能被修改的。但是可以用指针间接修改,如:

为什么呢?
可以这样理解,因为const只是修饰了变量a,所以不能直接用a来修改,但是可以找到a的地址进行修改,不是直接修改a,而是间接修改,下面看const关键字修是指针的时候思路会更加清晰。

这里的const修饰变量有常属性,但是这个常属性的意思是不能被修改的意思,而非真正的把变量变成常量,这是不可能的。
再来聊聊指针,int * p,这里的p是指针变量用来存放地址,*是指针的标志,int是指针的类型(决定了指针访问时访问多少字节以及指针的步长问题)

这里int const *p和上述const int p是一样的,const都是修饰的p。


const int* test()
{
static int a = 10;
return &a;
}
int main()
{
int* p = test();
return 0;
}
这里的const修饰函数返回值的意义就是提示程序员后期维护中,不要对其返回值进行更改。
int my_strlen(const char* str)
{
//计数器
int count = 0;
//保证指针有效性
assert(str != NULL);
//判断条件再*str='\0'时停止
while (*str)
{
count++;
str++;
}
return count;
}
int main()
{
const char* p = "abcdef";
int len = my_strlen(p);
printf("len = %d\n", len);
return 0;
}
编译型错误:直接看错提示信息
链接型错误:一般是标识符名不存在或者拼写错误
运行时错误;不容易发现的bug,一般调试才能解决
我们要做一个善于发现问题,解决问题的人,让脑袋高速飞转解决问题,这样才能成为一个厉害的人,还是要保持空杯心态,重复输入,高效输出。加油!
GivenIamadumbprogrammerandIamusingrspecandIamusingsporkandIwanttodebug...mmm...let'ssaaay,aspecforPhone.那么,我应该把“require'ruby-debug'”行放在哪里,以便在phone_spec.rb的特定点停止处理?(我所要求的只是一个大而粗的箭头,即使是一个有挑战性的程序员也能看到:-3)我已经尝试了很多位置,除非我没有正确测试它们,否则会发生一些奇怪的事情:在spec_helper.rb中的以下位置:require'rubygems'require'spork'
使用Ruby1.9.2运行IDE提示说需要gemruby-debug-base19x并提供安装它。但是,在尝试安装它时会显示消息Failedtoinstallgems.Followinggemswerenotinstalled:C:/ProgramFiles(x86)/JetBrains/RubyMine3.2.4/rb/gems/ruby-debug-base19x-0.11.30.pre2.gem:Errorinstallingruby-debug-base19x-0.11.30.pre2.gem:The'linecache19'nativegemrequiresinstall
我有:When/^(?:|I)follow"([^"]*)"(?:within"([^"]*)")?$/do|link,selector|with_scope(selector)doclick_link(link)endend我打电话的地方:Background:GivenIamanexistingadminuserWhenIfollow"CLIENTS"我的HTML是这样的:CLIENTS我一直收到这个错误:.F-.F--U-----U(::)failedsteps(::)nolinkwithtitle,idortext'CLIENTS'found(Capybara::Element
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、
Ruby是否有逐步调试器,类似于Perl的“perl-d”? 最佳答案 ruby-debug(对于ruby1.8),debugger(对于ruby1.9),byebug(对于ruby2.0)以及trepanning系列都有一个-x或--trace选项。在调试器内部,命令setlinetrace将打开或关闭线路跟踪。这是themanualforruby-debug原来的答案已经修改,因为数据噪声文章的链接,唉,不再有效了。还添加了ruby-debug的后继者 关于ruby-Ruby
3月26日,映宇宙(HK:03700,即“映客”)发布截至2022年12月31日的2022年度业绩财务报告。财报显示,映宇宙2022年的总营收为63.19亿元,较2021年同期的91.76亿元下降31.1%。2022年,映宇宙的经营亏损为4698.7万元,2021年同期则为净利润4.57亿元;期内亏损(净亏损)为1.68亿元,2021年同期的净利润为4.33亿元;非国际财务报告准则经调整净利润为3.88亿元,2021年同期为4.82亿元,同比下降19.6%。 映宇宙在财报中表示,收入减少主要是由于行业竞争加剧,该集团对旗下产品采取更为谨慎的运营策略以应对市场变化。不过,映宇宙的毛利率则有所提升
写在之前Shader变体、Shader属性定义技巧、自定义材质面板,这三个知识点任何一个单拿出来都是一套知识体系,不能一概而论,本文章目的在于将学习和实际工作中遇见的问题进行总结,类似于网络笔记之用,方便后续回顾查看,如有以偏概全、不祥不尽之处,还望海涵。1、Shader变体先看一段代码......Properties{ [KeywordEnum(on,off)]USL_USE_COL("IsUseColorMixTex?",int)=0 [Toggle(IS_RED_ON)]_IsRed("IsRed?",int)=0}......//中间省略,后续会有完整代码 #pragmamulti_c
文章目录一、项目场景二、基本模块原理与调试方法分析——信源部分:三、信号处理部分和显示部分:四、基本的通信链路搭建:四、特殊模块:interpretedMATLABfunction:五、总结和坑点提醒一、项目场景 最近一个任务是使用simulink搭建一个MIMO串扰消除的链路,并用实际收到的数据进行测试,在搭建的过程中也遇到了不少的问题(当然这比vivado里面的debug好不知道多少倍)。准备趁着这个机会,先以一个很基本的通信链路对simulink基础和相关的debug方法进行总结。 在本篇中,主要记录simulink的基本原理和基本的SISO通信传输链路(QPSK方式),计划在下篇记
目录H2数据库入门以及实际开发时的使用1.H2数据库的初识1.1H2数据库介绍1.2为什么要使用嵌入式数据库?1.3嵌入式数据库对比1.3.1性能对比1.4技术选型思考2.H2数据库实战2.1H2数据库下载搭建以及部署2.1.1H2数据库的下载2.1.2数据库启动2.1.2.1windows系统可以在bin目录下执行h2.bat2.1.2.2同理可以通过cmd直接使用命令进行启动:2.1.2.3启动后控制台页面:2.1.3spring整合H2数据库2.1.3.1引入依赖文件2.1.4数据库通过file模式实际保存数据的位置2.2H2数据库操作2.2.1Mysql兼容模式2.2.2Mysql模式