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

缘起

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

内容

  • 目录 9/203

chap1

chap2

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

  • 3.一、可视化程序行为数组

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

    • [factorial.c]()多线程

      • 没有边界值保护,健壮性没有考虑全
  • 3.三、使调试器与程序一块儿运行函数

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

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

      • 可使用updown在栈中移动
  • 3.五、学习使用断点
  • 3.六、学习在程序中导航测试

    • 命令ui

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

      • step-into step 进入函数调用的函数体
      • step-over next
      • step-out finish
  • 3.七、学习检查数据:变量和表达式操作系统

    • print n
  • 3.八、一个简单示例的调试会话

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

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

chap4 修复内存问题 39/203

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

    • 常见的内存访问bug

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

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

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

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

    • 在使用Valgrind时,可使用--db-attach=yes选项来链接源代码调试器。
    • 默认调试器GDB,可使用--db-command=<command>指定另外一个调试器。
    • Purify在报告错误以后当即调用purify_stop_here()函数。
    • Insure++里调用_Insure_trap_error()函数。
  • 4.六、减小干扰,排查错误
  • 4.七、什么时候使用内存调试器

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

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

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

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

chap5 剖析内存的使用 49/203

  • 5.一、基本策略--主要步骤
  • 5.二、示例:分配数组

    • [testmalloc.c]
  • 5.三、第1步:查找泄漏
  • 5.四、第2步:设置指望值
  • 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.六、第4步:查明大部份内存被哪些数据占用了
  • 5.七、综合练习--genindex示例

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

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

履历

学习记录

  • 20181210看了chap3
  • 20181211看了chap四、5
相关文章
相关标签/搜索