.[ ČeskéHry.cz ].
Detekce neuvolněných bloků
Jdi na stránku 1, 2, 3  Další
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Houp



Založen: 28. 07. 2007
Příspěvky: 672

PříspěvekZaslal: 14. listopad 2009, 17:23:42    Předmět: Detekce neuvolněných bloků Odpovědět s citátem

Jaký "prográmek" na to používáte? Potřeboval bych, aby v případě, že něco zapomenu uvolnit, tak aby mi to napsalo, kde jsem to alokoval a co to bylo.

Aby to fungovalo na Win (7) a v lepším případě bez použití příkazové řádky. Používám IDE Code::Blocks, tam jsem takovou možnost nenašel.
_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 14. listopad 2009, 17:52:07    Předmět: Odpovědět s citátem

Vždyť je to celkem jednoduché, to si zvládneš napsat sám. Může to vypadat třeba takto:
kód:
void *my_malloc(size_t size, const char *file, int line)
{
    void *ptr = malloc(size);

    // add(void *key, const char *file, int line)
    map.add(ptr, file, line);

    return ptr;
}

void my_free(void *ptr)
{
    // remove(key)
    map.remove(ptr);
    free(ptr);
}

void print_leaks()
{
    foreach X in map
        printf("Unreleased allocation: %s:%i\n", X.file, X.line);
}

#define malloc(x) my_malloc(x, __FILE__, __LINE__)
#define free(x) my_free(x)

int main(int argc, char **argv)
{
    atexit(print_leaks);

    // program zde
}


Tohle je pseudo-kód jednoduchého detektoru memory leaků, co vypisuje název souboru a řádek, kde se neuvolněná paměť alokovala. map je nějaké asociativní pole. Je možno také přetížit globální operátory new a delete, aby volaly my_malloc a my_free.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Houp



Založen: 28. 07. 2007
Příspěvky: 672

PříspěvekZaslal: 14. listopad 2009, 18:41:12    Předmět: Odpovědět s citátem

nejsem si jist, ale tohle mi teoreticky neodchytí "cizí" alokované bloky.

př. když jsem řešil úlohu do školy, tak jsem tam měl vytvořen istringstream a string a omylem jsem to ukončoval pomocí exitu, který nevolá destruktory(to jsem nevěděl)
_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
nou



Založen: 28. 07. 2007
Příspěvky: 1047

PříspěvekZaslal: 14. listopad 2009, 18:58:37    Předmět: Odpovědět s citátem

tak existuje valgring ktory je ale iba na linux.
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frca



Založen: 28. 07. 2007
Příspěvky: 1557

PříspěvekZaslal: 14. listopad 2009, 21:14:30    Předmět: Odpovědět s citátem

Houp napsal:
př. když jsem řešil úlohu do školy, tak jsem tam měl vytvořen istringstream a string a omylem jsem to ukončoval pomocí exitu, který nevolá destruktory(to jsem nevěděl)

Huh? No jo, fakt, valgrind píše, že
kód:
==3516== malloc/free: in use at exit: 25 bytes in 1 blocks.

pro
kód:
#include <iostream>
#include <string>
#include <cstdlib>

int main() {
    std::string s = "Hello world!";
    std::cout << s << std::endl;
    exit(1);
    return 0;
}


Je teda nějaký správnější exit pro C++?

K původní otázce: Jsem spíš pro valgrind, který je určitě spolehlivější než nějaký uživatelský rádobydetektor. Pokud ti vadí příkazový řádek, k valgrindu existuje i nějaký GUI frontend, jen si teď nevzpomenu na jméno. Ale ve widlích ti to nepojede (možná tak ten frontend, jestli půjde zkompilovat Twisted Evil ).
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
bolejt



Založen: 02. 05. 2009
Příspěvky: 45

PříspěvekZaslal: 14. listopad 2009, 22:41:20    Předmět: Odpovědět s citátem

na Windows jsem slyšel o dvou komerčních, mrknu se, budu moudřejší:
http://en.wikipedia.org/wiki/Insure%2B%2B
http://en.wikipedia.org/wiki/IBM_Rational_Purify

nevím proč, ale mám dojem, že studuješ FEL a procházíš zatím časově nejnáročnějším předmětem Y36PJC. tady mám jedinou radu: na úkoly v C/C++ používej nějakou nenáročnou distribuci GNU/Linux (klidně ve virtuálu), stačí tento semestr.

frca: na exit(chyba) a abort(signál) používat výjimky, pro exit(0) prostě lépe strukturovat program. mimochodem, ty používáš exit nebo se ptáš jen ze zájmu? byl bys první C++ programátor používající funkci exit, se kterým jsem se setkal... Very Happy
_________________
Ball ball8;
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Houp



Založen: 28. 07. 2007
Příspěvky: 672

PříspěvekZaslal: 14. listopad 2009, 22:47:54    Předmět: Odpovědět s citátem

bolejt napsal:
Y36PJC


Ano Smile

EDIT: frca : nám bylo řečeno prostě nepoužívat exit a používat jen return, tedy když budeš někde hezky hluboko zanořený, tak se pomalu dostat přes všechna zanoření do mainu..
_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
frca



Založen: 28. 07. 2007
Příspěvky: 1557

PříspěvekZaslal: 14. listopad 2009, 23:18:24    Předmět: Odpovědět s citátem

V quick and dirty prográmcích exit používám, ve větších projektech.. no, to bych se musel podívat, teď nevím. Tak nebo tak, neexistence exitu mi přijde trochu divná. V C to je a v C++ ne? Prostě divné.
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 15. listopad 2009, 00:31:12    Předmět: Odpovědět s citátem

