Windows调试——死锁的查找

首先看看什么是死锁呢?死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。

1) 先用!locks查看所有的线程占用的锁
注意,该指令在新版本的windbg中已经无法使用。需要使用的话必须切换版本到dbg_x86_6.10.3.233.msi。
这里写图片描述
这里可以看到有三个线程正在等待三个锁,第一个线程等待的锁是0043a620,但被5e4这条线程占用,第二个线程等待的锁是0043a844,但被5dc线程占用,第三个线程等待的锁是031d40d4,也被5e4线程占用。
2)接着,我们需要查看5e4线程和5dc线程的id,具体可以通过查看工具栏中Processes and Threads,如下图所示,5e4的线程的id为53,5dc线程的id为51。
这里写图片描述
3)分别输入~53kb和~51kb查看这个两个线程的调用栈,结果如下图所示
这里写图片描述
由数据可知,5e4线程正在等待一把0043a844的锁,而5dc线程也正在等待锁0043a620。
4)结合第一步获取的信息可知,5e4线程要去获取已经被5dc占用的锁0043a844,而5dc又要去获取已经被5e4占用的锁0043a620,如此形成环路,就产生了死锁

当!locks出现问题的时候
情况一
ChildEBP RetAddr Args to Child
065d5730 7c92df5a 7c939b23 000008e0 00000000 ntdll!KiFastSystemCallRet (FPO: [0,0,0])
065d5734 7c939b23 000008e0 00000000 00000000 ntdll!NtWaitForSingleObject+0xc (FPO: [3,0,0])
065d57bc 7c921046 0079f570 7d5bd275 7d79f570 ntdll!RtlpWaitForCriticalSection+0x132 (FPO: [1,26,4])
065d57c4 7d5bd275 7d79f570 05cc7bc5 065d5814 ntdll!RtlEnterCriticalSection+0x46 (FPO: [1,0,0])
WARNING: Stack unwind information not available. Following frames may be wrong.
065d57d8 7d5bd238 7d5980f4 05cc7bc5 05ccf050 SHELL32!ILFindLastID+0x409
065d57f4 7d5bd833 00000000 00000000 05cc7bc5 SHELL32!ILFindLastID+0x3cc
065d5a40 7d5bd8de 00000000 05cc7c69 065d5a7c SHELL32!ILFindLastID+0x9c7
065d5c98 7d5bdb02 00000000 05cc7bc5 7d597034 SHELL32!ILFindLastID+0xa72
065d5cc0 7d5bd5e2 00000000 05cc7bc5 00000000 SHELL32!ILFindLastID+0xc96
065d5ce8 7d5bd7c2 05cbc240 05cc8340 00000000 SHELL32!ILFindLastID+0x776
065d5d0c 7d5bb846 05cc0800 05cc7bac 00000000 SHELL32!ILFindLastID+0x956
065d5d38 7d5bb89f 05cc7b98 00000000 7d597034 SHELL32!ILCombine+0x241
065d5d5c 7d5bbd12 04506770 05cc7b98 00000000 SHELL32!ILCombine+0x29a
065d5d80 7d5bc6f7 04506770 05cc7b98 00000000 SHELL32!SHGetDesktopFolder+0xba
065d5da4 7d5bc73c 00000000 05cc72e0 7d597034 SHELL32!ILRemoveLastID+0x50
065d5dc0 7d5c10ac 05cc72e0 7d597034 065d5df0 SHELL32!ILRemoveLastID+0x95
065d6010 7d5c1052 05cc72e0 065d79bc 00000002 SHELL32!SHGetPathFromIDListW+0x6c
065d6024 04f56f03 05cc72e0 065d79bc c54b6ba4 SHELL32!SHGetPathFromIDListW+0x12
分析如下:
0:009> !locks
NTSDEXTS: Unable to resolve ntdll!RTL_CRITICAL_SECTION_DEBUG type
NTSDEXTS: Please check your symbols
0:009> dt RTL_CRITICAL_SECTION 7d79f570
XXXXX!RTL_CRITICAL_SECTION
+0x000 DebugInfo : 0x00153ab8 _RTL_CRITICAL_SECTION_DEBUG
+0x004 LockCount : 1
+0x008 RecursionCount : 1
+0x00c OwningThread : 0x00000964
+0x010 LockSemaphore : 0x000008e0
+0x014 SpinCount : 0
看来是0x964线程持有锁,对应查看具体的线程

