搜索
高级检索
高级搜索
书       名 :
著       者 :
出  版  社 :
I  S  B  N:
文献来源:
出版时间 :
日臻完善:软件调试与优化典型应用
0.00    
图书来源: 浙江图书馆(由图书馆配书)
  • 配送范围:
    全国(除港澳台地区)
  • ISBN:
    9787113107192
  • 作      者:
    石磊玉编著
  • 出 版 社 :
    中国铁道出版社
  • 出版日期:
    2010
收藏
编辑推荐
    《日臻完善:软件调试与优化典型应用》站在软件工程的高度,剖析各个环节的调试技术。从编码规范、开发环节中的调试技术、测试环节中的调试技术、维护环节中的调试技术、软件缺陷管理等多个角度对软件调试进行了详细的介绍,并且与软件开发过程一一对应,便于读者从软件工程的角度把握软件调试,从而在更高的层次上把握全局。《日臻完善:软件调试与优化典型应用》注重理论结合实际。在介绍各种技术的同时,给出了针对性很强的示例,而且尽量做到图文并茂。《日臻完善:软件调试与优化典型应用》中不乏凝练的代码、图表,通过这些读者可以轻松地理解作者意图,把握《日臻完善:软件调试与优化典型应用》精髓。
    《日臻完善:软件调试与优化典型应用》不仅针对软件中各种错误给出了调试方法,同时也给出、了预防措施,防患于未然,帮助开发者在开发中尽量少犯错误,养成良好的编码习惯。
展开
内容介绍
    《日臻完善:软件调试与优化典型应用》在介绍相关内容时,通过实例阐述使晦涩的理论知识变得生动易懂。实例中的代码都是在Visual C++ 6.0开发环境中编写的,但调试理念和思想与软件开发环境无关,只是调试工具的操作细节不同。
    《日臻完善:软件调试与优化典型应用》以软件开发过程的全局来介绍软件调试,涉及编码过程的规范、测试用例的编写、事后调试、缺陷管理等多个开发环节的内容,介绍了各种常用开发技术的调试方法,包括静态链接库调试、动态链接库调试、多线程调试、内存泄漏、内核对象泄漏等。
    《日臻完善:软件调试与优化典型应用》主要面向软件程序编码人员、程序测试人员等软件领域的技术从业人员,同时软件开发管理人员也可从《日臻完善:软件调试与优化典型应用》中了解到软件缺陷管理方面的内容。
展开
精彩书摘
    2.3  重构
    重构(refactoring)就是在不改变软件现有功能的基础上,通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性。
    对于很多软件开发项目,在项目开始阶段,需求往往是不明确的,某些流程或者某些细节随着项目的进展会发生变化;某些软件系统,在完成开发后,还存在升级的可能,以适应新的技术发展趋势,升级的内容或技术细节在项目开发起始阶段是很难精确确定的。因此系统设计人员对软件项目往往只能从大方向予以把控,细枝末节很难把握,要让系统设计人员的设计能够完美的预见未来的任何变化、或者可以容纳任何扩展和改变,这几乎是不可能的。功能的变化导致设计的调整是不可难免的,所以“测试为先,持续重构”作为良好开发习惯被越来越多的人所采纳,测试和重构是保证软件质量的法宝。
    本节主要介绍代码重构的相关内容,测试的相关内容在2.5节测试代码中介绍。
    2.3.1 重构概述
    重构是指对软件内部结构调整,目的是在不改变“软件之可察行为”的前提下,提高其可理解性,降低其修改成本。有关重构的内容请阅读《重构一改善既有代码的设计》,在本书中,作者Martin Fowler充分展示了何处可能需要重构,如何将不好的设计改造为良好的设计等。
    1.重构的目的
    重构的精髓就是在不改变系统功能的情况下,改变系统的实现方式。为什么要这么做?投入精力不用来满足客户关心的需求,而是仅仅改变了软件的实现方式,这是否是在浪费客户的投资呢?
