- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
一个调试器的实现剖析
HYPERLINK /zplutor/archive/2011/03/04/1971279.html 一个调试器的实现(一)调试事件与调试循环
前言
程序员离不开调试器,它可以动态显示程序的执行过程,对于解决程序问题有极大的帮助。如果你和我一样对调试器的工作原理很感兴趣,那么这一系列文章很适合你,这些文章记录了我开发一个调试器雏形的过程,希望对你有帮助。或许我写的代码很拙劣,还请大家多多见谅!
?
这个调试器使用Visual Studio 2010作为开发工具,是一个控制台程序。为了简化,一切输入输出都使用C++标准库的相关类,而且省略了很多错误检查和处理的过程。
?
启动被调试程序
要想对一个程序进行调试,首先要做的当然是启动这个程序,这要使用CreateProcess这个Windows API来完成。例如,下面的代码以记事本作为被调试程序:
?1?#include?Windows.h?2?#include?iostream?3??4?int?wmain(int?argc,?wchar_t**?argv)?{?5??6?????STARTUPINFO?si?=?{?0?};?7?????si.cb?=?sizeof(si);?8??9?????PROCESS_INFORMATION?pi?=?{?0?};10?11?????if?(CreateProcess(12?????????TEXT(C:\\windows\\notepad.exe),13?????????NULL,14?????????NULL,15?????????NULL,16?????????FALSE,17?????????DEBUG_ONLY_THIS_PROCESS?|?CREATE_NEW_CONSOLE,18?????????NULL,19?????????NULL,20?????????si,21?????????pi)?==?FALSE)?{22?23?????????std::wcout??TEXT(CreateProcess?failed:)??GetLastError()??std::endl;24?????????return?-1;25?????}26?27?????CloseHandle(pi.hThread);28?????CloseHandle(pi.hProcess);29?30?????return?0;31?}
?
CreateProcess的第六个参数使用了DEBUG_ONLY_THIS_PROCESS,这意味着调用CreateProcess的进程成为了调试器,而它启动的子进程成了被调试的进程。除了DEBUG_ONLY_THIS_PROCESS之外,还可以使用DEBUG_PROCESS,两者的不同在于:DEBUG_PROCESS会调试被调试进程以及它的所有子进程,而DEBUG_ONLY_THIS_PROCESS只调试被调试进程,不调试它的子进程。一般情况下我们只想调试一个进程,所以应使用后者。
?
我建议在第六个参数中加上CREATE_NEW_CONSOLE标记。因为如果被调试程序是一个控制台程序的话,调试器和被调试程序的输出都在同一个控制台窗口内,显得很混乱,加上这个标记之后,被调试程序就会在一个新的控制台窗口中输出信息。如果被调试程序是一个窗口程序,这个标记没有影响。
?
上面的代码仅仅是启动了被调试进程,然后就立即退出了。要注意的是,如果调试器进程结束了,那么被它调试的所有子进程都会随着结束。这就是为什么虽然CreateProcess调用成功了,却看不到记事本窗口。
?
调试循环
调试器如何知道被调试进程内部发生了什么呢?是这样的,当一个进程成为被调试进程之后,在完成了某些操作或者发生异常时,它会发送通知给调试器,然后将自身挂起,直到调试器命令它继续执行。这有点像Windows窗口的消息机制。
?
被调试进程发送的通知称为调试事件,DEBUG_EVENT结构体描述了调试事件的内容:
?1?typedef?struct?_DEBUG_EVENT?{?2???DWORD?dwDebugEventCode;?3???DWORD?dwProcessId;?4???DWORD?dwThreadId;?5???union?{?6?????EXCEPTION_DEBUG_INFO?Exception;?7?????CREATE_THREAD_DEBUG_INFO?CreateThread;?8?????CREATE_PROCESS_DEBUG_INFO?CreateProcessInfo;?9?????EXIT_THREAD_DEBUG_INFO?
原创力文档


文档评论(0)