以下没有官方术语,均可望文生义。现在有各种五花八门的调试软件,不针对软件总结,针对不同的方法总结。但本人的码龄有限,欢迎补充其他方法。
1.打断点
目前设计思想无非,面向对象,面向过程, 范型编程、面向规则、函数式编程、并发编程等等
但这些不需要考虑,因为硬件咋执行的时候只认识高低电平,稍微退一步就是机器码0101010100101010.。。。。
你会发现程序的执行都是把对应的文件放到cpu,当然还有apu,bpu,dpu,epu,fpu。。。。。等等,就是放到处理器中执行
打断点的意思就是在程序的某个位置设置一个暂停位置。而且你所运行的相关程序到了这个位置必定停下来,当然也有可能打不到断点,因为程序压根不会跑到你所运行的地方,还有就是,你想实现的功能不仅仅只有你打了断点位置的代码。或者在某些情况下,你在一处打了断点,程序运行到这里了,然后就会跑走,不过这个造成的原因很令人费解,因为后面发现是因为编译的时候是release和debug的区别造成的,不过我觉得也有可能是多线程引起的,这里知识点涉及有点多,未来学了明白了再说。不同的代码不同的编译器都造成的错误五花八门。。。
打了断点也会被编译器编进去执行的。
重点推荐打断点的方法,跟着运行程序打断点,单步调试,源码断点等等
2.数据追踪
顾名思义,追这你想要了解数据,看这个数据发生了什么变化。
3.log
打印。在你想要的地方写上你程序中的打印函数。这个需要花力气学的(大佬忽略这句话T.T),特别是底层工程师,因为在不同的硬件中打印还tm五花八门。自行百度,这个有点奇妙。
可以将打印信息输出到制定控制台或者文件中方便查看,大部分程序都喜欢把打印信息输入到一个点log文件中,当然其他的也可以,只要你能看得懂就可以,更有胜者,直接把log信息当成代码执行的配置文件,有时候用户使用过的信息就会这么存储起来。
4.反汇编
看到这里是不是害怕了,汇编,其实不用怕,常用的汇编指令就百十来条,大概意思可以看得懂就可以了,另外需要理解一下寄存器的原理。这里就噼里啪啦一大堆了,那些不涉及底层硬件的工程师就忽略这个方法吧。这是非常好的方法,因为所有的汇编指令的执行相当硬气,一般情况下一条汇编指令的执行是不会被打断的(有待深究),那就新开随笔写一篇反汇编。
5.内存追踪
在写代码的时候难免没有控制好内存,或者在阅读老代码的时候根本摸不着头脑,这个时候就可以追踪内存了,具体方法就是看内存,嗯。不会看的就忽略这个方法吧哈哈哈,在这里提一下,并不提倡,因为内存容量相关的问题的话,就是钱的问题,钱的问题的话就是老板的问题了,或者说是客户的问题了,程序可以更贵,加内存,老板不亦乐乎。。如果不是内存容量的问题,那就是内存泄漏和内存溢出的问题。关于内存,这个问题根本讨论不完(写了一堆又删掉,这个额话题讨论起来有点猛,新开随笔再写),不过好像搞这些玩意的大师们头发想完了都想不出来,我就不凑这个热闹了。。
内存溢出
指你申请了10个字节的空间,但是你在这个空间写入11或以上字节的数据,就是溢出
内存泄漏
指你用malloc或new申请了一块内存,但是没有通过free或delete将内存释放,导致这块内存一直处于占用状态。
6.bug复现
重要的事说三遍,复现复现复现!!!这个很重要,不管是什么bug还是其他,你都需要复现出来,需要知道复现的概率、现象、原因、环境等等,你都需要完整控制。这里涉及到程序运行的环境,代码逻辑,软件架构等等,还有一些令人发指的是来自语言和编译器,不过我实在学习过程中遇到过,在工作中好像大牛们都已经规避好了,这里不需要小白担心了。