MyDebugeer 一个简单调试器的实现

Posted HsinTsao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyDebugeer 一个简单调试器的实现相关的知识,希望对你有一定的参考价值。

学习的是网上的帖子,所以就不贴源码了。

整个程序以调试循环为主体,实现了启动调试,继续执行,内存查看,读取寄存器值,显示源代码,断点的设置、查看、删除,三种单步执行:StepIn、StepOver、StepOut,显示变量列表、显示指定类型内存内容,显示函数调用栈等功能。

原贴写的很好,从中学到了很多,特别是对<DbgHelp.h>有了接触和了解,学习了Windows提供给用户调试的API,当然这可能是这个程序的不足,因为基本上所有的功能都是利用API实现的,没有提及一些特别的知识和方法。不过对于我这样的小白来说还是收益匪浅。

令我最难受的地方是,在循环结构中我遇到了问题:

while (WaitForDebugEvent(&debugEvent, INFINITE) == TRUE) 
    {
        if (DispatchDebugEvent(&debugEvent) == TRUE)
        {
            ContinueDebugEvent(g_processID, g_threadID, g_continueStatus);
        }
        else 
        {
            break;
        }
    }

这个循环没有问题,可以等到OpenPrcess,loadDll等 Debug事件,但是当等到第一个CreateThread事件时,整个程序就陷入了无限等待,卡住了,不能继续循坏。调试了好久,也不知问题在哪里,后来放到Win7虚拟机下就完美运行了(本机我Win10)。

后来我就继续完善代码,然后去虚拟机里跑。等有空了,把这个while循环单独test一下,看看到底有什么问题。

 

学习完原贴和源程序, 我对符号文件、调试符号、以及相关的操作有了很多的认识和了解,可惜需要符号文件的支持,不然可以实现很多操作远程进程的动作。

 

另外,幸好对汇编,栈帧有一定的认识,学习起来不是很困难,对32位函数调用过程也有了很深的认识。

 

还有很重要的一部分知识就是Windows对异常的处理分发机制,这方面以前做过了解,但是都是文字方面的,这次有了实际体验。

 

我觉得这份代码的封装性和结构还是很不错的,至少我没有这样的能力,需要多多提高。

 

希望以后有机会,能继续完善这个项目,提供64位的功能,加入类似于windbg那种!peb 就能查看peb 的功能,以后有能力可以接入反汇编引擎,实现反汇编,减小对符号文件的依赖。

 

以上是关于MyDebugeer 一个简单调试器的实现的主要内容,如果未能解决你的问题,请参考以下文章

按钮在片段中不起作用

代码片段 - Golang 实现简单的 Web 服务器

运行/调试你的PHP代码

PHP代码-psysh调试代码片段工具

方便调试使用的代码片段

86/88汇编代码的执行调试