情况二
这里写图片描述
1 Id: 1588.1730 Suspend: 0 Teb: 7ffdd000 Unfrozen
ChildEBP RetAddr Args to Child
WARNING: Stack unwind information not available. Following frames may be wrong.
009ffcd4 7759215c 00000000 00000000 00000000 ntdll!KiFastSystemCallRet
009ffcfc 012d101d 012d3370 00000000 76d3ee1c ntdll!EtwEventEnabled+0xd9
009ffd08 76d3ee1c 00000000 009ffd54 775c37eb lock_test!thread1+0x1d (FPO: [1,0,1]) (CONV: stdcall) [d:\技术总结\lock_test\lock_test\lock_test.cpp @ 16]
009ffd14 775c37eb 00000000 76a98121 00000000 kernel32!BaseThreadInitThunk+0x12
009ffd54 775c37be 012d1000 00000000 00000000 ntdll!RtlInitializeExceptionChain+0xef
009ffd6c 00000000 012d1000 00000000 00000000 ntdll!RtlInitializeExceptionChain+0xc2

2 Id: 1588.754 Suspend: 0 Teb: 7ffdc000 Unfrozen
ChildEBP RetAddr Args to Child
WARNING: Stack unwind information not available. Following frames may be wrong.
0073fed4 7759215c 00000000 00000000 00000000 ntdll!KiFastSystemCallRet
0073fefc 012d104d 012d3388 00000000 76d3ee1c ntdll!EtwEventEnabled+0xd9
0073ff08 76d3ee1c 00000000 0073ff54 775c37eb lock_test!thread2+0x1d (FPO: [1,0,1]) (CONV: stdcall) [d:\技术总结\lock_test\lock_test\lock_test.cpp @ 25]
0073ff14 775c37eb 00000000 76458321 00000000 kernel32!BaseThreadInitThunk+0x12
0073ff54 775c37be 012d1030 00000000 00000000 ntdll!RtlInitializeExceptionChain+0xef
0073ff6c 00000000 012d1030 00000000 00000000 ntdll!RtlInitializeExceptionChain+0xc2

0:000> uf 012d3388 :显示函数的反汇编代码
Flow analysis was incomplete, some code may be missing
lock_test!cs1:
012d3388 a04f3500fa mov al,byte ptr ds:[FA00354Fh]

0:000> dt RTL_CRITICAL_SECTION 012d3388
lock_test!RTL_CRITICAL_SECTION
+0x000 DebugInfo : 0x00354fa0 _RTL_CRITICAL_SECTION_DEBUG
+0x004 LockCount : -6
+0x008 RecursionCount : 1
+0x00c OwningThread : 0x00001730
+0x010 LockSemaphore : 0x0000003c
+0x014 SpinCount : 0


2)
0:000> uf 012d3370 显示函数的反汇编代码
Flow analysis was incomplete, some code may be missing
lock_test!cs2:
012d3370 c84f3500 enter 354Fh,0
012d3374 fa cli

0:000> dt RTL_CRITICAL_SECTION 012d3370
lock_test!RTL_CRITICAL_SECTION
+0x000 DebugInfo : 0x00354fc8 _RTL_CRITICAL_SECTION_DEBUG
+0x004 LockCount : -6
+0x008 RecursionCount : 1
+0x00c OwningThread : 0x00000754
+0x010 LockSemaphore : 0x00000040
+0x014 SpinCount : 0

情况三
最近跟踪了一个程序的界面卡死问题,用windbg载入dump文件后打印出函数调用堆栈后,一眼可以看出是临界区死锁了。
代码:
0:000:x86> kb
ChildEBP RetAddr Args to Child
0032dd0c 779ed993 00000710 00000000 00000000 ntdll_779b0000!NtWaitForSingleObject+0x15
0032dd70 779ed877 00000000 00000000 024023f0 ntdll_779b0000!RtlpWaitOnCriticalSection+0x13e
0032dd98 58a2fac3 02404c50 856fd57e 024023f0 ntdll_779b0000!RtlEnterCriticalSection+0x150
0032dffc 58a0d4d7 856fea8a 00000000 001c41a0 SogouSoftware_589d0000!CDownloadListUI::UpdateDownloadListUI+0x43
输出该临界区的信息:
代码:

