AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Schreibzugriffe auf Speicheradresse überwachen?

Schreibzugriffe auf Speicheradresse überwachen?

Ein Thema von uligerhardt · begonnen am 1. Apr 2014 · letzter Beitrag vom 1. Apr 2014
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.690 Beiträge
 
Delphi 2007 Professional
 
#1

Schreibzugriffe auf Speicheradresse überwachen?

  Alt 1. Apr 2014, 08:14
Hallo zusammen!

In einem unserer Programme wird gelegentlich bei manchen Kunden offenbar eine Variable überschrieben (möglicherweise durch einen fehlerhaften Move- oder FillChar-Aufruf). Wenn der Fehler auch auf den Entwicklerrechnern auftreten würde, würde ich einen Datenhaltepunkt auf die Variable setzen. Gibt es so etwas Ähnliches auch zum Ausliefern?
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.328 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: Schreibzugriffe auf Speicheradresse überwachen?

  Alt 1. Apr 2014, 08:20
FastMM und Eurekalog bieten so etwas. Allerdings kannst Du das nicht ausliefern, da die Performance natürlich in die Knie geht. Praktisch wird das so realisiert, dass die Speicherbereiche mit bestimmten Bitmustern gefüllt werden und bei jedem Lese- und Schreibvorgang verglichen. Normalerweise findet man aber beim Test diese Fehler ganz schnell. Ich würde Dir einen Testlauf mit FastMM und FullDebugMode empfehlen.

Mit dem Haltepunkt findest Du Fehler auch nur zufällig, denn je nach Speichersituation erfolgt ein Schreiben bei einem Buffer overrun an eine ganz andere Stelle. Mal ist es, ganz auffällig, eine auch für den Kunden direkt ersichtliche Auswirkung. Es kann aber auch gerne ein Datenbankpuffer sein oder was anderes Nettes. Du hast dort eine tickende Zeitbombe die unbedingt zu entschärfen ist.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.690 Beiträge
 
Delphi 2007 Professional
 
#3

AW: Schreibzugriffe auf Speicheradresse überwachen?

  Alt 1. Apr 2014, 08:42
FastMM und Eurekalog bieten so etwas. Allerdings kannst Du das nicht ausliefern, da die Performance natürlich in die Knie geht.
Das wird auch nur eine temporäre Spezialversion.

Praktisch wird das so realisiert, dass die Speicherbereiche mit bestimmten Bitmustern gefüllt werden und bei jedem Lese- und Schreibvorgang verglichen. Normalerweise findet man aber beim Test diese Fehler ganz schnell. Ich würde Dir einen Testlauf mit FastMM und FullDebugMode empfehlen.
Wie kann ich die Prüfung denn aktivieren und möglichst auf Schreibzugriffe auf diese eine Variable eingrenzen?

Mit dem Haltepunkt findest Du Fehler auch nur zufällig, denn je nach Speichersituation erfolgt ein Schreiben bei einem Buffer overrun an eine ganz andere Stelle. Mal ist es, ganz auffällig, eine auch für den Kunden direkt ersichtliche Auswirkung. Es kann aber auch gerne ein Datenbankpuffer sein oder was anderes Nettes.
Der Fehler kommt dort, wo er überhaupt kommt, recht "zuverlässig".

Du hast dort eine tickende Zeitbombe die unbedingt zu entschärfen ist.
Drum frag ich ja.
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.328 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: Schreibzugriffe auf Speicheradresse überwachen?

  Alt 1. Apr 2014, 09:29
Du mußt FastMM4.pas als erste in der .dpr einbinden und im Pfad oder bei der exe die FastMM_FullDebugMode.dll bereitstellen. Dann noch {$define FullDebugMode} in der FastMMOptions.inc aktivieren.

Dann machst Du einen neuen Build und gehst die verdächtigen Teile des Programms durch. Beim Beenden wird Dir ein ausführlicher LeakReport mit Adressen, Stacktrace etc. angezeigt und als Datei gespeichert.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

