AGB  ·  Datenschutz  ·  Impressum  







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

Alt -> Stacküberlauf

Ein Thema von blablab · begonnen am 1. Jul 2010 · letzter Beitrag vom 3. Aug 2010
Antwort Antwort
Seite 1 von 2  1 2      
blablab

Registriert seit: 3. Jan 2006
509 Beiträge
 
Delphi 7 Enterprise
 
#1

Alt -> Stacküberlauf

  Alt 1. Jul 2010, 11:44
Hallo!

Ich habe einen wirklich merkwürdigen Fehler. Ich hab eine Komponente programmiert und wenn ich diese in ein Projekt mache und "Alt" drücke, dann gibt es einen Stack-Überlauf. Dabei muss meine Komponente nicht einmal den Fokus haben. Wenn man zum Beispiel gerade in einem Memo arbeitet und zufällig Alt drückt, stürzt das Programm ab.
Um den Fehler zu suchen hab ich in allen von mir programmierten Methoden Haltepunkte gesetzt, allerdings wird beim Stacküberlauf keine von denen aufgerufen. Deshalb steh ich jetzt aufm Schlauch und weiß nicht wo ich suchen soll.

Ich erwarte von euch keine Wunder, aber weiß jemand wo ich suchen könnte, hatte jemand schon ein ähnliches Problem oder habt ihr irgendwelche anderen Ideen???

Würde mich echt freuen

Grüße
blablab
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#2

AW: Alt -> Stacküberlauf

  Alt 1. Jul 2010, 11:53
Irgendeine falsche Rekursion (Funktion ruft sich immer wieder selbst auf) in einem MainMenu-Eintrag drin, sobald der ausgewählt wird?
Stack Overflow passiert gewöhnlich meist dann, wenn sich eine Funktion immer wieder selbst aufruft.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

AW: Alt -> Stacküberlauf

  Alt 1. Jul 2010, 11:54
Was zeigt denn der Stackcall an? Und welche Delphiversion hast du? Ich kann mich dunkel daran erinnern das dies ein Bug war/ist der sich glaub ich im Mainmenü verstekct hat.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
blablab

Registriert seit: 3. Jan 2006
509 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: Alt -> Stacküberlauf

  Alt 1. Jul 2010, 12:24
Ich benutze Delphi7. Ein MainMenu hab ich im Projekt nicht. Der Fehler tritt auch auf wenn ich ein leeres Projekt nur mit meiner Komponente habe.

Ich hab jetzt rausgefunden welche Methode sich immer wieder selbst aufruft:

Delphi-Quellcode:
procedure TWinControl.WMSysCommand(var Message: TWMSysCommand);
var
  Form: TCustomForm;

  function TraverseControls(Container: TWinControl): Boolean;
  var
    I: Integer;
    Control: TControl;
  begin
    Result := False;
    if Container.Showing then
      for I := 0 to Container.ControlCount - 1 do
      begin
        Control := Container.Controls[I];
        if Control.Visible and Control.Enabled then
        begin
          if (csMenuEvents in Control.ControlStyle) and
            (Control.Perform(WM_SYSCOMMAND, TMessage(Message).WParam,
              TMessage(Message).LParam) <> 0) or (Control is TWinControl) and
            TraverseControls(TWinControl(Control)) then
          begin
            Result := True;
            Exit;
          end;
        end;
      end;
  end;

begin
  with Message do
  begin
    if (CmdType and $FFF0 = SC_KEYMENU) and (Key <> VK_SPACE) and
      (Key <> Word('-')) and not IsIconic(FHandle) and (GetCapture = 0) and
      (Application.MainForm <> Self) then
    begin
      Form := GetParentForm(Self);
{y}   if (Form <> nil) and (Form.Perform(CM_APPSYSCOMMAND, 0, Longint(@Message)) <> 0) then
        Exit;
    end;
    { Broadcast WMSysCommand to all controls which have a csMenuEvents style. }
{x}   if (CmdType and $FFF0 = SC_KEYMENU) and TraverseControls(Self) then
      Exit;
  end;
  inherited;
end;
Es wechselt immer wieder zwischen Zeile {x} und {y} hin und her bis zum Stacküberlauf.

P.S. Stackcall???
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Alt -> Stacküberlauf

  Alt 1. Jul 2010, 12:29
Irgendeine falsche Rekursion ...
Nein, nicht nur.
Ein Stacküberlauf kommt, wenn der Speicher dafür ausgeht.
Praktisch das OutOfMemory des Stacks.

Der Stack wird z.B. durch lokale Variaben, Funktionsaufrufe (Rücksprungadresse) und Dergleichen gefüllt.