展开
目录
第1章 绪论 1
1.1 不可避免的调试工作 1
1.1.1 不存在完美的程序 2
1.1.2 系统经常不按期望运行 2
1.1.3 成本极高的调试过程 3
1.1.4 调试与测试 4
1.2 掌握调试 5
1.2.1 在编码过程中简化调试 5
1.2.2 软件问题分类 6
1.2.3 熟练使用工具 7
1.3 轻松调试的必备条件 8
1.3.1 减少调试时间 8
1.3.2 彻底解决每个错误 9
1.3.3 软件修改时的保守策略 10

第2章 编写良好的代码 11
2.1 代码编写规范 12
2.1.1 代码要求 12
2.1.2 命名规范 14
2.1.3 注释规范 19
2.2 静态代码检查 29
2.2.1 PCLINT简介 30
2.2.2 PCLINT安装 31
2.2.3 PCLINT集成 39
2.2.4 PCLINT代码检查 42
2.2.5 PCLINT选项 43
2.3 重构 46
2.3.1 重构概述 46
2.3.2 重构的关键问题 48
2.4 代码结构分析 51
2.4.1 进行代码分析 52
2.4.2 获取逆向工程模型 58
2.5 测试代码 60
2.5.1 测试用例设计 60
2.5.2 易测试性 61
2.5.3 编写自动测试代码前的准备 63
2.5.4 自动测试 63
2.5.5 代码覆盖原则 66
2.5.6 代码覆盖率评估 66

第3章 Visual C++调试基础 69
3.1 Visual C++调试工具 69
3.1.1 调试环境的建立 69
3.1.2 调试的一般过程 71
3.1.3 断点的设置 71
3.1.4 控制程序的运行 78
3.1.5 查看工具的使用 80
3.2 使用跟踪语句 84
3.2.1 跟踪语句的定义 85
3.2.2 TRACE宏的使用 86
3.2.3 Dump函数的使用 88
3.2.4 其他跟踪语句的使用 89
3.3 使用断言 91
3.3.1 断言的定义 91
3.3.2 ANSI C断言 92
3.3.3 C运行时刻函数库断言 93
3.3.4 MFC断言 94
3.3.5 使用断言的地方 96
3.4 工程选项 97
3.4.1 编译选项 97
3.4.2 链接选项 98
3.4.3 优化选项 99
3.5 调试版本和发布版本 100
3.5.1 生成调试版本和发布版本 100
3.5.2 调试版本和发布版本的区别 102
3.6 调试发布版本 103
3.7 符号文件 106
3.7.1 符号文件的定义 106
3.7.2 生成和使用PDB文件 107
3.8 使用预处理指令 109
3.8.1 #pragma 110
3.8.2 #error 114

第4章 库调试 115
4.1 运行库概述 115
4.1.1 静态链接库 116
4.1.2 动态链接库 116
4.2 创建链接库 117
4.2.1 创建静态链接库 118
4.2.2 创建动态链接库 121
4.3 调试静态链接库 130
4.3.1 静态连接库的使用 130
4.3.2 静态链接库的调试 131
4.3.3 常见问题及处理方法 135
4.4 调试动态链接库 135
4.4.1 动态链接库的使用 135
4.4.2 DLL冲突 136
4.4.3 获取DLL的相关信息 137
4.4.4 列举程序加载的模块 140

第5章 多线程程序调试 144
5.1 多线程概述 144
5.1.1 进程和线程 144
5.1.2 Win32 API对多线程编程的支持 145
5.2 线程的同步与互斥 149
5.2.1 等待函数 149
5.2.2 信号量 151
5.2.3 事件 153
5.2.4 临界区 156
5.2.5 死锁问题 159
5.3 多线程下内存操作 160
5.3.1 问题引出 161
5.3.2 优化方法 162
5.4 编写安全的线程代码 163
5.4.1 减少竞争 163
5.4.2 防止死锁 164
5.4.3 安全地终止线程 166
5.5 调试方法 171
5.5.1 获取线程信息 171
5.5.2 运行日志 174
5.5.3 设置特定断点 175
5.5.4 控制线程状态 177
5.5.5 尽早调试发布版本 178

