 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 08.09.2008, 21:23 Titel: SIGTRAP |
|
|
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 |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 09.09.2008, 11:40 Titel: |
|
|
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 |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 09.09.2008, 16:16 Titel: |
|
|
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 |
|
 |
FH Super JLI'ler
Alter: 37 Anmeldedatum: 16.10.2004 Beiträge: 438
Medaillen: Keine
|
Verfasst am: 09.09.2008, 22:16 Titel: |
|
|
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 |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 09.09.2008, 23:12 Titel: |
|
|
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 |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 10.09.2008, 13:41 Titel: |
|
|
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 |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 10.09.2008, 17:25 Titel: |
|
|
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 |
|
 |
Fallen JLI MVP


Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 11.09.2008, 19:51 Titel: |
|
|
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 |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 04.10.2008, 11:19 Titel: |
|
|
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  _________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
|
|
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
|