0:000:x86> !cs 02404c50

Critical section = 0x0000000002404c50 (+0x2404C50)
DebugInfo = 0x0000000000611e08
LOCKED
LockCount = 0xFFFFFFFF
WaiterWoken = Yes
OwningThread = 0x0000000000000710
RecursionCount = 0x1A38
LockSemaphore = 0x2433B08
SpinCount = 0x0000000000000000
Windbg指示是0x710号线程占有该临界区在,于是看看0x710号线程是那一个,结果发现报错,一般这种情况是线程已经退出或者被终止掉了。
代码:
0:000:x86> [710]
^ Illegal thread error in '
[710]’
该临界区死锁的位置部分代码如下:
代码:
void CDownloadListUI::UpdateDownloadListUI()
{
m_vctLock.Lock();
vector vecDeleteItems(GetCount()); // record index to be delete
std::iota(vecDeleteItems.begin(), vecDeleteItems.end(), 0);
}
m_vctLock是ATL一个对临界区简单封装的类,仔细对m_vctLock所有加锁的位置进行检查,发现除了主线程外只有另外一个工作线程会使用,用windbg查了下改工作线程并未退出,线程ID也不为 0x710,难道又被Windbg给忽悠了?打印下该临界区的数据结构看看:
代码:
0:000:x86> dt _RTL_CRITICAL_SECTION 02404c50
DuiLib!_RTL_CRITICAL_SECTION
+0x000 DebugInfo : 0x00611e08 _RTL_CRITICAL_SECTION_DEBUG
+0x004 LockCount : 0n-6
+0x008 RecursionCount : 0n1
+0x00c OwningThread : 0x00001a38 Void
+0x010 LockSemaphore : 0x00000710 Void
+0x014 SpinCount : 0
发现这里显示的拥有者线程号和上面不一致,试试看是那个线程:
代码:
0:000:x86> ~~[1a38]
6 Id: 2058.1a38 Suspend: 0 Teb: 7ef94000 Unfrozen
Start: SogouSoftware_589d0000!_threadstartex (58a5192d)
Priority: 0 Priority class: 32 Affinity: f
0:000:x86> ~6s
ntdll_779b0000!ZwWaitForMultipleObjects+0x15:
779d019d 83c404 add esp,4
0:006:x86> kb
ChildEBP RetAddr Args to Child
0370fa5c 768615f7 00000002 0370faac 00000001 ntdll_779b0000!ZwWaitForMultipleObjects+0x15
0370faf8 773519f8 0370faac 0370fb20 00000000 KERNELBASE!WaitForMultipleObjectsEx+0x100
0370fb40 773541d8 00000002 7efde000 00000000 kernel32!WaitForMultipleObjectsExImplementation+0xe0
0370fb5c 589f6ba0 00000002 0370fb84 00000000 kernel32!WaitForMultipleObjects+0x18
0370fbd4 58a51907 58aab894 862df68e 00000000 SogouSoftware_589d0000!CThreadQueue::ThreadProc+0x100
0370fc0c 58a51991 00000000 0370fc24 7735336a SogouSoftware_589d0000!_callthreadstartex+0x1b [f:\dd\vctools\crt_bld\self_x86\crt\src\threadex.c @ 314]
0370fc18 7735336a 023f5170 0370fc64 779e9882 SogouSoftware_589d0000!_threadstartex+0x64 [f:\dd\vctools\crt_bld\self_x86\crt\src\threadex.c @ 292]
0370fc24 779e9882 023f5170 771cc6bb 00000000 kernel32!BaseThreadInitThunk+0xe
0370fc64 779e9855 58a5192d 023f5170 00000000 ntdll_779b0000!__RtlUserThreadStart+0x70
0370fc7c 00000000 58a5192d 023f5170 00000000 ntdll_779b0000!_RtlUserThreadStart+0x1b
6号线程正处于等待任务中,对照代码,6号线程有一个观察者的回调函数会调用到CDownloadListUI类中的m_vctLock锁,但是该回调函数已经执行完毕了那么只有一种可能,就是锁泄露了,即Lock后没有解锁。再去看该回调函数,果然发现有一个很少出现的分支下没有调用Unlock释放临界区而直接返回了,这就造成了经典的锁泄露而引起死锁的bug。
但 !cs 命令在此种情况下却给出了错误的信息,很容易造成误导而怀疑是一个拥有该锁的线程退出了而引起的。这应该算是Windbg的一个bug吧。
进一步测试该情况,发现是当64位系统下的32位进程产生的dump会有此问题,32位系统下 !cs 命令执行正常。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第1篇 Java开发必备基础 第1章 搭建Java开发环境 1.1 Java的过去、现在和未来 1.1.1 Java的历史 1.1.2 Java的语言特点 1.1.3 Java API简介 1.1.4 Java未来发展 1.2 Java程序设计环境 1.2.1 命令行工具——JDK 6.0 1.2.2 安装工具包JDK 1.2.3 设置JDK环境 1.2.4 集成开发环境安装——MyEclipse 8.5 1.2.5 MyEclipse的一些常用操作 1.3 创建和运行Java程序 1.3.1 手工创建、编译和运行Java程序 1.3.2 在MyEclipse 8.5中创建、运行、调试和管理Java项目 1.4 小结 第2章 Java面向对象编程 2.1 面向对象的一些概念 2.1.1 面向对象涉及的概念 2.1.2 类和对象 2.2 面向对象的一些特性 2.2.1 继承特性 2.2.2 多态特性 2.2.3 封装特性 2.3 Java中实现的面向对象特性 2.3.1 定义类 2.3.2 创建对象 2.3.3 实现继承 2.3.4 实现多态 2.3.5 实现封装 2.4 小结 第3章 Java新特性 3.1 Java的一些简单新特性 3.1.1 静态导入 3.1.2 可变参数函数 3.1.3 增强版for循环 3.1.4 基本数据的拆、装箱操作(autoboxing和unboxing) 3.2 枚举 3.2.1 枚举的实现原理 3.2.2 枚举的简单应用 3.2.3 枚举的高级特性 3.3 反射 3.3.1 反射的基石——Class类 3.3.2 反射的基本应用 3.3.3 反射的高级应用 3.4 标注 3.4.1 标注的简单使用 3.4.2 JDK的内置标注 3.5 泛型 3.5.1 为什么要使用泛型 3.5.2 泛型的一些特性 3.5.3 泛型的通配符 3.6 类加载器 3.6.1 什么是类加载器 3.6.2 什么是类加载器的委派模型 3.6.3 编写一个自己的加载器 3.7 动态代理 3.7.1 什么是代理 3.7.2 动态代理基础类 3.7.3 InvocationHandler接口 3.7.4 动态代理类的设计模式 3.8 小结 第2篇 线程开发 第4章 学生并发接水(线程Thread) 4.1 学生并发接水原理 4.1.1 项目结构框架分析 4.1.2 项目功能业务分析 4.2 不排队形式学生并发接水 4.2.1 水龙头类 4.2.2 学生类 4.2.3 测试类 4.3 学生并发接水的其他形式 4.3.1 “排队接水”水龙头类 4.3.2 “接完水后一起回教室”水龙头类 4.4 知识点扩展——线程的基础知识 4.4.1 为什么要使用线程 4.4.2 多线程程序的编写方式 4.5 小结 第5章 模拟做饭场景(线程的join()方法) 教学视频:7分钟5.1 做饭场景原理 5.1.1 项目结构框架分析 5.1.2 项目功能业务分析 5.2 纷乱的做饭场景 5.2.1 儿子的类 5.2.2 妈妈的类 5.2.3 做饭场景的类 5.2.4 修改后的妈妈类 5.3 知识点扩展——线程的状态 5.3.1 线程的创建状态 5.3.2 线程的暂停状态 5.3.3 线程的结束状态 5.4 小结 第6章 火车站售票系统(线程安全知识) 6.1 火车站售票系统原理 6.1.1 项目结构框架分析 6.1.2 项目功能业务分析 6.2 没有实现线程安全的火车票售票系统 6.2.1 火车票的类 6.2.2 售票台的类 6.2.3 实现线程安全的火车票售票系统 6.3 知识点扩展——线程的同步知识 6.3.1 为什么要使用同步机制 6.3.2 Synchronized的同步块 6.3.3 Synchronized的同步方法 6.3.4 死锁的问题 6.4 小结 第7章 生产者与消费者问题(线程通信知识) 7.1 生产者与消费者原理 7.1.1 项目结构框架分析 7.1.2 项目功能业务分析 7.2 无线程通信的生产者与消费者项目 7.2.1 生产者类 7.2.2 消费者类 7.2.3 储存库类 7.2.4 测试类 7.3 实现线程通信的生产者与消费者项目 7.3.1 生产者和消费者的类 7.3.2 储存库的类 7.4 知识点扩展——线程的通信知识 7.4.1 线程通信的基本知识 7.4.2 线程通信的具体实例 7.5 小结 第8章 关机工具(Timer类+系统命令) 8.1 关机工具原理 8.1.1 项目结构框架分析 8.1.2 项目功能业务分析 8.2 关机工具的实现过程 8.2.1 关机工具的类 8.2.2 关机工具的工具类 8.3 知识点扩展——关机工具项目涉及的知识 8.3.1 Timer和TimerTask类 8.3.2 shutdown命令 8.3.3 通过shutdown命令实现网络远程关机 8.4 小结 第3篇 GUI(图形用户界面)开发 第9章 典型的图形用户界面(各种组件) 9.1 Label和Button的用户界面 9.1.1 分析按钮和面板的用户界面 9.1.2 按钮和面板的用户界面 9.1.3 组件Button和Label的基本知识 9.2 复选框的用户界面 9.2.1 分析复选框的用户界面 9.2.2 按钮和面板的用户界面 9.2.3 组件Checkbox和CheckboxGroup的基本知识 9.3 下拉菜单和列表的用户界面 9.3.1 分析下拉菜单和列表的用户界面 9.3.2 下拉菜单和列表的用户界面 9.3.3 Choice和List组件的基本知识 9.4 输入的用户界面 9.4.1 分析输入的用户界面 9.4.2 输入的用户界面 9.4.3 TextField和TextArea组件的基本知识 9.5 滚动条的用户界面 9.5.1 分析滚动条的用户界面 9.5.2 滚动条的用户界面 9.5.3 滚动组件的基本知识 9.6 菜单的用户界面 9.6.1 分析菜单组件的用户界面 9.6.2 菜单的用户界面 9.6.3 菜单组件的基本知识 9.7 对话框的用户界面 9.7.1 分析对话框和文件对话框的用户界面 9.7.2 对话框的用户界面 9.7.3 Dialog和FileDialog组件的基本知识 9.8 小结 第10章 计算器(布局管理器) 10.1 计算器原理 10.1.1 项目结构框架分析 10.1.2 项目功能业务分析 10.2 计算器的实现过程 10.3 知识点扩展——事件机制的高级知识 10.3.1 为什么需要版面的配置 10.3.2 Java语言中的各种布局管理器 10.4 小结 第11章 秒表(事件+线程) 11.1 秒表原理 11.1.1 项目结构框架分析 11.1.2 项目功能业务分析 11.2 秒表的实现过程 11.2.1 秒表类 11.2.2 测试秒表的类 11.3 知识点扩展——事件机制的基础知识 11.3.1 事件处理机制 11.3.2 Window事件 11.3.3 Mouse事件 11.3.4 Key事件 11.3.5 其他底层事件 11.3.6 事件的高级编写方法 11.4 小结 第12章 捉迷藏游戏(事件) 12.1 捉迷藏游戏原理 12.1.1 项目结构框架分析 12.1.2 项目功能业务分析 12.2 捉迷藏游戏的实现过程 12.2.1 捉迷藏游戏项目的原理 12.2.2 自定义按钮类 12.2.3 测试的类 12.3 知识点扩展——事件机制的高级知识 12.3.1 事件多重应用 12.3.2 事件处理的详细过程 12.4 小结 第13章 鼠标绘直线(绘图+事件) 13.1 鼠标绘直线原理 13.1.1 项目结构框架分析 13.1.2 项目功能业务分析 13.2 鼠标绘直线的实现过程 13.2.1 直线的类 13.2.2 实现窗口类——通过paint()方法 13.2.3 实现窗口类——通过双缓冲技术 13.3 知识点扩展——画图的基础知识 13.3.1 画图的基础知识 13.3.2 各种类型对象的绘制 13.4 小结 第14章 指针时钟项目(Swing组件+时间算法) 14.1 指针时钟原理 14.1.1 项目结构框架分析 14.1.2 项目功能业务分析 14.2 指针时钟的实现过程 14.2.1 指针时钟的界面 14.2.2 绘制指针时钟的类 14.3 知识点扩展——从AWT到Swing的过渡 14.3.1 窗口类JFrame 14.3.2 按钮类JButton和面板类JLabel 14.3.3 单选按钮和复选框组件 14.3.4 选择框组件 14.3.5 输入框组件 14.4 小结 第15章 控制动画项目 (JSlider和Timer组件) 15.1 控制动画原理 15.1.1 项目结构框架分析 15.1.2 项目功能业务分析 15.2 控制动画的实现过程 15.2.1 控制动画的主界面 15.2.2 控制动画的逻辑 15.3 知识点扩展——JSlider和Timer组件的基础知识 15.3.1 使用JSlider组件创建无刻度的滑杆 15.3.2 使用JSlider组件创建带数字刻度的滑杆 15.3.3 使用JSlider组件创建带字符刻度的滑杆 15.3.4 JSlider组件的高级应用 15.3.5 Swing中的多线程 15.3.6 Timer组件的基础知识 15.3.7 Timer组件的应用 15.4 小结 第16章 记事本(对话框组件) 16.1 记事本原理 16.1.1 项目结构框架分析 16.1.2 项目功能业务分析 16.2 记事本的实现过程 16.2.1 实现记事本的界面 16.2.2 实现菜单功能 16.2.3 文件类型的过滤 16.3 记事本的实现过程——字体设置对话框 16.3.1 字体设置对话框——主界面 16.3.2 字体设置对话框——jPanel1组件界面 16.3.3 字体设置对话框——其他组件 16.4 小结 第17章 拼图游戏(GUI综合应用) 17.1 拼图游戏原理 17.1.1 项目结构框架分析 17.1.2 项目功能业务分析 17.1.3 拼图游戏项目的原理 17.2 拼图游戏的实现过程 17.2.1 实现移动功能的按钮类 17.2.2 主面板的类 17.2.3 主窗口的类 17.3 小结 第4篇 文件操作和访问 18.1 文件属性查看器原理 18.1.1 项目结构框架分析 18.1.2 项目功能业务分析 18.2 文件属性查看器项目 18.2.1 实现显示文件信息的自定义窗口 18.2.2 自定义窗口的显示 18.3 知识点扩展——文件的操作和访问 18.3.1 通过FileOp类实现文件创建和删除功能 18.3.2 通过FileDir类实现列举文件和目录的功能 18.3.3 File类提供的属性和方法 18.3.4 文件访问的基本概念 18.3.5 文件的基本访问方式——字节方式 18.3.6 文件的基本访问方式——字符方式 18.3.7 文件的高级访问方式 18.4 小结 第19章 文件内容查看器(GUI+文件访问) 19.1 文件内容查看器原理 19.1.1 项目结构框架分析 19.1.2 项目功能业务分析 19.2 文件内容查看器项目 19.2.1 设计项目的界面——文件内容查看器输入界面 19.2.2 “打开”菜单项的处理方法 19.2.3 单击列表选项的处理方法 19.3 知识点扩展——管道的访问 19.3.1 管道的访问——字节方式 19.3.2 管道的访问——字符方式 19.4 知识点扩展——内存的访问 19.4.1 内存的访问——字节方式 19.4.2 内存的访问——字符和字符串方式 19.5 小结 第20章 日记簿(GUI+文件访问和操作) 20.1 日记簿原理 20.1.1 项目结构框架分析 20.1.2 项目功能业务分析 20.2 日记簿项目 20.2.1 设计项目的界面——日记薄输入界面 20.2.2 “保存”按钮的事件处理 20.2.3 “查看日记”按钮的事件处理 20.2.4 设计项目的界面——日记列表界面 20.2.5 “查看”按钮的事件处理 20.2.6 “删除”按钮的事件处理 20.3 知识点扩展——过滤流的基础知识 20.3.1 过滤流的缓存(Buffering)类 20.3.2 过滤流实现字节和字符相互转换类 20.3.3 过滤流特定数据类型类 20.3.4 过滤流对象序列化类 20.3.5 过滤流打印类 20.4 小结 第21章 查找和替换项目(GUI+字符串处理) 21.1 查找和替换原理 21.1.1 项目结构框架分析 21.1.2 项目功能业务分析 21.2 查找和替换项目——利用AWT组件 21.2.1 设计项目的界面——查找和替换输入界面 21.2.2 各种按钮的事件处理 21.2.3 字符串处理的类 21.3 查找和替换项目——利用Swing组件 21.3.1 设计项目的界面——查找和替换输入界面 21.3.2 各种按钮的事件处理 21.4 小结 第5篇 Applet程序开发 第22章 图像轮显动画项目(显示图像+多线程) 22.1 图像轮显动画原理 22.1.1 项目结构框架分析 22.1.2 项目功能业务分析 22.2 图像轮显动画项目 22.3 知识点扩展——Applet程序的基础知识 22.3.1 Applet程序的执行过程 22.3.2 Applet程序的执行环境 22.3.3 Applet程序的输出 22.3.4 Applet程序的标记 22.3.5 参数的传递 22.3.6 Applet程序的相关方法 22.4 小结 第23章 Applet事件监听项目 (事件处理机制) 23.1 Applet事件监听原理 23.1.1 项目结构框架分析 23.1.2 项目功能业务分析 23.2 Applet事件监听项目 23.2.1 事件监听的类 23.2.2 承载事件监听的页面 23.3 知识点扩展——MyEclipse开发环境对Applet程序的支持 23.3.1 MyEclipse开发环境对Applet项目的支持 23.3.2 MyEclipse开发环境对JAR的支持 23.4 小结 第24章 动画播放项目(音频操作+多线程) 24.1 动画播放原理 24.1.1 项目结构框架分析 24.1.2 项目功能业务分析 24.2 动画播放项目 24.2.1 动画的类 24.2.2 控制动画的类 24.3 知识点扩展——Applet程序的高级知识 24.3.1 音频播放 24.3.2 Applet的上下文对象 24.4 小结 25.1 网络聊天室原理 25.1.1 项目结构框架分析 25.1.2 项目功能业务分析 25.2 网络聊天室的实现过程 25.3 知识点扩展——网络编程和UDP协议 25.3.1 网络编程涉及的基本概念 25.3.2 套接字(Socket)机制 25.3.3 UDP协议类 25.3.4 TCP协议类 25.3.5 TCP协议客户端类 25.4 小结 第26章 FTP服务器客户端 (FtpClient+I/O处理) 26.1 FTP服务器客户端原理 26.1.1 项目结构框架分析 26.1.2 项目功能业务分析 26.2 FTP服务器客户端的实现过程 26.2.1 FTP服务器操作的工具类 26.2.2 实现文件上传的类 26.2.3 实现文件下载的类 26.3 知识点扩展——FtpClient类的相关知识 26.3.1 实现FTP服务器相关操作类 26.3.2 相关JAR包导入问题 26.4 小结 第27章 Web服务器(HTTP协议) 27.1 Web服务器原理 27.1.1 项目结构框架分析 27.1.2 项目功能业务分析 27.2 Web服务器的实现过程 27.2.1 实现与浏览器通信的类 27.2.2 实现Web服务器的类 27.2.3 浏览器所请求的页面 27.3 知识点扩展——HTTP协议知识 27.3.1 HTTP协议原理 27.3.2 实现HTTP协议服务器的原理 27.4 小结 28.1 QQ聊天工具原理 28.1.1 项目结构框架分析 28.1.2 项目功能业务分析 28.2 QQ项目——对象模型的类 28.2.1 信息的类 28.2.2 “用户”的类 28.3 QQ项目——登录功能 28.3.1 QQ服务器界面的设计 28.3.2 QQ服务器后台程序 28.3.3 QQ客户端登录界面的设计 28.3.4 QQ客户端后台程序 28.3.5 成员列表窗口 28.4 QQ项目——聊天功能 28.4.1 服务器端的信息转发 28.4.2 客户端信息的发送和接收 28.4.3 客户端信息转发类 28.5 小结 第7篇 项目案例实战 第29章 人员信息管理项目 (接口设计模式+MySQL数据库) 29.1 人员信息管理原理 29.1.1 项目结构框架分析 29.1.2 项目功能业务分析 29.2 人员信息管理项目前期准备 29.2.1 设计数据库 29.2.2 数据库操作相关类 29.3 人员信息管理项目——DAO层 29.3.1 实现数据连接操作(DAO)的接口 29.3.2 实现数据连接操作(DAO)的实现类 29.3.3 实现数据连接操作(DAO)的代理类 29.3.4 实现数据连接操作(DAO)的工厂类 29.4 人员信息管理项目——服务层和表示层 29.4.1 人员信息管理项目的服务层 29.4.2 人员信息管理项目的表示层 29.4.3 工具类 29.5 人员信息管理项目——代理类测试 29.5.1 测试实现业务功能的各种方法 29.5.2 人员信息管理入口类 29.6 知识点扩展——设计模式的基础知识 29.6.1 工厂设计模式 29.6.2 代理设计模式 29.7 小结 第30章 中国象棋游戏(GUI+游戏规则算法) 30.1 象棋游戏原理 30.1.1 象棋游戏的基本规则 30.1.2 项目结构框架分析 30.1.3 项目功能业务分析 30.2 象棋游戏项目——象棋游戏的主类 30.2.1 实现象棋游戏的主界面 30.2.2 实现象棋游戏中添加棋子的功能 30.2.3 实现象棋游戏中棋子闪烁的功能 30.2.4 处理单击棋子事件 30.2.5 处理单击按钮事件 30.3 象棋游戏项目——规则的内部类 30.3.1 实现卒移动和吃的方法 30.3.2 实现炮、车移动和吃的方法 30.3.3 实现马移动和吃的方法 30.3.4 实现象移动和吃的方法 30.3.5 实现士移动和吃的方法 30.3.6 实现将移动和吃的方法 30.4 小结 第31章 俄罗斯方块游戏网络版(Swing+多线程+网络编程) 31.1 俄罗斯方块游戏项目原理 31.1.1 基本原理 31.1.2 项目结构框架分析 31.1.3 项目功能业务分析 31.2 俄罗斯方块游戏项目——初步设计涉及的对象 31.2.1 正方形类 31.2.2 俄罗斯方块类 31.2.3 俄罗斯方块游戏项目的TOP10分数对象 31.3 俄罗斯方块游戏项目——服务器端和客户端 31.3.1 表示出俄罗斯方块游戏项目的服务器端 31.3.2 表示出俄罗斯方块游戏项目的客户端 31.4 俄罗斯方块游戏项目——游戏主界面 31.4.1 俄罗斯方块游戏的主界面 31.4.2 俄罗斯方块游戏的事件处理类 31.4.3 俄罗斯方块游戏的状态工具栏 31.5 俄罗斯方块游戏项目——其他界面的设计 31.5.1 “关于”面板 31.5.2 连接对方面板 31.5.3 分数报告面板 31.5.4 设置级别面板 31.5.5 警告面板和对话框 31.5.6 游戏结束面板和对话框 31.6 小结 第32章 图书管理系统项目 (GUI+Oracle数据库) 32.1 图书管理系统原理 32.1.1 项目结构框架分析 32.1.2 项目功能业务分析 32.2 图书管理系统项目——图书的操作 32.2.1 实现添加图书功能的类 32.2.2 实现修改图书功能的类 32.2.3 实现浏览图书信息的类 32.2.4 实现删除图书信息的类 32.3 图书管理系统项目——用户的操作 32.3.1 实现添加用户功能的类 32.3.2 实现删除用户功能的类 32.3.3 实现修改用户功能的类 32.3.4 实现用户登录功能的类 32.3.5 实现用户列表功能的类 32.4 图书管理系统项目——出借图书的操作 32.4.1 出借图书操作的类 32.4.2 借书列表方法 32.4.3 修改出借图书信息方法 32.5 图书管理系统项目——归还图书的操作 32.5.1 归还图书类 32.5.2 修改归还图书信息类 32.6 图书管理系统项目——该项目的其他类 32.6.1 主窗口类 32.6.2 数据库操作 32.7 小结

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值