Strona 1 z 1

[C++] kdevelop i gdb debuggowanie brak zmiennych

: 06 marca 2008, 22:08
autor: painspr
Witam
Mam pytanko odnośnie debuggowania przy pomocy gdb i kdevelop. Mam następujący krótki program w C++ :

Kod: Zaznacz cały

#include <iostream>
#include <string>
#include <fstream>
#include <map>

using namespace std;

typedef pair<string,string> ConfigVariable;

class ConfigFile
{
	fstream filestr;
	map<string,string> variables;
	FILE *plik;
	public:
		ConfigFile(string);
		int GetInt(string);
		string GetText(string);	
		void Close();
};

int ConfigFile::GetInt(string name)
{
	return atoi(variables[name].c_str());
}

string ConfigFile::GetText(string name)
{
	return variables[name];
}

ConfigFile::ConfigFile(string filename)
{
	char bufor[100];

	string name,value;
	filestr.open(filename.c_str(), fstream::in | fstream: :o ut);

	while(!filestr.eof())
	{
		filestr.getline(bufor,256);
		int i,j=0;
		for(i=0;(bufor[i]!=' ' && bufor[i]!='=');i++)
			name.append(1,bufor[i]);

		for(;bufor[i]!='=';i++);
		i++;
		for(;bufor[i]==' ';i++);

		for(;(bufor[i]!=0 && bufor[i]!=' ');i++)
			value.append(1,bufor[i]);
		
		variables[name] = value;
	}
}

void ConfigFile::Close()
{
	filestr.close();
}

int main()
{
	ConfigFile config("/home/pawel/config_file/debug/src/duparc");
	cout << config.GetInt("dupa") << endl;
	config.Close();
	return 0;
}
i chciałbym go debuggować. Wszystko ładnie działa do czasu jak chcę zobaczyć zawartość np. zmiennej bufor albo i w funkcji ConfigFile. GDB wyrzuca że nie ma takiego symbolu. Wie ktoś jak zobaczyć wartości tych zmiennych?

Pozdrawiam
Paweł

: 07 marca 2008, 01:32
autor: hot_stuff
Z czystego gdb nigdy nie korzystalem, ale:
Aby debuger widzial zmienne w funkcjach itp to musi wpierw w nie wejsc -> w pewnym IDE<nie KDevelop'ie> ustawia sie breaka na danej funkcji i odpala debugowanie<nie pamietam juz jak dokladnie to sie odbywa> i pozniej debuger wyswietla zawartosc okreslonych zmiennych, ale dopiero gdy 'przeanalizuje' conajmniej linie w ktorej zmienna zostala zadeklarowana. Czyli aby gdb widzial odpowiednie zmienne to musi dojsc do momentu w ktorym zmienne zostaly zadeklarowane.

Jezeli chcesz wiedziec co masz nie tak w tym kodzie, ktory podales to:
1. deklarujesz tablice bufor[] jako posiadajaca 100 elementow a pare linijek ponizej probujesz do tej tablicy wczytac 256 znakow przy uzyciu metody getline().
2. Nigdzie nie okresliles, ze 'i' ma sie zwiekszac tylko i wylacznie do 99 przez co mozesz przeleciec dostepny zakres tablicy bufor[]
3. W klasie masz pole FILE* plik ktorego nigdzie w kodzie nie uzywasz a ktore z kolei okresla wskaznik do pliku, ale typowego dla jezyka C a nie C++.
4. Tworzysz konstruktor w ktorym otwierasz strumien filestr i na nim operujesz, ale hmmm... nigdzie nie widze destruktora -> co prawda masz metode Close(), ale musisz ja zawsze 'recznie' wywolywac i gdy zaczniesz otwierac 'n'-plikow to mozesz miec pozniej problemy z ich zamykaniem. Slowem -> skoro uzywasz klas i konstruktora, to uzywaj tez destruktorow.
5. variables[name] = value; -- 'name' to obiekt klasy string, wiec jezeli chcesz tym indexowac 'variables', to zapomniales uzyc metody c_str() aby wydobyc zawartosc wspomnianego 'name'.

Nie wiem czy to wszystkie potencjalne bledy, ale hmmm... skoro juz uzywasz konstrukcji STL'owskich typu klasa string, to po co deklarujesz char bufor[100]? Nie lepiej string bufor?

Nie wiem czy ten kod nie jest celowo nafaszerowany taka iloscia bledow, bo np chcesz sobie potestowac gdb, ale jak tak, to nie bardzo pomoge, bo jak juz wspomnialem gdb sie jeszcze nie bawilem w jego czystej postaci a tylko poprzez 'nakladki'.

: 07 marca 2008, 14:32
autor: painspr
O to chodzi, że on nie widzi ich nawet jak przejdzie przez zadeklarowanie.

Co do jakości kodu to wiem że jest do dupy, ale akurat nie o to chodzi. Wszystkie nieścisłości wynikają ze zmian które wprowadzałem np. przejście na STL itd. dlatego zostają stare dane jak FILE czy te 256, bo wcześniej bufor miał 256. Co do destruktora to rzeczywiście powinienem go użyć. Ten kod też nie jest dopracowany pod względem sprawdzania błędów, ale nie miał być :) . Co do bufora to nie wiedziałem wcześniej że jest taka funkcja do wczytywania bezpośrednio do string. Teraz ją znalazłem.

Dzięki za sugestie, tylko niestety dalej mam problem z tym debuggowaniem. Szczerze to brakuje mi Visual Studio :/

: 07 marca 2008, 16:45
autor: Theq
Sprobuj skompilowac debuga z opcja

Kod: Zaznacz cały

-gstabs+

: 07 marca 2008, 16:55
autor: painspr
dzięki Theq, teraz wszystko jest OK