本书讲述了Windows程序开发中至关重要却往往易于忽视的一个环节——调试。本书言简意赅,以最为流行的开发工具Visual C++为例,讲述调试中所必备的知识以及应对方法、常用工具,充满了实用的技巧和宝贵的实践经验,是程序员必备的工具书。\r\n 本书适合各种级别的软件开发人员阅读,也可用作高校计算机相关专业编程课的参考读物。\r\n\r\n
前言\r\n\r\n第一章 简介和范围\r\n\r\n1.1 事件驱动的范例\r\n1.2 迎战错误\r\n1.3 错误源和错误分类\r\n1.4 最小化错误的数量\r\n1.5 最小化错误的代价\r\n1.6 章节概要\r\n\r\n第二章 Win32的存储管理系统\r\n\r\n2.1 虚拟地址空间\r\n2.2 堆\r\n2.3 堆函数\r\n2.4 虚拟存储函数\r\n2.5 章节概要\r\n\r\n第三章 Visual C++的调试环境\r\n\r\n3.1 断言(Assertion)\r\n3.2 非法访问(Access Volation)\r\n3.3 VERIFY\r\n3.4 调试环境\r\n3.5 调试和发布\r\n3.6 映像文件(Map File)\r\n3.7 C运行时库的支持\r\n3.8 Dump函数\r\n3.9 例外(Exception)\r\n3.10 例外处理的比较:C++,MFC和Win32\r\n3.11 返回值\r\n3.12 类CMemoryState\r\n3.13 钩住内存分配\r\n3.14 类型转换(Casts)\r\n3.15 GetLastError()\r\n3.16 验证指针和字符串\r\n3.17 章节概要\r\n\r\n第四章 Visual C++调试器\r\n\r\n4.1 纵览\r\n4.2 调试工具条\r\n4.3 Call Stack窗口\r\n4.4 程序问题\r\n4.5 DLL\r\n4.6 just-in-time(现场)调试\r\n4.7 Visual C++编译器错误\r\n4.8 编译器的Pragma\r\n4.9 代码移植\r\n4.10 章节概要\r\n\r\n第五章 其他的调试工具\r\n\r\n5.1 MFC Tracer\r\n5.2 Stress\r\n5.3 Spy++\r\n5.4 Browse\r\n5.5 DDESpy\r\n5.6 Profiler\r\n5.7 Process Viewer\r\n5.8 ErrLook工具\r\n5.9 WinDiff工具\r\n5.10 章节概要\r\n\r\n第六章 商业的调试器和工程工具\r\n\r\n6.1 BoundsChecker,vsual C++版\r\n6.2 CodeWizard\r\n6.3 代码管理系统(Code Management System)\r\n6.4 程序测试\r\n6.5 Microsoft Visual Test\r\n6.6 BugCollector Pro\r\n6.7 支持软件\r\n6.8 章节概要\r\n\r\n第七章 调试数据库程序\r\n\r\n7.1 数据库设计和规范化\r\n7.2 ODBC\r\n7.3 DAO\r\n7.4 选择数据库类\r\n7.5 数据库错误\r\n7.6 SQL\r\n7.7 SQL调试的局限性\r\n7.8 SQL数据类型\r\n7.9 章节概要\r\n\r\n第八章 常见的错误和特殊问题\r\n\r\n8.1 bool的尺寸\r\n8.2 非整数(non-integer)被零除\r\n8.3 在调用-findfirst()或者-findmext()之后调用-findclose()\r\n8.4 C的运行时-expand()函数失败后返回NULL\r\n8.5 三元操作符(Ternary Conditional)\r\n8.6 try块和Switch语句\r\n8.7 sizeof()和数组\r\n8.8 URLMON.DLL\r\n8.9 非法访问(Access Violatlon)\r\n8.10 排字错误\r\n8.11 Clean命令文档中的错误\r\n8.12 Windbg不能使用Visual C++ vs.0的调试信息\r\n8.13 ATL发布版本中的错误\r\n8.14 /WS:AGGRESSIVE链接器选项\r\n8.15 选项优先和CL环境变量\r\n8.16 /Zm选项\r\n8.17 缺少的类型定义错误(Missing Type Definition Error)\r\n8.18 关键字-emul()和-emulu()没有定义\r\n8.19 链接器的/OPT:ICF选项\r\n8.20 在装载NT符号的情况下调试Windows API函数\r\n8.21 Resolving Error RC2104\r\n8.22 编译警告(Level4)C4238\r\n8.23 编译警告(Level3)C4800\r\n8.24 编译警告(Level1)C4804\r\n8.25 编译警告(Level1)C4806\r\n8.26 编译警告(Level1)C4807\r\n8.27 编译警告(Level1)C4808\r\n8.28 章节概要\r\n\r\n第九章 一般的Windows错误\r\n\r\n9.1 位图按钮(Bitmapped Button)\r\n9.2 单选按钮(Radio Button)成员变量\r\n9.3 同库的连接\r\n9.4 坐标系统(Coordinate System)\r\n9.5 窗口句柄和设备上下文(Device Context)\r\n9.6 字符串和数组\r\n9.7 捕捉WM-HELP\r\n9.8 章节概要\r\n\r\n附录A ODBC错误码\r\n附录B SQLState值\r\n附录C DDEML错误码
本书讲述了Windows”程序软件开发生命周期中最为至关重要却往往不受重视的一个阶段——调试. 然而, 本书并不只是简单地解释如何使用调试器, 或者严格地从理论上讨论你可能会遇到的错误类型. 更准确地说, 它还希望让你更好地理解错误是如何被引入到程序中的, 你如何通过适当的设计技术来尽量减少它们, 以及你如何能够检测并修正它们. 但不要担心, 这里仍然是有一些技巧的. 我想把这本书定位在初级到中级的Windows开发者——也就是说, 我假定你熟悉Visual C++ Workbench, 知道如何使用它. 在本书中, 我认为读者有足够的知识, 不需要调试上的帮助, 而是想要更进一步地学习. 换句话说, 你或许已经是, 或者正在成为一名相当好的软件开发人员.
本书是针对Microsoft Visual C++开发工具的, 这是一个现在最常用的平台以及在主流的Windows开发中占统治地位的工具. 本书的组织如下:
错误的分类.
在设计和分析过程中将错误尽量减少.
内存和内存分配.
使用Visual C++调试器.
使用商业的调试器.
当你读完本书后, 你会了解到许多种错误和它们的起因, 以及建议的解决方案. 我对编译器中己知的错误会给予相应的注意, 而如果你陷入困境的话, 你能够在最后一章找到一个可能会对你有帮助的资源纲要.
除了关于调试的主题, 你还会看到一些有用的提示. 技巧和工具来辅助进行基本的工程管理. 虽然其中有一些话题同错误的检测和解决没有直接的联系, 但它们能够间接地影响你的调试过程.
例如, 在第四章中有一个关于Pragma的讨论. 其中一个有用的Pragma为:
#message(string)
它使你能够往构建窗口中输出一个消息. 比如:
#message(”Date-validation not finished in method GetDate()!");
如果你有一个函数还没有完全完成, 这样一个提示能够减少一些障碍, 节省你提交产品的时间.
最后, 我希望有了本书的帮助, 你可以尽快将自己基于MFC/Visual C++的应用程序推向市场, 而同时又尽可能地减少程序的错误(bug).