Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Debugging! nur wie? (https://www.delphipraxis.net/60774-debugging-nur-wie.html)

MCQ 12. Jan 2006 01:39


Debugging! nur wie?
 
hallo!

ich möchte mit createprocess einen prozess zum debuggen laden. dann möchte ich einen breakpoint auf eine bestimmte adresse setzten und den prozess starten, bis der prozess am breakpoint anhält. dann möchte ich den prozess weiterlaufen lassen und den breakpoint entfernen.

dazu habe ich ein wenig mit der funktion createprocess rumgespielt und den flag DEBUG_PROCESS gesetzt.
frage: wie kann ich jetzt breakpoints in dem prozess setzen, den prozess anhalten bzw. weiterlaufen lassen?

danke!

chaosben 12. Jan 2006 05:11

Re: Debugging! nur wie?
 
Hmmm ... ich versteh nicht ganz worauf du hinaus willst und ich denke wir werden an einander vorbeireden, aber sieh dir mal diese Funktionen an:
MSDN-Library durchsuchenDebugActiveProcess
MSDN-Library durchsuchenWaitForDebugEvent
MSDN-Library durchsuchenDebugBreak
MSDN-Library durchsuchenContinueDebugEvent

MCQ 12. Jan 2006 06:56

Re: Debugging! nur wie?
 
Naja, im Prinzip hast du mich schon richtig verstanden. Ich habe einen Prozess im Debug-Mode gestartet und frag mich nun, wie lass ich diesen Prozess erstmal laufen?

chaosben 12. Jan 2006 07:50

Re: Debugging! nur wie?
 
Hat dein Prozes denn irgendwo einen Aufruf der Funktion "DebugBreak"?
Ich glaube, das ist die mindeste Voraussetzung fürs Debugging mit Windows-Mitteln.

MCQ 12. Jan 2006 07:55

Re: Debugging! nur wie?
 
Nö, bisher hab ich nur folgenden Befehl drin ^^

Delphi-Quellcode:
if not CreateProcess(Nil, PChar(Programm), Nil, Nil, False,DEBUG_PROCESS + DEBUG_ONLY_THIS_PROCESS+PROCESS_ALL_ACCESS, Nil, PChar(ACurrentDir), si, pi) then showmessage(SysErrorMessage(GetLastError()));
Der Prozess startet, hält aber sofort an ... oder es sieht zumindest so aus ... Wie gesgt, ich hab bisher noch kein Plan vom Bereich Debugger-Programmierung, versuch mich noch einzuarbeiten.

chaosben 12. Jan 2006 07:57

Re: Debugging! nur wie?
 
Iss ja richtig ... aber in dem Prozess den du startest, muss doch eine Art "Breakpoint" sein.

MaBuSE 12. Jan 2006 09:27

Re: Debugging! nur wie?
 
Zitat:

Zitat von MCQ
ich möchte mit createprocess einen prozess zum debuggen laden. dann möchte ich einen breakpoint auf eine bestimmte adresse setzten und den prozess starten, bis der prozess am breakpoint anhält. dann möchte ich den prozess weiterlaufen lassen und den breakpoint entfernen.

Der Prozess, den Du starten möchtest, ist das auch ein Delphi Programm ?

Wenn ja, ist das supereinfach.

Das zu Debuggende Programm in Delphi laden (darf auch eine Dll oder was Anderes sein ).
Im Menü "Start -> Parameter..." kannst du eine Host-Anwendung definieren.
Wenn Du nun in Deinem Delphi Programm einen Breakpoint setzt. und auf Start (F9) drückst, startet nicht Dein Programm, sondern die Hostanwendung. Und wenn die Hostanwendung Dein Programm startet, ist der Delphi Debugger aktiv. Alle Breakpoints und sonstige Funktionalitäten funktionieren.
Das ist übrigens auch der Weg um eine Dll Datei zu debuggen. ;-)

Alternativ kannst du auch mit Menü "Start -> Mit Prozess verbinden..." Dich direkt den laufenden Prozess debuggen. Das muß dann auch kein Delphi Programm sein. Du hast aber dann nur das CPU Fenster.

Allgemein zum Thema Debuggen in Delphi gibts hier in der DP ein kleines Tutorial:
Tutorial: Debugging in Delphi für Anfänger und Fortgeschr.

Vieleicht hilft Dir das ja weiter

Flocke 12. Jan 2006 10:13

Re: Debugging! nur wie?
 
Wenn du einen Breakpoint setzen willst, dann musst du den Maschinencode an der betreffenden Stelle überschreiben. Dort sollte dann eine "int 3"-Anweisung stehen. Natürlich musst du dir zum Fortfahren den alten Inhalt merken. Die "int 3"-Anweisung besteht aus einem einzigen Byte ($CC), daher kann man sie an jeder Stelle einfügen.

Die API-Befehle, die du dafür brauchst sind VirtualProtect und WriteProcessMemory. Such mal hier im Forum danach, da findest du einige Beispiele.

Also:
1. Das fremde Programm laden
2. An der betreffenden Stelle mit VirtualProtect und WriteProcessMemory in $CC platzieren
3. Auf das Debug-Ereignis warten
4. Den alten Code an der Stelle wiederherstellen
5. Das Programm weiterlaufen lassen

(wenn das das ist was du meintest)

MCQ 12. Jan 2006 11:06

Re: Debugging! nur wie?
 
Also erstmal vorweg, es soll mit Jedem Programm funktionieren.

mmmh .. ihr sagt ich muss erst einen Brakpoint setzen indem ich CC an die betreffende stelle schreibe, ABER .... Der Prozess läuft ja nicht, er wirs in den Speicher geladen und angehalten, ich muss ihn ja erstmal zum laufen bringen damit er an einem Brakpoint anhalten kann, oder versteh ich da was falsch ?


Mal noch ne Frage zwischendurch die auch zu diesem Thema gehört:
Wie verschaff ich mir die nötigen Rechte um mittels GetThreadContext die Register lesen und mittels SetThreadContext die Register schreiben zu können ?

Flocke 12. Jan 2006 13:27

Re: Debugging! nur wie?
 
Das System wartet auf deinen Aufruf von MSDN-Library durchsuchenWaitForDebugEvent. So gesehen erzeugt das System für dich den allerersten Breakpoint automatisch.

Lies dir mal diesen Artikel durch.

P.S. Mit zwei Minuten googlen findet man etliches an Dokumentation und Beispielen. Um zu verstehen wie's funktioniert muss man nur willig sein, etwas mehr als fünf Zeilen zu lesen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:34 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz