Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Houp
Založen: 28. 07. 2007 Příspěvky: 672
|
Zaslal: 14. listopad 2009, 17:23:42 Předmět: Detekce neuvolněných bloků |
|
|
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 |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 14. listopad 2009, 17:52:07 Předmět: |
|
|
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 |
|
|
Houp
Založen: 28. 07. 2007 Příspěvky: 672
|
Zaslal: 14. listopad 2009, 18:41:12 Předmět: |
|
|
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 |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 14. listopad 2009, 18:58:37 Předmět: |
|
|
tak existuje valgring ktory je ale iba na linux. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
|
frca
Založen: 28. 07. 2007 Příspěvky: 1558
|
Zaslal: 14. listopad 2009, 21:14:30 Předmět: |
|
|
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 ). _________________ www.FRANTICWARE.com |
|
Návrat nahoru |
|
|
bolejt
Založen: 02. 05. 2009 Příspěvky: 45
|
Zaslal: 14. listopad 2009, 22:41:20 Předmět: |
|
|
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... _________________ Ball ball8; |
|
Návrat nahoru |
|
|
Houp
Založen: 28. 07. 2007 Příspěvky: 672
|
Zaslal: 14. listopad 2009, 22:47:54 Předmět: |
|
|
Ano
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 |
|
|
frca
Založen: 28. 07. 2007 Příspěvky: 1558
|
Zaslal: 14. listopad 2009, 23:18:24 Předmět: |
|
|
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 |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 15. listopad 2009, 00:31:12 Předmět: |
|
|
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 |
|
|
bolejt
Založen: 02. 05. 2009 Příspěvky: 45
|
Zaslal: 15. listopad 2009, 00:33:33 Předmět: |
|
|
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?
edit: předběhnut _________________ Ball ball8; |
|
Návrat nahoru |
|
|
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 15. listopad 2009, 10:18:51 Předmět: |
|
|
exit - mno a co? - stejne jak se ukonci program tak se vsechno uvolni
jinak VC++ ma detekci primo v sobe - a to i v Express verzi |
|
Návrat nahoru |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 15. listopad 2009, 10:19:33 Předmět: |
|
|
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 |
|
|
MD
Založen: 29. 07. 2007 Příspěvky: 437 Bydliště: Praha
|
Zaslal: 15. listopad 2009, 10:52:30 Předmět: |
|
|
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
@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 _________________ - play with objects - www.krkal.org - |
|
Návrat nahoru |
|
|
frca
Založen: 28. 07. 2007 Příspěvky: 1558
|
Zaslal: 15. listopad 2009, 11:11:32 Předmět: |
|
|
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 |
|
|
MD
Založen: 29. 07. 2007 Příspěvky: 437 Bydliště: Praha
|
Zaslal: 15. listopad 2009, 13:50:25 Předmět: |
|
|
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 |
|
|
|