第6章 SQL调试 179
6.1 SQL概述 179
6.1.1 数据定义语言 180
6.1.2 数据操作语言 181
6.1.3 SELECT表达式 183
6.1.4 SQL中的数据类型 184
6.2 数据库开发 186
6.2.1 开放数据库连接 187
6.2.2 MFC ODBC类 188
6.2.3 MFC DAO编程 189
6.2.4 OLE DB框架 190
6.2.5 ActiveX数据对象 191
6.3 编写良好的SQL语句 192
6.3.1 SQL语句优化 192
6.3.2 SQL编写建议 196
6.4 数据库性能调试 198
6.5 数据库结构分析 203

第7章 程序错误 206
7.1 程序错误类型 206
7.1.1 语法错误 207
7.1.2 连接错误 210
7.1.3 运行错误 212
7.1.4 逻辑错误 213
7.2 防御性编程 214
7.2.1 在非法输入中保护程序 214
7.2.2 使用断言 214
7.2.3 错误处理技术 217
7.3 查看错误 218

第8章 内存漏洞及调试 220
8.1 内存分配 220
8.1.1 内存分配函数 220
8.1.2 C++的new和delete操作符 223
8.2 内存泄漏 224
8.2.1 内存泄漏的定义 225
8.2.2 泄漏的分类与表现 225
8.3 内存泄漏调试 228
8.3.1 调试手段 228
8.3.2 内存泄漏的跟踪与检测 235
8.3.3 内存泄漏的防范 239
8.4 内存破坏调试 242
8.4.1 访问空指针 242
8.4.2 访问未被初始化的内存 243
8.4.3 内存越界 244
8.4.4 访问已经被释放的内存 244
8.4.5 释放未被初始化的指针 245
8.5 内存漏洞检查 246

第9章 内核对象泄漏及调试 249
9.1 句柄 249
9.1.1 句柄的定义 250
9.1.2 对象句柄的继承 251
9.2 内核对象 255
9.2.1 内核对象的定义 255
9.2.2 内核对象的创建 256
9.2.3 内核对象的销毁 258
9.2.4 内核对象的计数 259
9.2.5 内核对象的安全性 260
9.2.6 内核对象的共享 261
9.3 句柄泄漏 268
9.4 检测资源泄漏 269
9.4.1 使用任务管理器 269
9.4.2 使用WinDbg 270
9.5 GDI资源泄漏 272

第10章 结构异常处理 274
10.1 异常概述 274
10.2 Windows结构异常处理 277
10.2.1 结束异常程序 278
10.2.2 异常处理程序 285
10.2.3 异常过滤器 286
10.2.4 未处理异常 288
10.3 C++结构异常处理 290
10.3.1 C++异常处理的语法 290
10.3.2 C++异常处理机制 292
10.3.3 使用异常规格编程 294
10.3.4 将结构化异常转换为C++异常 301
10.4 Visual C++中的结构异常处理 305
10.4.1 中断处理句柄 305
10.4.2 异常处理句柄 316

第11章 事后调试 323
11.1 系统API错误码 323
11.1.1 使用GetLastError 324
11.1.2 获取错误码的字符串信息 326
11.2 汇编信息 330
11.2.1 汇编语言基础 330
11.2.2 线程堆栈 335
11.2.3 函数调用规范 337
11.2.4 使用反汇编 343
11.3 使用崩溃对话框 344
11.4 使用MAP文件 346
11.4.1 MAP文件构成 347
11.4.2 导致崩溃的代码行 348
11.5 使用Dr. Watson 351
11.5.1 Dr. Watson工具简介 351
11.5.2 Dr. Watson的使用 356

第12章 软件缺陷管理 364
12.1 软件缺陷概述 364
12.1.1 软件缺陷的定义 364
12.1.2 缺陷管理的目标 365
12.2 软件缺陷收集 366
12.2.1 软件缺陷描述 366
12.2.2 软件缺陷报告 367
12.3 软件缺陷管理方法 369
12.3.1 缺陷管理流程 369
12.3.2 缺陷跟踪管理系统 372
附录 374
附录A Visual C++环境下的常见问题 374
附录B 动态链接库def文件语法规则 380
展开
加入书架成功!
收藏图书成功!
我知道了(3)
发表书评
读者登录

请选择您读者所在的图书馆

选择图书馆
浙江图书馆
点击获取验证码
登录
没有读者证?在线办证