Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

09.09.2008, 17:18

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:

Zitat von »"Debugger"«


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


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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:

C-/C++-Quelltext

1
2
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.

PS: Originalpost auf:
http://www.jliforum.de/board/viewtopic.php?t=5505
Lieber dumm fragen, als dumm bleiben!

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

09.09.2008, 17:49

Zeigmal die Definitionen von Action.
@D13_Dreinig

3

09.09.2008, 19:36

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
class Action
{
public:
    Action(Character &theCharacter, bool Breakable=true);//Der Charakter, der die Aktion ausführt

    virtual ~Action();
    bool Move(float Time); //gibt zurück, ob die Action fertig ist


    virtual bool Startable();//ob die Aktion gestartet werden kann

    virtual bool Breakable();//gibt an, ob eine Aktion unterbrochen werden kann

                        //(laufen kann man unterbrechen, wenn man sich nach einem schlag aushohlen muss, kann man das nicht unterbrechen)

    void Start();
    void Stop();
    bool IsStarted();
protected:
    float GetActionParam(string Action, string Key);

    Character& m_Character;
    CharacterValues &m_CharacterValues;
private:
    virtual bool InhMove(float Time) = 0;
    virtual void InhStart()=0;
    virtual void InhStop()=0;

    bool m_Breakable;
    bool m_Started;
};




//eine Aktion, die erste eine ander ausführt um sie vorzubereiten

class PreparedAction: public Action
{
public:
    PreparedAction(Character& theCharacter, Action* PrepareAction, Action* MainAction);
    ~PreparedAction();

    bool InhMove(float Time);
    void InhStart();
    void InhStop();

    bool Breakable();
private:
    Action* m_PrepareAction;
    Action* m_MainAction;

    bool m_Prepared;    //Ob die prepareaction schon fertig ist

};


so?
Lieber dumm fragen, als dumm bleiben!

4

10.09.2008, 12:55

Naja, bei Wikipedia steht, dass Debugger dem Bertiebssystem sagen, schicke mir dieses Signal falls eine bestimmte Bedingung eingetritt. Das System schickt dann das Signal an den zu debuggenden Prozess.

Keine Ahnung wie MinGW etc. funktionieren. Probiers mal im Release oder teste mal in einem anderen Compiler. Desweitern fallen mir so einige Sachen auf, weiss aber nicht ob sie der Grund fuer den Fehler sind.

Die Methoden InhStart(), InhStop(), ... sind in Action als private gekennzeichnet und abstrakt. Das macht fuer gewoehnlich keinen Sinn, da keine erbende Klasse sie jemals implementieren kann. Um dass zu umgehen, veraenderst du das 'visibility'-Attribut dieser Methoden in PrepareAction zu public. Das sollte man nicht (schlecht designed). Ob da sich der Kompiler verheddert, hmm ... kA. Hmm, wie sieht denn der Basisklassendestruktor aus, oder der von Action::AttackMelee, oder Walk? Aja habe damit auch immer so meine Probleme, Definition = Implementierung.

Desweiteren fehlt das Schluesselwort virtual bei diesen Methoden in der abgeleiteten Klasse. Das macht aber nichts, einmal virtual immer virtual (ist aber unschoen).

delete: ich setze die Zeiger danach immernoch auf 0. Normalerweise vernichte ich Objekte aber dort, wo ich sie erzeugt habe.

Zitat

in einem anderen Kontext benutzt ... und dort funktionierte alles.

Dann ist vielleicht der Fehler doch woanders zu suchen.

5

10.09.2008, 14:57

Vielleicht hilft Coding, insbesondere 4.2 :-).

6

10.09.2008, 17:28

Ne, hilft nicht :D

Wäre es denn theoretisch Möglich, dass der Fehler ganz woanders liegt, aber eigentlich nichts macht, und es an dieser Stelle nun eher zufälig kracht?
Lieber dumm fragen, als dumm bleiben!

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

7

10.09.2008, 17:39

Zitat von »"Jonathan_Klein"«

Ne, hilft nicht :D

Wäre es denn theoretisch Möglich, dass der Fehler ganz woanders liegt, aber eigentlich nichts macht, und es an dieser Stelle nun eher zufälig kracht?


Kann sein. Hatte ich auch mal. Ne richtig eklige Heap Corruption. ;)

Der hat mir dann einen Haufen schöne Runtimefehler gegeben nur nicht das, was wirklich los war..

8

10.09.2008, 20:43

Wie hast du es dann gefunden?
Lieber dumm fragen, als dumm bleiben!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

10.09.2008, 21:06

am besten schaut man erstmal sehr genau all jene stellen an, wo der zeiger, der beim delete das problem verursacht, verwendet wird...

10

10.09.2008, 21:08

habsch schon, sind nur 5 oder so.
ich bin mir sehr sicher, dass der Speicher gültig sein sollte.
Lieber dumm fragen, als dumm bleiben!

Werbeanzeige