调试器开发实例_调试器事件处理(一.事件到达)

上一章既然说到了调试循环事件,那么接下来我们该说说对调试器事件的处理了.

调试器的事件处理虽然有很多,但是并不是每一个都用得上的,接下来的文章中我们挑选一些经常用到的来给大家说说.

CREATE_PROCESS_DEBUG_EVENT

 创建进程之后的第一个调试事件,CREATE_PROCESS_DEBUG_INFO结构体描述了该类调试事件的详细信息。

该结构体有三个字段是句柄,分别是hFile,hProcess和hThread,同样要记得使用CloseHandle关闭它们!

EXIT_PROCESS_DEBUG_EVENT  

被调试进程结束时引发此类调试事件,EXIT_PROCESS_DEBUG_INFO结构体描述了它的详细信息。或许你能做的只有输出dwExitCode这个字段的值。

CREATE_THREAD_DEBUG_EVENT(对应的还有卸载事件,因用的不多,所以忽略之)

 创建一个线程之后引发此类调试事件,CREATE_THREAD_DEBUG_INFO结构体描述了它的详细信息。同样要记住用CloseHandle关闭hThread字段!

LOAD_DLL_DEBUG_EVENT(对应的还有卸载事件,因用的不多,所以忽略之)  

加载一个DLL模块之后引发该类调试事件,LOAD_DLL_DEBUG_INFO结构体描述了它的详细信息。lpImageName这个字段可能会使你想在调试器中输出DLL的文件名,然而这行不通。

MSDN上的解释是,lpImageName的值是文件名字符串在被调试进程的进程空间内的地址,但是这个值可能为NULL,即使不为NULL,通过ReadProcessMemory读取到的内容也可能是NULL。

所以,想通过这个字段获取DLL的文件名并不可靠。

EXCEPTION_DEBUG_EVENT(该事件很重要)  

发生异常时引发此类调试事件,EXCEPTION_DEBUG_INFO结构体描述了它的详细信息。对这种调试事件的处理是最麻烦的,因为异常的种类非常多,对每种异常的处理也不相同。另外,此类调试事件也是实现断点和单步执行的关键。

现在打开我们上一章的代码,对其进行稍微的修改与调整,增加可以自己选择需要调试的进程,与事件函数的完成 具体代码如下:(部分代码)

 1 void StartDebug()
 2 {
 3     BOOL waitEvent = TRUE;
 4     DEBUG_EVENT debugEvent;
 5     while (waitEvent == TRUE && WaitForDebugEvent(&debugEvent, INFINITE))
 6     {
 7         switch (debugEvent.dwDebugEventCode)
 8         {
 9         case CREATE_PROCESS_DEBUG_EVENT:
10             DebugEvent->OnProcessCreated(&debugEvent.u.CreateProcessInfo);
11             break;
12         case CREATE_THREAD_DEBUG_EVENT:
13             DebugEvent->OnThreadCreated(&debugEvent.u.CreateThread);
14             break;
15         case EXIT_PROCESS_DEBUG_EVENT:
16             DebugEvent->OnProcessExited(&debugEvent.u.ExitProcess);
17             waitEvent = FALSE;
18             break;
19         case LOAD_DLL_DEBUG_EVENT:
20             DebugEvent->OnDllLoaded(&debugEvent.u.LoadDll);
21             break;
22         case EXCEPTION_DEBUG_EVENT:
23             DebugEvent->OnException(&debugEvent.u.Exception);
24             break;
25         case UNLOAD_DLL_DEBUG_EVENT:
26             break;
27         case EXIT_THREAD_DEBUG_EVENT:
28             break;
29         case OUTPUT_DEBUG_STRING_EVENT:
30             break;
31         default:
32             printf("Unknown debug event!");
33             break;
34         }
35         if (waitEvent == TRUE)
36         {
37             ContinueDebugEvent(debugEvent.dwProcessId, debugEvent.dwThreadId, DBG_CONTINUE);
38         }
39         else
40         {
41             break;
42         }
43     }
44 }

大体调整好后,我们在每个调试事件上输出一段信息,来测试下消息到达的情况

 1 void CDebugEvent::OnProcessCreated(const CREATE_PROCESS_DEBUG_INFO*)
 2 {
 3     printf("OnProcessCreated 进程创建事件到达!");
 4 }
 5
 6 void CDebugEvent::OnThreadCreated(const CREATE_THREAD_DEBUG_INFO*)
 7 {
 8      printf("OnThreadCreated 线程创建事件到达!");
 9 }
10
11 void CDebugEvent::OnException(const EXCEPTION_DEBUG_INFO*)
12 {
13     printf("OnException 异常事件到达");
14 }
15
16 void CDebugEvent::OnProcessExited(const EXIT_PROCESS_DEBUG_INFO*)
17 {
18      printf("OnProcessExited 进程退出事件");
19 }
20
21 void CDebugEvent::OnDllLoaded(const LOAD_DLL_DEBUG_INFO*)
22 {
23      printf("OnDllLoaded dll卸载事件");
24 }

运行我们的程序 输出信息如下
OnProcessCreated 进程创建事件到达!
OnDllLoaded dll装载事件
OnDllLoaded dll装载事件
OnDllLoaded dll装载事件
OnDllLoaded dll装载事件
OnDllLoaded dll装载事件
OnDllLoaded dll装载事件
OnDllLoaded dll装载事件
OnDllLoaded dll装载事件 ……略,(由于应用程序默认会载入多个系统dll,所以该事件会多次到达)

安全工具开发之调试器实现 第二课:调试器事件处理(一.事件到达) 到此结束,希望大家多多支持

