Toon posts:

[c++/KDevelop] programma stopt met "process aborted"

Pagina: 1
Acties:

Verwijderd

Topicstarter
Beste mensen,

Ik ben me er van bewust dat mijn vraag enorm vaag is. Toch ga ik 'm stellen, omdat ik nu al een halve week zit te prutsen om uit te vinden waar de fout in mijn programma zit, en ik heb 'm nog steeds niet gevonden.
Ik heb een KDE-programma ontwikkeld die in staat is om een tracklist weer te geven door de output van cdparanoia uit te lezen. Dit is mijn eerste ('echte') c++ en KDE-applicatie, ik probeer me op deze manier (m.b.v. een hoop tutorials en howto's en een boek) c++ te leren.
Alles liep gesmeerd, totdat ik er achter kwam dat m'n programma soms opeens stopte. In KDevelop krijg ik dan de melding: "Process aborted". Mijn applicatie crasht dus niet, en ik kan ook geen backtrace uitvoeren om te zien waar de fout zit. Kortom: ik heb geen idee waar het misgaat en hoe het misgaat.
Wat ik wel weet, is dat het mis gaat op het moment dat de gebruiker op de knop klikt om de CD uit te lezen. Vervolgens heb ik een aantal messageboxes neergezet voor debugredenen, en die krijg ik allemaal te zien. Ook de tracklist verschijnt netjes in een QTable, het lijkt dus allemaal goed te werken. Echter, ongeveer 2 seconden nadat het opstellen van de lijst klaar is, verdwijnt m'n programma opeens, en krijg ik dus die melding in KDevelop.
Nu vroeg ik me af: heeft iemand ook eens dit probleem gehad, en hoe heb je het toen opgelost? Kortom: wat voor fouten veroorzaken dit 'vage' gedrag?

edit:

Het lijkt me niet zinvol om code te posten, omdat het gewoon teveel code is, en ik niet kan bepalen welk stuk relevant is. Echter, ik heb het online gezet, zie http://www.vanschaik.tk/~bas/kopy/kopy.tar.bz2 (complete projectdirectory). Houd er rekening mee dat ik echt een c++-beginner ben, en beginners maken beginnersfouten en doen aan lelijke constructies :P

[ Voor 15% gewijzigd door Verwijderd op 11-04-2004 21:18 ]


  • Shadowman
  • Registratie: Januari 2002
  • Niet online
Verwijderd schreef op 11 april 2004 @ 21:05:
Nu vroeg ik me af: heeft iemand ook eens dit probleem gehad, en hoe heb je het toen opgelost? Kortom: wat voor fouten veroorzaken dit 'vage' gedrag?
* Shadowman heeft dit ook heel af en toe en ben er dus achter hoe het komt.

Als je gebruik maakt van een functie(std::string) en je geeft een null-pointer door dan komt deze fout te voorschijn. Je zult dus ff moeten kijken of je char * gebruikt in je app en of deze ook zijn gedefinieerd.

C++:
1
2
char *test1=NULL;
std::string test=test1;
^ geeft overigens weer een seg-fault.

C++:
1
2
char *test1=NULL;
functie_die_string_als_argument_wil(test1); // std::string dus
^ geeft die process aborted.

Verwijderd

Topicstarter
Hmmm... Bedankt voor de tip! Ik heb overal waar ik in m'n programma string-functies gebruikt, gecontroleerd of die strings perongeluk leeg kunnen zijn. Hier en daar wat aanpassingen gemaakt, maar hij vertoont dat gedrag nog steeds!
Misschien moet ik het iets preciezer omschrijven: op het moment dat ik op de knop druk, gaat m'n app e.e.a. uitvoeren. Na een paar seconden krijg ik dan een msgbox "Klaar met analyseren", dus alles lijkt goed te gaan. Echter, als ik ergens op klik (of een venster verplaats), dan lijkt de applicatie te 'hangen' (form wordt niet meer bijgewerkt, er blijft een grijze vlek overheen) en nog een halve seconde later sluit de hele applicatie en krijg ik van KDevelop de melding "Process aborted". Twee screenshots (klik voor vergroting):

Afbeeldingslocatie: http://www.vanschaik.tk/~bas/kopy/screen1_klein.jpg (hier is alles in orde, en is mijn applicatie klaar met analyseren)


Afbeeldingslocatie: http://www.vanschaik.tk/~bas/kopy/screen2_klein.jpg (dit is na het wegklikken van de messagebox, toen ik het focus van een window veranderde. Je ziet dat het ding crasht)

Overigens is de messagebox met "Klaar met analyseren" het laatste wat er gebeurt als de knop is ingedrukt. Er zit dus niet nog stiekum een stukje code na de msgbox. Ik heb ook geen slot gedefinieerd dat 'luistert' naar een verandering van het focus van het window. Is dit vaag of is dit vaag?

Verwijderd

Ga er eens met een debugger door heen.

Verwijderd

Topicstarter
Ik heb wat meer details... En het wordt voor mij alsmaar vager. De volgende code werkt goed:
code:
1
TrackList* trackList = new TrackList(7);

hierin alloceer ik een TrackList-object waar 7 tracks in kunnen. In werkelijkheid is een TrackList een array van AudioTracks. Een AudioTrack is op zijn beurt een struct met 5 waarden: trackNo (int), artist (string), title (string), start (int), length (int). Dit bovenstaande gaat dus goed. Echter, als ik dit probeer:

code:
1
TrackList* trackList = new TrackList(8);

Dan loopt het programma in de soep ("Process Aborted"). Dit zou toch gewoon moeten werken? Als ik een array van 7 AudioTracks kan aanmaken, waarom kan dat dan niet met 8?

Voor jullie informatie even de constructor van TrackList:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
TrackList::TrackList(int pTrackCount){
    trackList = new AudioTrack[pTrackCount];
    //AudioTrack trackList [pTrackCount];
    trackCount = pTrackCount;
    int i;
    
    for (i = 0; i < trackCount; i++){
        trackList[i].trackNo = i + 1;
        trackList[i].length = 0;
        trackList[i].start = 0;
        trackList[i].artist = "";
        trackList[i].title = "";
    }
}


En de struct AudioTrack ziet er zo uit:
code:
1
2
3
4
struct AudioTrack {
    int trackNo, length, start;
    string artist, title;
};

(gedefinieerd in TrackList.h)

[ Voor 61% gewijzigd door Verwijderd op 12-04-2004 11:12 ]


  • Shadowman
  • Registratie: Januari 2002
  • Niet online
Stukje code van je apart gezet en het werkt hier dus wel goed :?.

Kun je precies bepalen waar het fout gaat in de constructor? En eventueel kun je ook gebruik maken van de std::vector-class van c++ of de QValueVector (tenminste lijkt me een variant van std::vector maar dan van qt).

offtopic:
0-8=9 tracks genummerd bij trackNo 1-9

  • odysseus
  • Registratie: Augustus 2000
  • Laatst online: 22:20

odysseus

Debian GNU/Linux Sid

Die code ziet er vrij logisch uit...heb je valgrind ergens staan? Daarmee kan je misschien achter de oorzaak komen. Geeft dat geen vreemde vermeldingen, dan wordt het gdb, maar dat is weer een klus op zichzelf om (goed) te leren :). Overigens willen strace en ltrace ook nog wel eens duidelijk maken waar het probleem zit, maar ik verwacht dat die hier minder nuttig zullen zijn - misschien dat strace toch het proberen waard is ('strace mijnProgramma &> bestand.log').

