一个调试器的实现剖析.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 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)

jiayou10 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8133070117000003

1亿VIP精品文档

相关文档