AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Speicher Adresse überwachen?

Ein Thema von 4dk2 · begonnen am 8. Apr 2016 · letzter Beitrag vom 11. Apr 2016
Antwort Antwort
Seite 1 von 2  1 2      
4dk2

Registriert seit: 4. Sep 2007
176 Beiträge
 
#1

Speicher Adresse überwachen?

  Alt 8. Apr 2016, 11:36
Delphi-Version: 5
Hallo,
ist es evtl. möglich die Speicheradresse bei dem folgenden Beispiel die Schreibzugriffe oder vielleicht sogar Lesezugriffe zu überwachen?
Ohne Wert auf die dadurch sinkende Performance zu legen

Klar ich kann mir den Wert merken und an geeigneter Stelle vergleichen, aber geht das auch anders?

Ich denke mal mit den Delphi Boardmitteln geht es nicht. aber vielleicht mit FastMM und Co?

Delphi-Quellcode:
var
  Form1: TForm1;
  IntWert1:integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i1,i2:integer;
    p:PInteger;
begin
  //init:
  IntWert1:=100;

  p:=@IntWert1;

  //ab hier die Adresse überwachen?
  p^:= 123456;
  IntWert1 := 654321;
  
  i1:=p^;
  i2:=IntWert1;

end;

wünsche euch eine schönes Wochenende
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: Speicher Adresse überwachen?

  Alt 8. Apr 2016, 11:54
Debugger > Bei Google suchenDatenhaltepunkt
Ob das auch auf Lesen reagiert ... k.A.

PS: F5 = Codehaltepunkt




Oder MSDN-Library durchsuchenVirtualProtect und dann auf die Exception reagieren.
$2B or not $2B

Geändert von himitsu ( 8. Apr 2016 um 11:59 Uhr)
  Mit Zitat antworten Zitat
4dk2

Registriert seit: 4. Sep 2007
176 Beiträge
 
#3

AW: Speicher Adresse überwachen?

  Alt 8. Apr 2016, 12:00
, ne ich das Programm. Im Programm darauf reagieren.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Speicher Adresse überwachen?

  Alt 8. Apr 2016, 13:04
Was er mit VirtualProtect meint ist, dass du das PAGE_GUARD übergeben kannst.
Dadurch wird eine Exception ausgelöst sobald jmd auf die Page zugreift. Problem ist allerdings dass du damit mehr als nur eine Variable überwachst sondern eben direkt die ganze Page (meistens 4KB).

Ansonsten gibt es soweit ich weiß keine Möglichkeit sowas festzustellen.
Hatte auch mal danach gesucht, aber nichts gefunden.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

AW: Speicher Adresse überwachen?

  Alt 8. Apr 2016, 13:23
Also der Ansatz über die Exceptions ist schonmal richtig. Fangen kannst du diese am besten, indem du einen eigenen Top-Level Exception-Handler mit MSDN-Library durchsuchenAddVectoredExceptionHandler registrierst.

PAGE_GUARD ist allerdings denkbar ungünstig (EXTREM unperformant), weil es halt die komplette Page betrifft.

Als Alternative kannst du im betroffenen (oder allen) Thread mit MSDN-Library durchsuchenSetThreadContext die Debug Register entsprechend setzen, um einen "Hardware Breakpoint" zu aktivieren. Diese Hardware Breakpoints können je nach Wunsch durch Read, Write oder Execute getriggert werden. Nachteile gibt es allerdings auch: Du kannst maximal 4 HWBPs pro Thread setzen und die "Länge" des Breakpoints erstreckt sich nur bis maximal 4 Byte (evtl. 8 Byte unter 64-Bit, da bin ich mir grade nicht mehr sicher).
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Speicher Adresse überwachen?

  Alt 8. Apr 2016, 13:38
Eine Variable überwachen macht man idR nicht. Wenn hat man eine Eigenschaft und wenn sich diese ändert feuert man einen Event.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
4dk2

Registriert seit: 4. Sep 2007
176 Beiträge
 
#7

AW: Speicher Adresse überwachen?

  Alt 11. Apr 2016, 13:12
Eine Variable überwachen macht man idR nicht. Wenn hat man eine Eigenschaft und wenn sich diese ändert feuert man einen Event.
ja ich weiss. Es geht bei mir aber um Variablen von komplexen Berechnungen. Die werden u.a. auch unterschiedlichst über var Parameter in Funktionen benutzt. Daher fallen property von klassen
leider weg.
Und wenn ihr sagt ist VirtualProtect 4k nutzt, denke ich, dass das auch nicht das optimal ist, da es sich um ca 300 variablen handelt.

