缘起
- 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
时报内存错误
-
-g是进行调试的编译器标志,
-
3.4、学习在程序崩溃时执行栈跟踪
- C/C++程序的栈是一个内存片段,用来存储每个活动的函数调用的栈帧(stack frame)。栈帧由返回地址、函数的参数和局部变量组成。
- 栈跟踪(stack trace)
-
gdb的栈跟踪命令是
bt
,backtrace
,或where
。- 可以使用
up
或down
在栈中移动
- 可以使用
- 3.5、学习使用断点
-
3.6、学习在程序中导航
-
命令
run
-
start
不必搜索包含main()函数的文件,直到main()的第一行 pause
continue
-
3种不同的步进模式
- step-into
step
进入函数调用的函数体 - step-over
next
- step-out
finish
- step-into
-
-
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=<command>
指定另一个调试器。 - Purify在报告错误之后立即调用
purify_stop_here()
函数。 - Insure++里调用
_Insure_trap_error()
函数。
- 在使用Valgrind时,可以使用
- 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中
setenv
或export
- 在UNIX中
- 5.5.3 用简单工具测量内存使用
- 5.5.4 使用top
- 5.5.5 使用WindowsTaskManager
- 5.5.6 为testmalloc选择相关输入值
- 5.5.7 确定机器上的内存是如何被释放的
-
5.5.8 使用内存剖析工具
- Windows中使用
AQtime
或Mpatrol
- Linux中使用
Massif
或Mpatrol
-
valgrind --tool=massif ./testmalloc n 100000 8
使用massif
- Windows中使用
- 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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。