Jak říká bolejt, v C++ se místo exit musí používat vyjímky. Není problém přece udělat throw ExitProgram(0), kde ExitProgram je třída vyjímky uchovávající errorCode. Tu pak chytneš v main a dáš return errorCode.

Pozn.: ruční detektor memory leaků se dá pohackovat tak, aby fungoval i v ostatních použitých knihovnách. (v případě new/delete není ani potřeba includovat jejich přetížení, linker se o to postará)
_________________
AMD Open Source Graphics Driver Developer


Naposledy upravil Marek dne 15. listopad 2009, 00:35:08, celkově upraveno 1 krát
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
bolejt



Založen: 02. 05. 2009
Příspěvky: 45

PříspěvekZaslal: 15. listopad 2009, 00:33:33    Předmět: Odpovědět s citátem

frca: já funkci exit nemám rád, nemám s ní dobrou zkušenost. problém přichází, když knihovna v C používá interně exit(). u embedování pythonu, když do skriptu/konzole napíšu "quit()" nebo "exit()", tak si python zjevně bez výčitek zavolá exit(0); a já můžu jen do dokumentace požádat uživatele, aby nic takového nedělal. a nebo nehezky elaborovat s funkcí atexit.

obdoba exit v C++ mi není známa a myslím si, že ani neexistuje. snad by exit šel snadno nahradit makrem a výjimkami, zkusím nastínit mou ošklivou ideu:
kód:
...

#define exit(returnCode) throw ExitException(returnCode);

int function() {
   ...
   exit(0);
   ...
}

int main(int,char**) {
    try {
        function();
    }
    catch (ExitExce...)
        return ...;
    return 0;
}

ale já za sebe říkám: exit ani obdobu nepoužívat

Houp: a snažíš se dělat všechny úkoly? Razz

edit: předběhnut
_________________
Ball ball8;
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 15. listopad 2009, 10:18:51    Předmět: Odpovědět s citátem

exit - mno a co? - stejne jak se ukonci program tak se vsechno uvolni Smile

jinak VC++ ma detekci primo v sobe - a to i v Express verzi Wink
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



Založen: 28. 07. 2007
Příspěvky: 1047

PříspěvekZaslal: 15. listopad 2009, 10:19:33    Předmět: Odpovědět s citátem

je to problem ak sa nevolaju destruktory? ved ak zavolam exit() tak sa ukonci program a teda za programom pozameta operacny system. sam exit() nepouzivam ale pytam sa zo zvedavosti preco nevolat exit() okrem toho ze moze ostat neuvolnena pamet.
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
MD



Založen: 29. 07. 2007
Příspěvky: 437
Bydliště: Praha

PříspěvekZaslal: 15. listopad 2009, 10:52:30    Předmět: Odpovědět s citátem

Ja bych radeji destruktory volal poctive, porad existuje par veci, ktere OS po tobe neuklidi, nereknu konkretni priklad, protoze ty bezne veci jako pamet a otevrene soubory OS uklizi.. proste preces se ukonci, ale nejaky handle na nejaky hodne podivny systemovy objekt zustane aktivni, coz muze nakonec byt i bug v OS Wink

@Eosie: Jeste by mne zajimalo, jak chces rucne detekovat memory leaky v cizich dll? Vzdyt ty muzou mit vlastni heap a tam pak new delete napichnes tezko. A staci k tomu aby byly prelozeny pod jinou verzi C++ runtimu, pod jinym prekladacem, pod jinym jazykem.. Nebo to fakt jde?

Ja osobne jsem mel s detekci leaku nejvetsi problemy s falesnymi poplachy. Myslim ze jedno dll se ukoncovalo a zaclo hlasit leaky, jenze hlasilo falesne i leaky jineho dll, kde ukonceni probihalo pozdeji. A zaboha se nam to nedarilo rozchodit sparvne. Ale to uz je ted fuk, od te doby jsem davno vsechno zapomnel Wink
_________________
- play with objects - www.krkal.org -
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
frca



Založen: 28. 07. 2007
Příspěvky: 1557

PříspěvekZaslal: 15. listopad 2009, 11:11:32    Předmět: Odpovědět s citátem

Toto
kód:
#include <iostream>
using namespace std;
class ExitFuckUp {
public:
    ExitFuckUp(int codePrm) { code = codePrm; }
    int code;
};

int main() {
    cout << "Hello world!" << endl;
    throw ExitFuckUp(1);
    return 0;
}

(na linuxu) vypíše
kód:
Hello world!
terminate called after throwing an instance of 'ExitFuckUp'
Aborted


To se mi pochopitelně nelíbí. Ve widlích by tuším dokonce vyskočil nějaký hnusný messagebox.

Edit: Jo aha, to jako myslíte obalit celý main do throw a v catch normálně zavolat céčkovský exit? Nebo přímo return toho číselného kódu?
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
MD



Založen: 29. 07. 2007
Příspěvky: 437
Bydliště: Praha

PříspěvekZaslal: 15. listopad 2009, 13:50:25    Předmět: Odpovědět s citátem

frca napsal:
Edit: Jo aha, to jako myslíte obalit celý main do throw a v catch normálně zavolat céčkovský exit? Nebo přímo return toho číselného kódu?

Tak to chapu ja (a pouzil bych teda tu variantu s returnem)
kód:
int main() {
    try {
          // do work
    } catch (ExitFuckUp ex) {
         return ex.code;
    }
    return 0;
}

_________________
- play with objects - www.krkal.org -


Naposledy upravil MD dne 15. listopad 2009, 13:55:22, celkově upraveno 1 krát
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++ Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2, 3  Další
Strana 1 z 3

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna