Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.19;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2004.12.19;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.023 c
14-1101561274
DelphiN!
2004-11-27 16:14
2004.12.19
Плагин для 1С для удаленного просмотра отчетов (через модем)


1-1101820723
Начинающий2
2004-11-30 16:18
2004.12.19
PopupMenu в пограмме без формы.


1-1102089486
Игорь нтк
2004-12-03 18:58
2004.12.19
Combobox


8-1096054658
Yegorchic
2004-09-24 23:37
2004.12.19
.3ds to .x


1-1102081229
Muhan
2004-12-03 16:40
2004.12.19
Можно ли в Stringgrid вставить картинку?