附件地址:http://pan.baidu.com/s/1bnzpSq7

调试器开发实例_调试器事件处理(一.事件到达)

时间: 2024-08-02 06:58:06

调试器开发实例_调试器事件处理(一.事件到达)的相关文章

调试器开发实例_调试器框架设计

作为一个安全开发人员离不开调试器,它可以动态显示程序的执行过程,对于解决程序问题有极大的帮助,这些文章记录了我开发一个调试器雏形的过程,希望对你有帮助.或许我写的代码很拙劣,还请大家多多见谅! 我们使用  Microsoft Visual Studio 6.0 VC编译器来作为我们的开发工具想对一个程序进行调试,首先要做的当然是启动这个程序,这要使用CreateProcess这个Windows API来完成.例如: 1 // LilisiDebug.cpp : Defines the entry

安卓MP3播放器开发实例(1)之音乐列表界面

学习安卓开发有一年了,想想这一年的努力,确实也收获了不少.也找到了比較如意的工作. 今天准备分享一个以前在初学阶段练习的一个项目.通过这个项目我真正的找到了开发安卓软件的感觉,从此逐渐步入安卓开发的正规.这个项目是当时借鉴Mars老师的初学视频做的安州手机的MP3播放器.自己又进行了改进,特别在歌词的优化和加入进度条方面的.因为是8个月前做的,水平非常0基础,bug应该非常多,如今自己又懒得再一次改进,仅仅希望可以给初学的朋友们提供一些帮助.或者起到抛砖引玉的效果.那我就心惬意足了. 先整体介绍

WPF和Expression Blend开发实例:Adorner(装饰器)应用实例

装饰器-- 表示用于修饰 UIElement 的 FrameworkElement 的抽象类 简单来说就是,在不改变一个UIElement结构的情况下,将一个Visual对象加到它上面. 应用举例: 现在我们拥有一个文本框,但是我们需要限定输入的字符串,当输入的是非法字符串的时候,要求将文本框的四周包裹一个红色的边框.通常我们可以用Border将文本框包裹在里面,然后动态地改变它的颜色来实现功能.那么现在我们可以直接在文本框上面加一个装饰器来实现. Adorner类 AdornerLayer类

安卓MP3播放器开发实例(3)之进度条和歌词更新的实现

上一次谈了音乐播放的实现,这次说下最复杂的进度条和歌词更新.因为须要在播放的Activity和播放的Service间进行交互,所以就涉及了Activity对Service的绑定以及绑定后数据的传输,这个须要对服务绑定熟悉才干够理解.原理不复杂.可是步骤略微繁琐,代码贴起来可能会非常混乱. 进度条和歌词放在一起说比較好,不然比較混乱.进度条的调整大家都懂的,就是进度条调到哪里歌曲的播放就跟到哪里,歌词也得跟到哪里.首先看下上一篇看过的開始button监听事件中服务的绑定代码: //绑定播放服务 b

Python_装饰器,生成器_干货哦

import timeimport calendarimport os # 时间格式熟悉"""# 格式化成2016-03-20 11:45:39形式time01 = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())print()# 格式化成Sat Mar 28 22:24:24 2016形式print(time.strftime("%a %b %d %H:%M:%S %Y", ti

【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境)

作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42239705  参考博客 : [嵌入式开发]嵌入式 开发环境 (远程登录 | 文件共享 | NFS TFTP 服务器 | 串口连接 | Win8.1 + RedHat Enterprise 6.3 + Vmware11) 开发环境 : -- 操作系统 : Vmware11 + RedHat6.3 企业版 + Win8.1; -- 硬件 : OK-6410-A 开发

无法在Web服务器上启动调试,已附加了一个调试器

运行环境:开发环境:Windows7旗舰版64bit.VisualStudio2008 With SP1.ArcEngine10.0.NetFrameWork4.0.IIS7和C#开发语言. 问题描述:ASP.NET调试时遇到的错误"无法在Web服务器上启动调试.已附加了一个调试器. 问题原因:我自己正在调试一个WebService,再次启动另外一个WebService调试则会报出这个错误,VS.NET不允许同时调试两个Web应用程序的. 无法在Web服务器上启动调试,已附加了一个调试器

嵌入式调试器原理和各类调试器集锦(JLINK、STLINK、CCDEBUG)

工欲善其事,必先善其器.调试器在嵌入式开发调试中的重要性不言而喻,单步.断点和监察的效率远高于串口打印.但是,调试器对于一般开发人员往往是一个黑匣子.今天我们就来谈谈调试器的原理,顺便把自己的几类调试器接线和注意事项记录下来,以便查找.我常常要面对几个方案,而各个方案的调试器都不一样,接线有时连自己都记不住.所以这个帖子应值得嵌入式开发工程师收藏. 一.嵌入式调试多样性 我们先来回想调试的场景,思考一下这几个问题: 1. ARM开发环境有Keil.IAR.ADS等等,我们发现这几个平台都能用同一

嵌入式调试器原理和各类调试器集锦

工欲善其事,必先善其器.调试器在嵌入式开发调试中的重要性不言而喻,单步.断点和监察的效率远高于串口打印.但是,调试器对于一般开发人员往往是一个黑匣子.今天我们就来谈谈调试器的原理,顺便把自己的几类调试器接线和注意事项记录下来,以便查找.我常常要面对几个方案,而各个方案的调试器都不一样,接线有时连自己都记不住.所以这个帖子应值得嵌入式开发工程师收藏. 一.嵌入式调试多样性 我们先来回想调试的场景,思考一下这几个问题: 1. ARM开发环境有Keil.IAR.ADS等等,我们发现这几个平台都能用同一