Leven is het meervoud van lef | In order to make an apple pie from scratch, you must first create the universe.


Verwijderd

Topicstarter
Ik kan op dit moment even niet bij die code, maar kan het probleem veroorzaakt worden door een fout in g++? Ik draai Fedora Core 2 test 2, maar heb g++ vanuit Fedora Core 1 (stable) gehaald... Misschien dat daar een probleem zit?

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Onwaarschijnlijk; g++ is portable over praktisch alle UNIX varianten. Het verschil tussen twee opeenvolgende Linux versies is veel kleiner. Het is ook extreem veel getest. Ik gok eerder op een memcpy/memset/strcpy die de verkeerde dingen overschrijft.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • marino_centrino
  • Registratie: November 2003
  • Laatst online: 05-04 20:14
Ik zie dat je in de constructor een array (trackList) alloceert. De-alloceer je deze array ook weer in de destructor (met delete[] trackList;) ? Na het drukken op de knop wordt er een aantal taken uitgevoerd en een aantal objecten aangemaakt. Na afloop zullen er waarschijnlijk wat objecten opgeruimd worden (mbv van de destructor). Als je in de destructor vergeet om dit soort de-allocaties te doen, dan kan je programma op de meest vreemde momenten crashen. Succes!

Verwijderd

Topicstarter
marino_centrino schreef op 14 april 2004 @ 09:49:
Ik zie dat je in de constructor een array (trackList) alloceert. De-alloceer je deze array ook weer in de destructor (met delete[] trackList;) ? .....
Dames en heren, we hebben een winnaar! Zie hier de constructor van TrackList:
code:
1
2
3
4
TrackList::TrackList(int pTrackCount){
    trackList = new AudioTrack[pTrackCount];
    trackCount = pTrackCount;
}


En hier de (oude) destructor:
code:
1
2
3
TrackList::~TrackList(){
    delete trackList;
}


Ziet iemand de fout al? En hier heb ik dus ruim een week over gedaan. Soms krijg je echt zelfmoordpogingen ;)

De correcte destructor is uiteraard:
code:
1
2
3
TrackList::~TrackList(){
    delete [] trackList;
}


Bedankt voor de hulp! Nu vraag ik me alleen af, waarom geeft g++ niet even een waarschuwing dat ik een array probeer te 'deleten' met de verkeerde opererator? Als ik helemaal geen destructor schrijf, dan crasht het programma niet, maar heb je een geheugenlek. Als je de verkeerde destructor gebruikt, lijkt alles te werken, totdat je teveel elementen (8 in dit geval) gebruikt. Het lijkt me toch best eenvoudig om te controleren of wel de juiste 'delete'-operator gebruikt wordt?! However, het probleem is opgelost! Nogmaals bedankt!

  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
Waarom niet gewoon std::vector gebruiken? Dan hoef je je geen zorgen te maken over (de)alloceren van geheugen.

"He took a duck in the face at two hundred and fifty knots."

Pagina: 1