also:
- zuviele rekursive Funktionsaufrufe
und/oder
- zu viele/große lokale Variablen (welche im Stack liegen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
blablab

Registriert seit: 3. Jan 2006
509 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: Alt -> Stacküberlauf

  Alt 1. Jul 2010, 12:34
Er ruft sich hier immer wieder (indirekt) selbst auf, bei jedem aufruf speichert er sich ein paar lokale Variablen im Stack und irgendwann ist der Stack voll...

Delphi-Quellcode:
procedure TWinControl.WMSysCommand(var Message: TWMSysCommand);
var
  Form: TCustomForm;

  function TraverseControls(Container: TWinControl): Boolean;
  var
    I: Integer;
    Control: TControl;
  begin
{3} Result := False;
    if Container.Showing then
      for I := 0 to Container.ControlCount - 1 do
      begin
        Control := Container.Controls[I];
        if Control.Visible and Control.Enabled then
        begin
          if (csMenuEvents in Control.ControlStyle) and
{4}         (Control.Perform(WM_SYSCOMMAND, TMessage(Message).WParam,
              TMessage(Message).LParam) <> 0) or (Control is TWinControl) and
            TraverseControls(TWinControl(Control)) then
          begin
            Result := True;
            Exit;
          end;
        end;
      end;
  end;

begin
  with Message do
  begin
{1}{5}if (CmdType and $FFF0 = SC_KEYMENU) and (Key <> VK_SPACE) and
      (Key <> Word('-')) and not IsIconic(FHandle) and (GetCapture = 0) and
      (Application.MainForm <> Self) then
    begin
      Form := GetParentForm(Self);
      if (Form <> nil) and
{6}     (Form.Perform(CM_APPSYSCOMMAND, 0, Longint(@Message)) <> 0) then
        Exit;
    end;
    { Broadcast WMSysCommand to all controls which have a csMenuEvents style. }
{2} if (CmdType and $FFF0 = SC_KEYMENU) and TraverseControls(Self) then
      Exit;
  end;
  inherited;
end;

procedure TCustomForm.CMAppSysCommand(var Message: TMessage);
type
  PWMSysCommand = ^TWMSysCommand;
begin
  Message.Result := 0;
  if (csDesigning in ComponentState) or (FormStyle = fsMDIChild) or
   (Menu = nil) or Menu.AutoMerge then
    with PWMSysCommand(Message.lParam)^ do
    begin
      SendCancelMode(nil);
{7}   if SendAppMessage(CM_APPSYSCOMMAND, CmdType, Key) <> 0 then
        Message.Result := 1;;
    end;
end;

procedure TApplication.WndProc(var Message: TMessage);
...
begin
...
    with Message do
      case Msg of
...
        CM_APPSYSCOMMAND:
          if MainForm <> nil then
            with MainForm do
              if (Handle <> 0) and IsWindowEnabled(Handle) and
                IsWindowVisible(Handle) then
              begin
                FocusMessages := False;
                SaveFocus := GetFocus;
                Windows.SetFocus(Handle);
{8}             Perform(WM_SYSCOMMAND, WParam, LParam);
                Windows.SetFocus(SaveFocus);
                FocusMessages := True;
                Result := 1;
              end;
...
end;
Es geht immer {1}...{8}{1}...{8}{1}...

Jetzt muss ich nurnoch verstehen was er da macht und was ich falsch gemacht habe...

Geändert von blablab ( 1. Jul 2010 um 12:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Alt -> Stacküberlauf

  Alt 1. Jul 2010, 12:40
Wo kommt denn der Post plötzlich her

Du sendest WM_SYSCOMMAND und CM_APPSYSCOMMAND innerhalb der Funktion (WMSysCommand), welche diese Nachrichten auch verarbeitet ... endlosschleife

Kennst du den PingPong-Witz?
Scheibe links an die Klowand "Magst du Tennis, dann schau nach rechts"
und rechts kommt "Magst du Tennis, dann schau nach links" dran.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
blablab

Registriert seit: 3. Jan 2006
509 Beiträge
 
Delphi 7 Enterprise
 
#8

AW: Alt -> Stacküberlauf

  Alt 1. Jul 2010, 12:49
Das ist ja nicht von mir, das ist ja der Delphi-Code...


Ich könnte versuchen [csMenuEvents] aus dem ControlStyle meiner Komponente herauszunehmen. In der Hilfe steht dazu "Das Steuerelement reagiert auf Befehle des Steuerungsmenüs." Was bedeutet das???

Geändert von blablab ( 1. Jul 2010 um 12:56 Uhr)
  Mit Zitat antworten Zitat
blablab

Registriert seit: 3. Jan 2006
509 Beiträge
 
Delphi 7 Enterprise
 
#9

AW: Alt -> Stacküberlauf

  Alt 1. Jul 2010, 13:16
Ich hab jetzt [csMenuEvents] aus dem ControlStyle meiner Komponente herausgenommen. Dadurch gibts kein Stack-Überlauf mehr da Schritt {4} nicht mehr aufgerufen wird. Eigentlich änder ich ja nicht so gern einfach iwelche Eigenschaften ohne es wirklich zu verstehn was ich da mache. Aber dadurch geht der Fehler weg und anscheinend gehen keine Funktionen meiner Komponente verloren. Also was soll's

Danke für eure Hilfe!
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#10

AW: Alt -> Stacküberlauf

  Alt 1. Jul 2010, 13:42
Zitat:
Eigentlich änder ich ja nicht so gern einfach iwelche Eigenschaften ohne es wirklich zu verstehn was ich da mache. Aber dadurch geht der Fehler weg und anscheinend gehen keine Funktionen meiner Komponente verloren
Das würde mir aber trotzdem zu Denken geben bzw. zumindest ein ganz übles Bauchgefühl hinterlassen, wenn so ein Programm dann irgendwann mal an einen Kunden ausgeliefert werden soll...
  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 09:57 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