如何对程序进行调试(多年工作经验的软件工程师教你如何有效地调试程序)
如何对程序进行调试(多年工作经验的软件工程师教你如何有效地调试程序)打印 log 几乎是所有程序员都经常用的 debug 方法。Linux 下没有好用的 ID E 怎么办? gdb 有的时候也不容易观察像大的结构体这种变量值,那就打印 log 吧。所以掌握 debug 方法是程序员除编程语言外的基本技能。Debug 的过程实际就是定位 bug、解决 bug 的过程,但是实际中遇到的 bug 各种各样,五花八门,例如有编译错误,软件本身运行时异常,软件输出错误,还有涉及到其他模块,比如硬件的错误,另外可能还会有随机错误,软件本身也不同,所以 debug 根本没有固定而通用,一招走遍天下的方法。想要排除错误,找到 bug, 只能根据平时积攒的一些经验,从顶至下,慢慢一点点的摸索和排除。
程序调试,俗称 debug。
为什么要进行程序调试呢?
这个想必大家都知道。软件开发过程中,总是经常出现不如意的结果,这个时候就要 debug。 并且 debug 在软件生命周期中,会占用大量的时间,拥有非常大的时间跨度。
一个程序员基本 80% 的时间都在 debug。 从开始写代码到测试,再到后期软件维护, bug 无处不在, 自然程序员随时都要 debug。
所以掌握 debug 方法是程序员除编程语言外的基本技能。
Debug 的过程实际就是定位 bug、解决 bug 的过程,但是实际中遇到的 bug 各种各样,五花八门,例如有编译错误,软件本身运行时异常,软件输出错误,还有涉及到其他模块,比如硬件的错误,另外可能还会有随机错误,软件本身也不同,所以 debug 根本没有固定而通用,一招走遍天下的方法。
想要排除错误,找到 bug, 只能根据平时积攒的一些经验,从顶至下,慢慢一点点的摸索和排除。
2. 打印 logLinux 下没有好用的 ID E 怎么办? gdb 有的时候也不容易观察像大的结构体这种变量值,那就打印 log 吧。
打印 log 几乎是所有程序员都经常用的 debug 方法。
把有 N 多变量的结构体值打印到文件里,会比用 gdb 方便许多。
另外,通过 log 可以很容易看到函数的执行顺序。
3. 打印中间结果打印内容不仅限于结构体变量,还有各种中间结果,临时数据,例如视频编码过程中的 MV, DCT 结果,熵编码结果,重建数据等等。
4. 将错误结果和标准 (golden) 结果进行比对假如有正确的输出结果可供参考,可以拿来对比。 通过用 Beyond Compare 比较 十六进制码,很容易定位到错误在哪里,错了哪些字节。
虽然这不能立刻让你发现代码中的错误,但是通过输出结果中的错误,会让你对 bug 本身有大体的了解,这样可以缩小排查范围。
最后还是想说一句,实际情况往往会很复杂 bug 也是各种各样,最终还是要随机应变,结合实际情况进行 debug。
Debug 过程很痛苦,有时一个 bug 往往需要耗费一周甚至更长的时间,但是 Fix 了一个 bug 的那种快感也是不言而喻的。