AW: Schreibzugriffe auf Speicheradresse überwachen?

  Alt 1. Apr 2014, 09:54
Um ein Leak sollte es sich ja hier aber eher nicht handeln, eher um einen Heap Overflow. Probier mal GFlags:
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

Damit bin ich vor geraumer Zeit mal ziemlich erfolgreich einer (vorher) nicht zu findenden Heap Corruption auf die Schliche gekommen.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.690 Beiträge
 
Delphi 2007 Professional
 
#6

AW: Schreibzugriffe auf Speicheradresse überwachen?

  Alt 1. Apr 2014, 09:57
Irgendwie raff ich's nicht. Ich hab mal ein Testprojektchen gestrickt:
Delphi-Quellcode:
program OverwriteTest;

uses
  FastMM4,
  Forms,
  Unit1 in 'Unit1.pas{Form1};

{$R *.res}

begin
  ReportMemoryLeaksOnShutdown := True;
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows,
  Messages,
  SysUtils,
  Variants,
  Classes,
  Graphics,
  Controls,
  Forms,
  Dialogs,
  ExtCtrls,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    procedure Log(const AMessage: string);
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
  Start: Integer;
  Victim: Integer;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Log('before');
  FillChar(Start, 2 * SizeOf(Start), 0);
  Log('after');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Start := 123;
  Victim := 456;
  Log('ctor');
end;

procedure TForm1.Log(const AMessage: string);
begin
  OutputDebugString(PChar(AMessage + ': ' + IntToStr(Start) + '/' + IntToStr(Victim)));
end;

end.
Wenn jetzt der Benutzer auf Button1 klickt, hätte ich gerne die Info, dass der FillChar-Aufruf im Speicherbereich von Victim rumgeschrieben hat.
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.690 Beiträge
 
Delphi 2007 Professional
 
#7

AW: Schreibzugriffe auf Speicheradresse überwachen?

  Alt 1. Apr 2014, 12:59
Um ein Leak sollte es sich ja hier aber eher nicht handeln, eher um einen Heap Overflow.
Nicht mal Heap, sondern eine ganz banale globale Variable.

Probier mal GFlags:
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

Damit bin ich vor geraumer Zeit mal ziemlich erfolgreich einer (vorher) nicht zu findenden Heap Corruption auf die Schliche gekommen.
Ich hab mir das mal durchgelesen. Soweit ich das verstehe, funktioniert das auch nur für Speicher auf dem Heap, oder?
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

AW: Schreibzugriffe auf Speicheradresse überwachen?

  Alt 1. Apr 2014, 13:11
Ich hab mir das mal durchgelesen. Soweit ich das verstehe, funktioniert das auch nur für Speicher auf dem Heap, oder?
Kanns dir nicht genau sagen, aber ist sicher nen Versuch wert. Ich weiß nicht, wie Delphi mit primitiven Datentypen umgeht, aber zumindest Objekte sind auf jeden Fall Heap allocated. Würde dir auf jeden Fall mal den "Full" Mode empfehlen, bei dem das Tool die Pages mit PAGE_GUARD protected.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl ( 1. Apr 2014 um 13:14 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.368 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Schreibzugriffe auf Speicheradresse überwachen?

  Alt 1. Apr 2014, 13:15
Soweit ich das verstehe, funktioniert das auch nur für Speicher auf dem Heap, oder?
Der Stack liegt am Ende auch nur irgendwo im Heap.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.328 Beiträge
 
Delphi 7 Enterprise
 
#10

AW: Schreibzugriffe auf Speicheradresse überwachen?

  Alt 1. Apr 2014, 13:20
Das Problem bei dem Test ist, dass FillChar verwendet wird. Und dort verwendet wohl auch FastMM die Routine aus system.pas so dass kein Monitoring möglich ist.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 +2. Es ist jetzt 13:29 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf