JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=52682b603bef44ce1f5d2bfd0046f5a8Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

SIGTRAP

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Jonathan_Klein
Living Legend


Alter: 36
Anmeldedatum: 17.02.2003
Beiträge: 3431
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 08.09.2008, 21:23    Titel: SIGTRAP Antworten mit Zitat

Ich habe nun schon seit einigen Tagen einen Fehler, den ich einfach nicht finden kann.
Ich benutze CodeBlocks + Mingw unter XP, und mein Spiel stürzt immer ab. Der Debugger meint:
Debugger hat Folgendes geschrieben:

Program received signal SIGTRAP, Trace/breakpoint trap.
In ntdll!DbgUiConnectToDbg () (C:\WINDOWS\system32\ntdll.dll)


CPP:
PreparedAction::PreparedAction(Character& theCharacter, Action* PrepareAction, Action* MainAction):
Action(theCharacter),
m_PrepareAction(PrepareAction),
m_MainAction(MainAction),
m_Prepared(false)
{
}

PreparedAction::~PreparedAction()
{
   delete m_PrepareAction;
   delete m_MainAction;
}

bool PreparedAction::InhMove(float Time)
{
   if(m_Prepared)
   {
      return m_MainAction->Move(Time);
   }
   else //die action muss noch vorbereitet werden
   {
      if(m_MainAction->Startable())
      {
         m_PrepareAction->Stop();
         m_Prepared=true;
         m_MainAction->Start();
         return m_MainAction->Move(Time);
      }
      else
      {
         return m_PrepareAction->Move(Time);
      }
   }
}

void PreparedAction::InhStart()
{
   if(m_Prepared)
      m_MainAction->Start();
   else
      m_PrepareAction->Start();
}

void PreparedAction::InhStop()
{
   if(m_Prepared)
      m_MainAction->Stop();
   else
      m_PrepareAction->Stop();
}

bool PreparedAction::Breakable()
{
   if(m_Prepared)
      return m_MainAction->Breakable();
   else
      return m_PrepareAction->Breakable();
}

Und so wird das PreparedAction Objekt angelegt:
CPP:
StartAction(new Action::PreparedAction(*this, new Action::Walk(*this, TheTarget),
   new Action::AttackMelee(*this, TheTarget)));

Der Fehler tritt im Destruktor auf, wenn ich m_MainAction löschen will.
So, nun habe ich aber schon zigfach überprüft, und gesucht, wo denn der Fehler liegen soll. Ich habe die Klasse daraufhin nocheinmal komplett neu geschrieben (so dass sie jetzt im oben geposteten Zustand ist), aber der Fehler kommt immernoch. Da eigentlich nicht viel daran ist, was abstürzen kann, habe ich die Klasse mal in einem anderen Kontext benutzt (ich habe einen Charakter, der nicht von meinem SzeneManager verwaltet wird, diese Aktion ausführen lassen), und dort funktionierte alles.
Wenn ich das delete auskommentiere, klappt alles, allerdings werden dadurch dann ja Memory Leaks entstehen.
Ich weiß nicht, wo der Fehler liegen soll, der Speicher muss gültig sein, da die Objekte, die gelöscht werden ja benutzt werden können und es damit keine Probleme gibt. 2 mal freigeben kommt auch nicht in Frage, da das delete ja im Destruktor ist, und die objekte per new an die Klasse übergeben werden und somit keine anderen Pointer darauf existieren.
Die 2 Unteraktionen wurden auch sonst im Programm benutzt und funktionierten immer Problemlos und wie gewünscht.

Ich vermute derzeit, dass es sich um soetwas wie undefiniertes Verhalten oder so handelt, dass ich irgendwo einen anderen Fehler habe, der dann meine Klasse an dieser seltsamen Stelle zum Absturz bringt. Da der Fehler somit überall im Programm liegen könnte, bin ich ein bisschen verzweifelt.

Es sollte doch irgendwie möglich sein, den Fehler aufzuspüren, aber ich habe keine Ahnung, was SIGTRAP mir sagen soll.
http://en.wikipedia.org/wiki/SIGTRAP
sagt mir, dass es wohl etwas exceptionähnliches ist, dass ich mir irgendetwas sagen lassen will (wovon ich nichts weiß). Bloß ist jetzt die Frage, was?

http://www.mrunix.de/forums/archive/index.php/t-35088.html
Hilft mir auch nicht viel weiter, da ich im Umfeld des Fehlers keine casts habe. Alle anderen Suchen nach SIGTRAP ergaben irgendwie nix, wo ein Hinweis auf eine Lösung wäre.
_________________
https://jonathank.de/games/


Zuletzt bearbeitet von Jonathan_Klein am 09.09.2008, 16:15, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
The Lord of Programming
Living Legend


Alter: 36
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 09.09.2008, 11:40    Titel: Antworten mit Zitat

Hmm...möglich, dass es daher im Destruktor der Klasse liegt.
Gibt auch hin und wieder undefiniertes verhalten, wenn man keinen Kopierkonstruktor definiert und das Speichermanagement der Klasse - ich nenns mal - schwierig ist.

Mit der Meldung kann ich allerdings nichts anfangen.
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 36
Anmeldedatum: 17.02.2003
Beiträge: 3431
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 09.09.2008, 16:16    Titel: Antworten mit Zitat

Ich habe nochmal alles hinzugefügt, was mir zu dem Fehler noch einfällt, aber jetzt weiß ich nicht mehr, wo ich noch suchen soll.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
FH
Super JLI'ler


Alter: 36
Anmeldedatum: 16.10.2004
Beiträge: 437

Medaillen: Keine

BeitragVerfasst am: 09.09.2008, 22:16    Titel: Antworten mit Zitat

SIGTRAP ist, so weit ich weiß, keine Exception. Es gibt unter Unix-Betriebssystem die Möglichkeit, Programmen Signale zu senden.
Und SIGTRAP ist so ein Signal. Die Programme können dann, wenn sie wollen, darauf reagieren (z.B. reagieren die meisten Programme auf SIGTERM indem sie sich beenden).

Was ich mir vorstellen kann: Eigentlich soll SIGTRAP den Debugger davon informieren, dass ein breakpoint (wie es sie auch in VC++ gibt) erreicht wurde. Normalerweise wird das Programm da ja angehalten.
Bleibt nur noch die Frage, warum er angehalten wurde.
Welchen Debugger hast du denn drauf? Wenn es der GDB ist, versuch mal das Programm im GDB-Konsolen-Modus zu starten, weil der GDB dann unter Umständen eine genauere Fehlermeldung ausspuckt (Hab da in irgendeinem Forum was von gelesen).
Gruß

FH
_________________
goto work, send your kids to school
follow fashion, act normal
walk on the pavement, watch T.V.
save for your old age, obey the law
Repeat after me: I am free
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 36
Anmeldedatum: 17.02.2003
Beiträge: 3431
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 09.09.2008, 23:12    Titel: Antworten mit Zitat

hm, ja, die Sache ist ja, dass es überhaupt keine Breakpoints gibt. Also, wenn er mir etwas sagen will, muss das ja jemand eingeschaltet haben.
Kann natürlich sein, dass der Debugger direkt alles einschaltet, aber dann sollte er mir auch sagen, was genau er entdeckt hat, und nicht nur ein SIGTRAP in irgendeiner extrem verschachtelten dll melden. (im Call Stack sind knapp 30 Funktionen, die meisten nur ????? und den Rest hab ich noch nie gehört)

Den Debugger im Konsolenmodus starten, wäre natürlich eine Möglichkeit, aml sehen ob ich das irgendwie hinkriege.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
The Lord of Programming
Living Legend


Alter: 36
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 10.09.2008, 13:41    Titel: Antworten mit Zitat

Hmm...kontrollierst du irgendwie, dass die beiden Zeiger bis zum Ende auf mit new allokierten Speicher verweisen?
Schiebst du die Instanzen der Klasse irgendwie herum? Ich bin mir nicht sicher, aber einen selbst definierten Kopierkonstruktor würde ich bei sowas mal probieren.
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 36
Anmeldedatum: 17.02.2003
Beiträge: 3431
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 10.09.2008, 17:25    Titel: Antworten mit Zitat

Ja, es gibt nur einen Zeiger auf den Speicher und der wird nie verändert und erst im Destruktor freigegeben.
Der Zeiger ist damit mit ziemlicher Sicherheit gültig.

Und Kopieren tu ich eigentlich auch nix, höchstens Pointer.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 11.09.2008, 19:51    Titel: Antworten mit Zitat

Klingt nach ner Heap Corruption die da ordentlich Spass zu haben scheint. Zeige am besten noch die definition (die deceleration kenne ich bereits).

Aber auch so ein par generelle Tips wenn du finden willst wo das Problem liegt:

- Reduziere deine Anwendung auf ein absolutes Minimum
- füge nach und nach immer mehr Teile hinzu bis du den Fehler wieder bekommst
- damit solltest du den Fehler eingrenzen können

Was mir sonst noch einfiele kann ich dir erst sagen wenn ich mehr von deinem Code kennen würde.

Ach hier noch was, kannst du versuchen eine detailliertere Meldung zu bekommen?
http://forums.codeblocks.org/index.php?topic=8429.msg64317
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 36
Anmeldedatum: 17.02.2003
Beiträge: 3431
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 04.10.2008, 11:19    Titel: Antworten mit Zitat

Targeted Aktion löscht am Ende sein Target, was ja auch gut so ist. Schlecht ist, wenn man 2 A´TargetedAktions (also z.b. walk und attack) mit dem selben Target startet.
Also letztendlich doch ein Fall von "selben Zeiger 2 mal deleten".
Ich glabu ist werde mal boos::shared_pointer oder so einbauen Smile
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum