YouTube

Got a YouTube account?

New: enable viewer-created translations and captions on your YouTube channel!

Chinese, Simplified subtitles

← 05-20 Capturing

Get Embed Code
3 Languages

Showing Revision 1 created 05/24/2014 by 秀隆 杨.

  1. 实践中程序如果出错了,不是在实验室里的话,

  2. 重现将变得困难,因为你缺少数据来进行有效的调试。
  3. 重现将变得困难,因为你缺少数据来进行有效的调试。
  4. 但是是,实践中程序如果出错了,又可以让调试简单一点。
  5. 主要就是因为你可以利用之前进行过的很多次运行来找问题(应该不算开发中的错误)。
  6. 假设你执行过了很多次(数据不同),理想的是,小部分出错,多数OK.
  7. 假设你执行过了很多次(数据不同),理想的是,小部分出错,多数OK.
  8. 那就可以根据统计学去寻找与出错有关的执行特征。
  9. 那就可以根据统计学去寻找与出错有关的执行特征。
  10. 其中一个这样的特征就可能是程序片段代码的执行情况。
  11. 比如,如果你知道了在所有未出错的执行中,有一个特定函数从未被调用,
  12. 比如,如果你知道了在所有未出错的执行中,有一个特定函数从未被调用,
  13. 而每次出错的执行都会调用到它,
  14. 那么这个信息大概就够用了,你首先就会去检查这个函数,
  15. 那么这个信息大概就够用了,你首先就会去检查这个函数,
  16. 看看它的代码是否哪里有错。
  17. 不说这个,同样可以用其他的特征。
  18. 比如,某一行代码,或某一个返回值。
  19. 或某个变量,变量值,都可能。
  20. 这些特征都可能影响到代码执行,能为调试提供重要线索。
  21. 这些特征都可能影响到代码执行,能为调试提供重要线索。
  22. 所以,为了利用上这些信息,我们就要进行收集工作。
  23. 从代码行的执行开始,因为这个比较简单,直观。
  24. 从代码行的执行开始,因为这个比较简单,直观。
  25. 方法就是,使用 追踪 函数,记录下文件中每行被执行的代码(未执行不记录)。
  26. 方法就是,使用 追踪 函数,记录下文件中每行被执行的代码(未执行不记录)。
  27. 方法就是,使用 追踪 函数,记录下文件中每行被执行的代码(未执行不记录)。
  28. 先设一个全局变量coverage ,如果我们执行了某行代码,
  29. 就把文件名和代码的行号取出来,
  30. 接下来,文件名和行号有了,看看以前是否有记录过这个文件名,
  31. 接下来,文件名和行号有了,看看以前是否有记录过这个文件名,
  32. 没有的话,就建个新的空集
  33. 接着,我们将行号添加到这个文件名对应的集合里。
  34. 这里,我们使用set_trace, 调用这个函数,处理一段简单的带HTML标签的文本。
  35. 这里,我们使用set_trace, 调用这个函数,处理一段简单的带HTML标签的文本。
  36. 看看有哪些行覆盖到了。点运行,集合显示出来。有这几行覆盖到了。
  37. 看看有哪些行覆盖到了。点运行,集合显示出来。有这几行覆盖到了。
  38. 看看有哪些行覆盖到了。点运行,集合显示出来。有这几行覆盖到了。
  39. 看看有哪些行覆盖到了。点运行,集合显示出来。有这几行覆盖到了。
  40. 来,我们给它们做个记录,表示这几行覆盖到了。这几行。
  41. 来,我们给它们做个记录,表示这几行覆盖到了。这几行。
  42. 没有覆盖到的则是这几行。
  43. 正好是给tag 或 quote 变量赋值的那几行。
  44. 正好是给tag 或 quote 变量赋值的那几行。
  45. 既然对于不带HTML标签的文本,测试可以通过,
  46. 我们现在就来推导一下,提出一些测试数据,来覆盖尚未测试到的代码行。
  47. 我们现在就来推导一下,提出一些测试数据,来覆盖尚未测试到的代码行。
  48. 看看这些是否失败,就能找到错误和代码行的执行是否有关了。
  49. 看看这些是否失败,就能找到错误和代码行的执行是否有关了。
  50. 在此之前,我们要先准备一个自动机制来制作标签,标记某行是否执行。
  51. 在此之前,我们要先准备一个自动机制来制作标签,标记某行是否执行。
  52. 我想就是把程序再次输出,给每一行执行过的代码加上一个星形前缀,没执行过的就空格前缀。
  53. 我想就是把程序再次输出,给每一行执行过的代码加上一个星形前缀,没执行过的就空格前缀。
  54. 我想就是把程序再次输出,给每一行执行过的代码加上一个星形前缀,没执行过的就空格前缀。
  55. 我们现在来把这个集合转成是否带星号的代码集合。
  56. 这是一个开始,因为我们知道对应的文件名,所以我们打开文件,逐行读取。
  57. 这是一个开始,因为我们知道对应的文件名,所以我们打开文件,逐行读取。
  58. 这是一个开始,因为我们知道对应的文件名,所以我们打开文件,逐行读取。
  59. 我们来看看是否有用,太好了,我们获得了程序代码行号的一个列表。
  60. 我们来看看是否有用,太好了,我们获得了程序代码行号的一个列表。