win32调试API学习心得(三)(2)
2008-04-10 02:57:27来源:互联网 阅读 ()
exit;
end;
while WaitForDebugEvent(DebugD, INFINITE) do
begin {根据事件代码进行相应处理}
case DebugD.dwDebugEventCode of
EXIT_PROCESS_DEBUG_EVENT:
begin
MessageBox(Application.Handle, ''''被调试进程中止'''', ''''!!!'''', MB_OK or MB_ICONERROR);
Break;
end;
CREATE_PROCESS_DEBUG_EVENT:
begin
ThreadHandle := DebugD.CreateProcessInfo.hThread;
MessageBox(Application.Handle, ''''被调试进程建立'''', ''''!!!'''', MB_OK or MB_ICONERROR);
end;
EXCEPTION_DEBUG_EVENT:
begin
if (DebugD.Exception.ExceptionRecord.ExceptionCode <> EXCEPTION_SINGLE_STEP) and
(DebugD.Exception.ExceptionRecord.ExceptionCode <> EXCEPTION_BREAKPOINT) then
Rc := False {如果被调试程序产生了异常,让它自己处理}
else
begin
GetThreadContext(ThreadHandle, Context);
{将标志寄存器的陷井标志设为TRUE,这样CPU将会处于单步模式}
Context.EFlags := Context.EFlags or $100;
Inc(CodeCount);
Form1.Label1.Caption := IntToStr(CodeCount);
SetThreadContext(ThreadHandle, Context);
Rc := True;
end;
end;
end;
if Rc then
ContinueDebugEvent(DebugD.dwProcessId, DebugD.dwThreadId,
DBG_CONTINUE)
else
ContinueDebugEvent(DebugD.dwProcessId, DebugD.dwThreadId,
DBG_EXCEPTION_NOT_HANDLED);
end;
CloseHandle(pi.hProcess);
Closehandle(pi.hThread);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ThreadHandle, ThreadID: THandle;
begin
ThreadHandle := CreateThread(nil, 0, @DebugPro, nil, 0, ThreadID);
end;
end.
最后附上其它的调试API.
一. procedure DebugBreak; stdcall;
该函数在当前进程中产生断点,以便调用的线程能够向调试器发信号.
二. procedure FatalExit(ExitCode: Integer); stdcall;
该函数把执行控制交给调试器,调试器的行为随后被指定为所用调试器的类型.
三. function FlushInstructionCache(hProcess: THandle; const lpBaseAddress: Pointer; dwSize: DWORD): BOOL; stdcall;
该函数为指定进程刷新指令高速缓存器,此函数仅在多进程计算机上是有效的.
hProcess:要刷新的高速缓存器的进程句柄.
lpBaseAddress:要刷新区域的基地址指针,可以为0
dwSize:要刷新区域的长度.
四. function isDebuggerPresent; BOOL; stdcall;
该函数表明调用的进程是否在调试器描述表下运行,此函数从KERNEL32.DLL输出.
五. procedure OutputDebugString(lpOutputString: PChar); stdcall;
该函数为当前的应用程序发送一个字符串到调试器中,lpOutputString为要发送的字符串.
在DELPHI中可以通用View->Debug Windows->Event Log打开Event Log窗口查看被调试程序发送的字符串.
六. procedure SetDebugErrorLevel(dwLevel: DWORD); stdcall;
该函数设置最小错误级别,在该错误级别中系统中将产生调试事件并把它传递给调试器.
dwLevel:指定调试事件的最小错误调试程序,如果错误相等于或大于此程序,系统产生一个调试事件,此参数必须是下列值中的一个.
0: 不记录任何错误. SLE_ERROR:仅记录ERROR级别的调试事件.
SLE_MINORERROR:仅记录MINORERROR级别和ERROR级别的调试事件.
SLE_WARNING:记录WARNING级别,MINORERROR和ERROR级别的调试事件.
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash
