Форум: "WinAPI";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];
ВнизDebug API Найти похожие ветки
← →
Beginer © (2004-10-31 10:20) [0]Тут для меня загадка, почему
if (cont.Eip<$600000) then
Begin
ShowMessage("EIP="+inttohex(cont.eip,8));
Eip всегда показывает адресса выше 00600000, а адреса 00401000 по допустим 401050, моего приложения никогда не показываются? Хотя запускается моя тестовая программа.
Таже беда когда пишу и на asm.
var
Form1: TForm1;
sti:tstartupinfo;
lpPi:tprocessinformation;
DE:_Debug_event;
Cont:_Context;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Createprocess(nil,"c:\experement.exe",nil,nil,false,DEBUG_PROCESS or DEBUG_ONLY_THIS_PROCESS,nil,nil,Sti,lpPi);
While true do
begin
WaitForDebugEvent(de,INFINITE);
application.ProcessMessages;
if de.dwDebugEventCode=EXCEPTION_DEBUG_EVENT then
if DE.Exception.ExceptionRecord.ExceptionCode=EXCEPTION_BREAKPOINT then
begin
cont.ContextFlags:=CONTEXT_CONTROL;
GetThreadContext(lppi.hThread,cont);
cont.EFlags:=cont.EFlags or $100;
setThreadContext(lppi.hThread,cont);
ContinueDebugEvent(lppi.dwProcessId, lppi.dwThreadId,DBG_CONTINUE);
end
else
if DE.Exception.ExceptionRecord.ExceptionCode=EXCEPTION_SINGLE_STEP then
begin
GetThreadContext(lppi.hThread,cont);
cont.EFlags:=cont.EFlags or $100;
setThreadContext (lppi.hThread ,cont);
if (cont.Eip<$600000) then
Begin
ShowMessage("EIP="+inttohex(cont.eip,8));
//halt;
end;
ContinueDebugEvent(lppi.dwProcessId,lppi.dwThreadId,DBG_CONTINUE);
end;
ContinueDebugEvent(lppi.dwProcessId,lppi.dwThreadId,DBG_CONTINUE);
if de.dwDebugEventCode=EXIT_PROCESS_DEBUG_EVENT then
begin
CloseHandle (lppi.hProcess);
CloseHandle (lppi.hThread);
halt;
end;
end;
end;
end.
← →
Ученик (2004-10-31 10:55) [1]Очень похоже, но там такого кода нет :-)
http://spiff.tripnet.se/~iczelion/tut30.html
← →
Beginer © (2004-10-31 11:36) [2]Верно. Читал я эти туторы, читал. Третий тутор, где подсщитывавется число выплненых инструкций в отлаживаемой программе. Ухх, как я торопился набирать этот код, чтоб посмоттерь, действительно ли сие возможно! :)) и что? Этот пример с 3-го тотора iczelionа насщитал в моей проге из 4 команд аж 50000 инструкций. Я начал смотеть что и как, начал его модифицировать..и увидел что context.RegEip ссылается на кучу какихто левых адресов и инструкций, к моему процесу не имеющих отношения. Да верно в этом случае будет 50000 инструкций. Может это загрузщик Win ? или еще какие системные библиотеки??
привожу код на asm
invoke GetOpenFileName, ADDR ofn
invoke GetStartupInfo, addr startinfo
invoke CreateProcess, addr buffer, NULL, NULL, NULL, FALSE, DEBUG_PROCESS+ \
DEBUG_ONLY_THIS_PROCESS, NULL,NULL, addr startinfo, addr pi
.while TRUE
invoke WaitForDebugEvent,addr DBEvent, INFINITE
.if DBEvent.dwDebugEventCode==EXIT_PROCESS_DEBUG_EVENT
invoke MessageBox,0,addr ProcessExit,0,MB_OK
;invoke wsprintf, addr buffer, addr ExitProc,TotalInstruction
;invoke MessageBox,0,addr buffer, addr AppName, MB_OK+MB_ICONINFORMATION
.break
.elseif DBEvent.dwDebugEventCode==EXCEPTION_DEBUG_EVENT
.if DBEvent.u.Exception.pExceptionRecord.ExceptionCode==EXCEPTION_BREAKPOINT
mov context.ContextFlags, CONTEXT_CONTROL
invoke GetThreadContext,pi.hThread,addr context
or context.regFlag,100h
invoke SetThreadContext,pi.hThread,addr context
invoke ContinueDebugEvent,DBEvent.dwProcessId,DBEvent.dwThreadId,DBG_CONTINUE
.continue
.elseif DBEvent.u.Exception.pExceptionRecord.ExceptionCode==EXCEPTION_SINGLE_STEP
invoke GetThreadContext,pi.hThread, addr context
.if context.regEip<00700000h
invoke wsprintf, addr buffer, addr ProcessInfo, context.regEip
invoke MessageBox,0, addr buffer, addr AppName,MB_OK+MB_ICONINFORMATION
.endif
or context.regFlag,100h
invoke SetThreadContext,pi.hThread, addr context
.endif
.endif
invoke ContinueDebugEvent,DBEvent.dwProcessId,DBEvent.dwThreadId,DBG_CONTINUE
.endw
invoke CloseHandle,pi.hProcess
invoke CloseHandle,pi.hThread
invoke ExitProcess,0
т.е. if context.regEip<00700000h никогда не выполнится, хотя моя прога ничинается с 00401000 по 00401000. И запускается она.
Что делать что делать.
← →
Vladimir Vorfolomeev © (2004-11-01 00:05) [3]Так устроен Delphi, при сборки приложения все в разных местах. Посмотри в дизассемблере(например в IDA), и все поимеш.
← →
Beginer © (2004-11-01 10:05) [4]Я и в отладчике могу посмотреть. Нефига я не помнимаю. На ассембреле, листинг который я тут привел, тот же результат. Eip выше 00700000. Он указывает на загружзчик моей программы. А как обойти,так чтоб он реально показывал на мою программу, не зню. И взять тот же тутариал от http://spiff.tripnet.se/~iczelion/tut30.html он фактически неверен, так как тоже поддсщитывает количество команд вместе с загрузчиком.
← →
Ученик (2004-11-02 00:29) [5]Нескромный вопрос :-), под этим отладчиком приложение вообще работает ?
Возможно, для необработанных Exception-ов необходимо использовать DBG_EXCEPTION_NOT_HANDLED вместо DBG_CONTINUE
← →
VMcL © (2004-11-02 07:47) [6]>>Ученик (02.11.04 00:29) [5]
>Возможно, для необработанных Exception-ов необходимо использовать DBG_EXCEPTION_NOT_HANDLED вместо DBG_CONTINUE
Для EXCEPTION_BREAKPOINT, EXCEPTION_SINGLE_STEP? Зачем?
← →
Beginer © (2004-11-02 09:02) [7]Работает под отладчиком. Под OlyDBG пробывал. DBG_EXCEPTION_NOT_HANDLED пробывал. Вообще в оригенале так и есть. Но что и с DBG_EXCEPTION_NOT_HANDLED что и DBG_CONTINUE результат одинаков. Удалось выяснить Reg.Eip показыввает у меня адреса загрузки ntdll.dll, kernel32.dll, user32.dll. Третий урок http://spiff.tripnet.se/~iczelion/tut30.html который должен вести подсщет инструкций твоей программы скороей всего и этих модулей подсщитывает, пэтому оказывается что в моей 4-х строчной программе 75536 строк.
>Для EXCEPTION_BREAKPOINT, EXCEPTION_SINGLE_STEP? Зачем? Без EXCEPTION_SINGLE_STEP приложение отработает один раз и допустим выдаст мне только один раз конечный результат Reg.Eip,я уже пробывал, была моя модификация 2 - го урока от http://spiff.tripnet.se/~iczelion/tut30.html, а EXCEPTION_SINGLE_STEP заставляет крутиться в цикле и выдавать от первого Reg.Eip до последнего.
Кто нибудь пробывал http://xtin.km.ru/view.shtml?id=7 Примитивный трейсер. Получилось?
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.035 c