debug困难之处

bug的出发经历了漫长的过程:

  • 需求 设计 代码 Fault Error Failure
  • 我们只能观察到Failure
  • 我们可以检查状态的准确性(十分耗时
  • 无法观测failure在哪里

调试就是 diff 脑子执行 实际执行

image.png 如果我们能找到第一条和预期不同的语句,那么这条语句就是bug语句

调试理论

Oracle机:如果我们能判定任意程序的准确性,那么给定一个failure,可以二分查找第一个error状态 image.png

推论:

  • 我们所有的努力都在接近第一个error

  • 单步调试

  • 两种调试工具

    • printf
      • 打一个个的点,将性价比最高的打印出来
      • 灵活可控,但是精度有限
    • gdb
      • 指令级别trace
      • 任意查看
      • 耗费时间

应用

问题诊断

本地环境:连不上github、命令找不到、库没link

我们可以先找到failure,和正常执行的比较,如果程序能多打印一些东西,我们就能更接近错误的位置。

  • strace:可以将程序使用的所有系统调用都打印出来
  • curl系统调用找不到:image.png

添加-v或者--verbose让程序打印更多的信息

ssh -v
curl -v