调试

常见的调试有两种办法:

  • print 打印
  • 日志

为了能让我们快速找到想要的内容,

  1. 可以使用显眼的颜色标注
  2. 分清楚bug的等级,这样可以通过筛选缩小范围

调试器可以实现:

  • 当到达某一行时将程序暂停;
  • 一次一条指令地逐步执行程序;
  • 程序崩溃后查看变量的值;
  • 满足特定条件时暂停程序;
  • 其他高级功能。

Debug

下面是使用python的ipdb进行debug,使用pip install ipdb可以下载

  1. def bubble_sort(arr):
  2. n = len(arr)
  3. for i in range(n):
  4. for j in range(n):
  5. if arr[j] > arr[j+1]:
  6. arr[j] = arr[j+1]
  7. arr[j+1] = arr[j]
  8. return arr
  9. print(bubble_sort([4, 2, 1, 8, 7, 6]))

运行之后发现是下标越界的错误,挺常见的。

开始调试:$ python3 -m ipdb /mnt/f/bubble.py

ipdb的相关命令:

  • l(ist) - 显示当前行附近的11行或继续执行之前的显示;
  • s(tep) - 执行当前行,并在第一个可能的地方停止
  • n(ext) - 继续执行直到当前函数的下一条语句或者 return 语句;
  • b(reak) - 设置断点(基于传入对参数);
  • p(rint) - 在当前上下文对表达式求值并打印结果。还有一个命令是pp ,它使用 pprint 打印;
  • r(eturn) - 继续执行直到当前函数返回;
  • q(uit) - 退出调试器。

感觉分步调试很需要我们学习,在项目中可以快速定位发生error的位置。

专门工具

当您的程序需要执行一些只有操作系统内核才能完成的操作时,它需要使用 系统调用。有一些命令可以帮助您追踪您的程序执行的系统调用。比如书中介绍的strace的工具。

有些情况下,我们需要查看网络数据包才能定位问题。像 tcpdumpWireshark 这样的网络数据包分析工具可以帮助您获取网络数据包的内容并基于不同的条件进行过滤。

以及对于 web 开发, Chrome/Firefox 的开发者工具非常方便,功能也很强大:

  • 源码 -查看任意站点的 HTML/CSS/JS 源码;
  • 实时地修改 HTML, CSS, JS 代码 - 修改网站的内容、样式和行为用于测试(从这一点您也能看出来,网页截图是不可靠的);
  • Javascript shell - 在 JS REPL中执行命令;
  • 网络 - 分析请求的时间线;
  • 存储 - 查看 Cookies 和本地应用存储。

程序分析

一个程序的性能分析必不可少,因为可以让你确定,一个程序所耗费的资源大部分在哪,然后可以尝试优化。

课本从以下方面描述了可以分析的点:时间、CPU性能、内存、事件、资源等等
以及介绍了更好用的工具。