Mein Ansatz bisher ist, alle Pointer,werte, typen und Bezeichnungen der Variablen in einem Verwalter abzulegen, und nach den Berechnungen alle durchzugehen und zu vergleichen welche verändert worden sind.
Ich wollte nur mal Interesse halber hören ob es nicht vielleicht eine Möglichkeit gibt, Die Pointer zu überwachen
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Speicher Adresse überwachen?

  Alt 11. Apr 2016, 13:23
Dann wirst du dein Konzept wohl überdenken müssen.

Es gibt da so einige Möglichkeiten (Records, Interfaces, ...). Mit einem konkreten Beispiel können wir dir auch eine konkrete Lösung anbieten
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Speicher Adresse überwachen?

  Alt 11. Apr 2016, 13:31
Hallo,

< Die werden u.a. auch unterschiedlichst über var Parameter in Funktionen benutzt >

Dann ändere das halt ab.
Definiere dir eine Datenklarr, wo alle Variablen Properties sind und nutze diese eine Datenklasse statt deiner var-Parameter.

Zur Not nutzt du eine globale Variable für deine Datenklasse (jaja, macht man nicht ...).
Benenne die Properties alle mit einem _ vor dem eigentlichen Namen,
also Name -> _Name.

Das sollte der Compiler alles sehr schnell finden.


Heiko
Heiko
  Mit Zitat antworten Zitat
4dk2

Registriert seit: 4. Sep 2007
176 Beiträge
 
#10

AW: Speicher Adresse überwachen?

  Alt 11. Apr 2016, 13:57
Ok, ich probier mal, das ist alles pseudo code, daher ist die Sinnhaftigkeit von den Variable Zuweisungen erstmal irrelevant.
Delphi-Quellcode:
type TTest=class
  private
    FA: double;
    FC: double;
    FB: double;
    procedure SetA(const Value: double);
    procedure SetB(const Value: double);
    procedure SetC(const Value: double);
  public
    property A:double read FA write SetA;
    property B:double read FB write SetB;
    property C:double read FC write SetC;

end;

var
  test:TTest;
  x,y,z,a,b,c {usw....}:double;


procedure init;
procedure calc;
procedure calc_help1(var a1,b1,c1);

implementation

procedure init;
begin
  //laden...
  x:=0;
  y:=1.5;
  z:=2.5;
  a:=0;
  b:=0;
  c:=0;
  //...

  //test per klasse:
  test:=TTest.create;
  test.A:=100;


end;

procedure calc;
var b2:double;
begin
  a:=100;
  calc_help1(a,b2,c);

  //das geht logischerweise nicht per klasse:
  //[Fehler] : Konstantenobjekt kann nicht als Var-Parameter weitergegeben werden
  with test do
    calc_help1(a,b,c);

end;

procedure calc_help1(var a1,b1,c1);
begin


  if a>100 then
  begin
    a1 := a1 - c1;
    b1 := c1 + a1;
  end;

  if a>200 then
  begin
    a1 := b1 - c1;
    b1 := c1 + a1;
  end;
end;

procedure calc_help2(var b1,c1);
begin
  //ich hab auch Funktionen die sich and den globalen variablen bedienen und ergebnisse liefern...
  b1 := a + c;
  c1 := 12345;
end;


{$R *.dfm}

{ TTest }

procedure TTest.SetA(const Value: double);
begin
  FA := Value;
end;

procedure TTest.SetB(const Value: double);
begin
  FB := Value;
end;

procedure TTest.SetC(const Value: double);
begin
  FC := Value;
end;
Ich würd es gerne per OOP regeln, aber ich kann nicht die paar tausend zeilen von den Berechnungen dafür umbauen.

und zu @hoika, ich kann leider die var parameter nicht entfernen. Das sind Funktionen wie calc_help1, die z.b. Geometrische Daten berechnen, und von überall aufgerufen werden können, mit unterschiedlichen parametern und mehrere Werte zurückliefern (bzw. können).
Gut ich könnte die nen Record zurückgeben lassen, aber dann müsste ich jeweils an dem Aufruf die Variabeln setzten.
Ich möchte aber solche intensiven Kode-Änerungen vermeiden.
Dann gibt es auch noch funktionen wie calc_help2, die auch noch teile von den Globalen Variablen nutzen und Ergebnisse liefern.
Mit einem with test do begin {...} end; könnte ich ja noch leben
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:53 Uhr.
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