/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
GDB opfører sig skørt med mit C++-p
Fra : Steffen Fischer


Dato : 12-08-03 22:16

Hej alle

Jeg har i forbindelse med et c++-projekt leget lidt med GVD, men fandt
ud at at jeg i en enkelt fil ikke kunne indsætte fungerende breakpoints.
Da jeg heller ikke kunne gøre det i GDB fra konsollen, har jeg skåret
kraftigt ned på koden, og stadig beholde problemet. Resultatet er blevet:

=== test.cpp: ====

#include "reader.h"

int main(int argc, char *argv[]) {
ReaderTing map_reader = ReaderTing();
}

Reader::Reader() {
int i = 0;
i++;
}

=== reader.h: ====

#ifndef READER_H
#define READER_H

class Reader {
public:
Reader();
};

#endif

=== slut =========

Programmet compiles med: g++ -g -Wall test.cpp

Efterfølgende startes GDB med: gdb a.out

Hvis jeg nu eks. vil lave et breakpoint i linie 8 (int i = 0;), vil jeg
så skrive "b 8" i GDB-promten. Hvis jeg herefter kører programmet med
"r" breakes der ikke.

Jeg kan godt få den til at stoppe ved eks. "b Reader::Reader()", men det
er jo ikke helt nok. Jeg har også forsøgt at finde på et lidt mindre
almindelige navn end "reader", men uden held. En ting der undrer mig
lidt er hvis jeg sætter breakpoints på følgende to måder:

(gdb) b 7
Breakpoint 1 at 0x80483f6: file tester.cpp, line 7.

(gdb) b ReaderTing::ReaderTing()
Breakpoint 2 at 0x8048410: file tester.cpp, line 7.

Angiveligt bliver de to breakpoints sat i samme linie, men adresserne er
forskellige... Har det nogen betydning? Det skal lige nævnes at
programmet stopper ved 2, men ikke 1.

Hvad er det jeg gør galt? For jeg kan ikke umiddelbart indse det.
Desuden kan jeg underligt nok ikke længere se noget af ovenstående kode
i GVD, hvilket naturligvis også er et problem.

Versionerne af de omtalte programmer:
g++ (GCC) 3.3.1 (Debian)
GNU gdb 5.3.90_2003-08-01-cvs-debian
GVD version 1.2.6 (20020522)

Håber at nogen kan hjælpe, for det er nemlig lidt træls :).

/Steffen


 
 
Bertel Brander (12-08-2003)
Kommentar
Fra : Bertel Brander


Dato : 12-08-03 23:54

Steffen Fischer wrote:
> Hej alle
>
> Jeg har i forbindelse med et c++-projekt leget lidt med GVD, men fandt
> ud at at jeg i en enkelt fil ikke kunne indsætte fungerende breakpoints.
> Da jeg heller ikke kunne gøre det i GDB fra konsollen, har jeg skåret
> kraftigt ned på koden, og stadig beholde problemet. Resultatet er blevet:
>
> === test.cpp: ====
>
> #include "reader.h"
>
> int main(int argc, char *argv[]) {
> ReaderTing map_reader = ReaderTing();
> }
>
> Reader::Reader() {
> int i = 0;
> i++;
> }
>
> === reader.h: ====
>
> #ifndef READER_H
> #define READER_H
>
> class Reader {
> public:
> Reader();
> };
>
> #endif
>
Jeg er absolut ikke expert i gdb, men er det muligt at du ikke kan sætte
et breakpoint der hvor du vil fordi kompileren har set at Reader::Reader
ikke laver noget og derfor optimerer indholdet væk?

/b


Steffen Fischer (13-08-2003)
Kommentar
Fra : Steffen Fischer


Dato : 13-08-03 10:37

Bertel Brander wrote:
> Jeg er absolut ikke expert i gdb, men er det muligt at du ikke kan sætte
> et breakpoint der hvor du vil fordi kompileren har set at Reader::Reader
> ikke laver noget og derfor optimerer indholdet væk?
>

Det er rigtigt, at det eksempel, jeg har givet, ikke laver særligt
meget. Men som sagt er problemet også tilstede i en noget større fil...
og den er jeg ret sikker på laver noget.

For en sikkerheds skyld har jeg fået den til at lave nogle side-effects
ved at skrive lidt ud med printf... men jeg kan stadig ikke breake :(.

En anden lidt skør ting er, at jeg i GVD ikke kan se den fil, som
ReaderTing nu måtte ligge i (hvadenten det er en seperat fil eller i
main-filen). GDB kan dog godt vise koden vha. "list".

/Steffen


Bertel Brander (13-08-2003)
Kommentar
Fra : Bertel Brander


Dato : 13-08-03 17:03

Steffen Fischer wrote:
> Bertel Brander wrote:
>
>> Jeg er absolut ikke expert i gdb, men er det muligt at du ikke kan sætte
>> et breakpoint der hvor du vil fordi kompileren har set at Reader::Reader
>> ikke laver noget og derfor optimerer indholdet væk?
>>
>
> Det er rigtigt, at det eksempel, jeg har givet, ikke laver særligt
> meget. Men som sagt er problemet også tilstede i en noget større fil...
> og den er jeg ret sikker på laver noget.
>
> For en sikkerheds skyld har jeg fået den til at lave nogle side-effects
> ved at skrive lidt ud med printf... men jeg kan stadig ikke breake :(.
>
Jeg er stadig ikke expert i GDB eller GVD, men der plejer vist at være
en mulighed for at se assembler koden. Hvis der er det, kan det måske
hjælpe at sætte break-points der, så kan du også samtidig se om fejlen
er at kompileren har lavet rod i linie numrene.

/b


Steffen Fischer (13-08-2003)
Kommentar
Fra : Steffen Fischer


Dato : 13-08-03 22:54

Bertel Brander wrote:
> Jeg er stadig ikke expert i GDB eller GVD, men der plejer vist at være
> en mulighed for at se assembler koden. Hvis der er det, kan det måske
> hjælpe at sætte break-points der, så kan du også samtidig se om fejlen
> er at kompileren har lavet rod i linie numrene.
>

Nu ved jeg ikke lige hvordan man viser assembler koden i GDB, men jeg
forsøgte så at se den i GVD. Problemet fra før (at jeg kun kan se
main-filen) er der stadig, og nu får jeg desuden en:
"Unexpected internal error".

Så der er altså et eller andet seriøst galt med mit program, for de
omtalte problemer er ikke tilstede i andre programmer, som jeg har
forsøgt debugge.

Løsningen er nok ret simpel, men jeg kan desværre ikke lige indse det.

/Steffen


Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste