《软件调试实战》摘要chap3-5

缘起

  • 20181210开始看,最近要开始处理相关需求和bug单了,用这本书当蓝本建立知识脉络,以项目为场景遇到问题google,然后再丰富这个脉络,争取一天一章吧。

内容

  • 目录 9/203

chap1

chap2

chap3 查找根源--源代码调试器 29/203

  • 3.1、可视化程序行为

    • gdb,VisualStudio,后者经常用,但前者听得多,用得极少。
    • dbx(Sun Solaris的命令行调试器),TotalView(用于Linux和MacOS的基于GUI的调试器),ARM RealView Development Suite和Lauterbach TRACE32 除了dbx,其它的都没听说过
  • 3.2、准备简单的可预测的示例

    • [factorial.c]()

      • 没有边界值保护,健壮性没有考虑全
  • 3.3、使调试器与程序一起运行

    • -g是进行调试的编译器标志gcc -g -o factorial factorial.c
    • gdb factorial,然后输入run 命令行参数,本例是run 1
    • run -1时报内存错误
  • 3.4、学习在程序崩溃时执行栈跟踪

    • C/C++程序的是一个内存片段,用来存储每个活动的函数调用的栈帧(stack frame)。栈帧由返回地址、函数的参数和局部变量组成。
    • 栈跟踪(stack trace)
    • gdb的栈跟踪命令是btbacktrace,或where

      • 可以使用updown在栈中移动
  • 3.5、学习使用断点
  • 3.6、学习在程序中导航

    • 命令

      • run
      • start不必搜索包含main()函数的文件,直到main()的第一行
      • pause
      • continue
    • 3种不同的步进模式

      • step-into step 进入函数调用的函数体
      • step-over next
      • step-out finish
  • 3.7、学习检查数据:变量和表达式

    • print n
  • 3.8、一个简单示例的调试会话

    • gdb factorial
    • start 13
    • next
    • next
    • print n
    • step
    • break 8
  • 一点输出

    • 算是复习一下gdb的用法吧,感觉还没有看帖子来得直观,自己也实践了一下,明天继续在项目中应用,然后有问题再百度。掌握命令
    • visual Studio虽然项目有用到,但好像也不太能有体系的输出,后期再查漏补缺吧。
    • 学习+实践,用时38min,20181210晚上看的。

chap4 修复内存问题 39/203

  • 4.1、C/C++中的内存管理--功能强大但很危险

    • 常见的内存访问bug

      • 内存泄漏(memory leak) 运行时分配,但没有释放,会使可用主内存被耗尽。
      • 内存管理的错误使用(incorrect use of memory management) 多次释放一个内存块
      • 缓冲区溢出(buffer overrun) 已分配的内存外部的内存被改写或破坏
      • 读取未初始化的内存(reading uninitiulized memory)
  • 4.2、有效的内存调试器

    • gdb无法有效找出内存相关的错误。
    • Purify,还有 Insure++,Valgrind和BoundsChecker
    • **对数组要使用delete[]
  • 4.3、示例1:检测内存访问错误

    • [main1.c]
    • gcc -g main1.c
    • valgrind --tool=memcheck --leak-check=yes ./a.out
  • 4.4、示例2:对内存分配/释放的不完整调用

    • [main2.c]
    • 调试命令如上
  • 4.5、结合使用内存调试器和源代码测试器

    • 在使用Valgrind时,可以使用--db-attach=yes选项来连接源代码调试器。
    • 默认调试器GDB,可以使用--db-command=指定另一个调试器。
    • Purify在报告错误之后立即调用purify_stop_here()函数。
    • Insure++里调用_Insure_trap_error()函数。
  • 4.6、减少干扰,排查错误
  • 4.7、何时使用内存调试器

    • 将软件移植到新操作系统上时
    • 程序崩溃时
    • 调试奇怪的bug时
    • 为回归测试的一部分
  • 4.8、约束

    • 测试用例应该有很好的代码覆盖率
    • 提供更多计算机资源

      • 动态内存的使用显著增加,一般会增加2~4倍。
      • 增加程序的运行时间,通常是一个数量级。
    • 可能不支持多线程
    • 对非标准内存处理程序的支持
  • 一点收获

    • valrind开始使用和实践
    • 明确一下常见内存错误名词的具体原因,比如啥样的代表“memory leak”
    • 使用内存分析器虽然能检查问题,但也是有代价的,消耗内存和时间。
    • 本部分学习用时24min。

chap5 剖析内存的使用 49/203

  • 5.1、基本策略--主要步骤
  • 5.2、示例:分配数组

    • [testmalloc.c]
  • 5.3、第1步:查找泄漏
  • 5.4、第2步:设置期望值
  • 5.5、第3步:测量内存使用

    • 5.5.1 使用多个输入
    • 5.5.2 在固定时间间隔停止程序

      • 在UNIX中setenvexport
    • 5.5.3 用简单工具测量内存使用
    • 5.5.4 使用top
    • 5.5.5 使用WindowsTaskManager
    • 5.5.6 为testmalloc选择相关输入值
    • 5.5.7 确定机器上的内存是如何被释放的
    • 5.5.8 使用内存剖析工具

      • Windows中使用AQtimeMpatrol
      • Linux中使用MassifMpatrol
      • valgrind --tool=massif ./testmalloc n 100000 8使用massif
  • 5.6、第4步:查明大部分内存被哪些数据占用了
  • 5.7、综合练习--genindex示例

    • 5.7.1 核实没有大的内存泄漏
    • 5.7.2 估计内存使用
    • 5.7.3 测量内存使用
    • 5.7.4 查找使用内存的数据结构
  • 一点收获

    • 确认了一下解决问题的思路或流程。
    • 了解到了massif的工具,但并没有用呢。
    • 还是需要在项目中应用,最先开始看书只能建立知识体系而已,还不足以解决项目中的问题
    • 本部分学习用时13min。
    • 比如测量内存的使用,除了top命令外,我知道的招就没有了。

履历

学习记录

  • 20181210看了chap3
  • 20181211看了chap4、5

你可能感兴趣的:(调试)