Warsztat - Programowanie gier

Lipiec 30, 2010, 17:27:49 *
Witamy, Gość. Zaloguj się, lub zarejestruj proszę.

Zaloguj się podając nazwę użytkownika, hasło i długość sesji
Aktualności: Warsztat, Regulamin forum, #warsztat, Wiki, FAQ, NoPaste, Mapa
 
   Strona główna   Pomoc Szukaj Zaloguj się Rejestracja  
Strony: 1 [2]
  Drukuj  
Autor Wątek: Wycieki Pamięci  (Przeczytany 1471 razy)
yarpen
SuperHero Member
******

wiadomości: 1423


Zobacz profil WWW
« Odpowiedz #15 : Luty 24, 2010, 21:32:31 »

Cytuj
Lepiej wyciagnac referencje do licznika na zewnatrz i ustawic na niej conditional breakpoint.
Jeżeli myślimy o tym samym conditional breakpoint to chyba szybciej będzie jednak przekompilować projekt Wink
Gaah, slusznie, zamieszalem. Chodzilo mi o cos takiego:
Kod:
long& g_BreakOnAlloc (_crtBreakAlloc);
Teraz w debuggerze mozna zmieniac wartosc g_BreakOnAlloc, bez ruszania kodu.
Zapisane
Lavi
Jr. Member
**

wiadomości: 60



Zobacz profil WWW
« Odpowiedz #16 : Luty 24, 2010, 22:27:32 »

BreakOnAlloc jest chyba też w Panelu Sterowania DX'a tyle tylko że bardzo często to jest miejsce które w sumie nic nam nie mówi o powodzie wycieku ani jego źródle Smiley
Zapisane

"I never make the same mistakes twice" - by Me Tongue | http://blizniak.pcz.pl/~lavi/
yarpen
SuperHero Member
******

wiadomości: 1423


Zobacz profil WWW
« Odpowiedz #17 : Luty 25, 2010, 00:45:47 »

BreakOnAlloc jest chyba też w Panelu Sterowania DX'a tyle tylko że bardzo często to jest miejsce które w sumie nic nam nie mówi o powodzie wycieku ani jego źródle Smiley
Huh? Kompletny callstack to malo informacji?
Zapisane
Lavi
Jr. Member
**

wiadomości: 60



Zobacz profil WWW
« Odpowiedz #18 : Luty 25, 2010, 17:59:50 »

Nie bo czasami niektóre wycieki są takie że nic a nic nie mówią o ich źródle Smiley
No chyba że uznać kod ASM i pliki dołączonego do Visual'a jako takowe.

Poza tym jak się ma np. 1000 wycieków debugowanie każdego nie jest interesujące.

CRTDB natomiast wypisuje wszystkie łącznie z miejscem wycieku. Tyle tylko że nie wiedzieć czemu nie chce Smiley
Zapisane

"I never make the same mistakes twice" - by Me Tongue | http://blizniak.pcz.pl/~lavi/
Esidar
SuperHero Member
******

wiadomości: 1359


Zobacz profil
« Odpowiedz #19 : Luty 25, 2010, 18:12:25 »

Poza tym jak się ma np. 1000 wycieków debugowanie każdego nie jest interesujące.
lol no tak. Poprawia się tylko te ciekawe wycieki a resztę zostawia.

Kompletny callstack to wszystko co chcesz wiedzieć o wycieku. Crtdbg pokaże tylko 1 linijkę czyli np. "MemoryManager.cpp", spróbuj się wtedy domyśleć nie mając callstacka czy zostało to wywołane z loadera tekstury czy z loadera dźwięku.
Zapisane
Lavi
Jr. Member
**

wiadomości: 60



Zobacz profil WWW
« Odpowiedz #20 : Luty 25, 2010, 22:10:45 »

Spoko ja rozumiem ale jak dostajesz w Callstacku DLLlki i środek jakieś bibliotek np. "xlock.h" czy jeszcze innej to raczej nic z tym nie zrobisz.
Zapisane

"I never make the same mistakes twice" - by Me Tongue | http://blizniak.pcz.pl/~lavi/
yarpen
SuperHero Member
******

wiadomości: 1423


Zobacz profil WWW
« Odpowiedz #21 : Luty 26, 2010, 00:10:29 »

Spoko ja rozumiem ale jak dostajesz w Callstacku DLLlki i środek jakieś bibliotek np. "xlock.h" czy jeszcze innej to raczej nic z tym nie zrobisz.
Ale kto ta biblioteke/f-kcje z DLL-ki wywoluje? Z powietrza sie bierze?
Zapisane
radsun
Sr. Member
****

wiadomości: 478



Zobacz profil WWW
« Odpowiedz #22 : Luty 26, 2010, 12:42:26 »

Program:
Kod
#ifdef _DEBUG
#include <crtdbg.h>
void * operator new(size_t nSize, const char * lpszFileName, int nLine)
{ return ::operator new(nSize, 1, lpszFileName, nLine); }
#define new new(__FILE__,__LINE__)
#endif
 
int main()
{
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
 
new int[10];
new char;
new float[20];
 
return 0;
}
 

Output:
Kod:
Detected memory leaks!
Dumping objects ->
The thread 'Win32 Thread' (0xfe4) has exited with code 0 (0x0).
d:\projekty\test\memleak\main.cpp(13) : {59} normal block at 0x00931B70, 80 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projekty\test\memleak\main.cpp(12) : {58} normal block at 0x00931B30, 1 bytes long.
 Data: < > CD
d:\projekty\test\memleak\main.cpp(11) : {57} normal block at 0x00931AC8, 40 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
The program '[172] memleak.exe: Native' has exited with code 0 (0x0).

Problem w tym że nie będzie to działać z innymi bibliotekami i przeciążonym new, chyba że je sam zbudujesz.
Zapisane

Lavi
Jr. Member
**

wiadomości: 60



Zobacz profil WWW
« Odpowiedz #23 : Luty 26, 2010, 15:02:01 »

Niestety nie tida ;/ Kompilator wywalił mi masę błędów na temat operatora "new".

Kod
1>------ Build started: Project: Lavgine 10, Configuration: Debug Win32 ------
1>Compiling...
1>main.cpp
1>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xdebug(32) : warning C4229: anachronism used : modifiers on data are ignored
1>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xdebug(32) : error C2365: 'operator new' : redefinition; previous definition was 'function'
1>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xdebug(32) : error C2491: 'new' : definition of dllimport data not allowed
1>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xdebug(32) : error C2078: too many initializers
 
WYCIALEM TROCHE BLEDOW :)
 
1>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(143) : error C2059: syntax error : 'string'
1>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(144) : error C2091: function returns function
1>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(144) : error C2802: static member 'operator new' has no formal parameters
1>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xlocale(144) : error C2333: 'std::locale::facet::operator new' : error in function declaration; skipping function body
 
WYCIALEM TROCHE BLEDOW :)
 
1>Build log was saved at "file://d:\Lavgine\Lavgine\Debug\BuildLog.htm"
1>Lavgine 10 - 117 error(s), 6 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Sam operator new w pliku w którym jest błąd wygląda tak:

Kod
_Ret_bytecap_(_Size) _MRTIMP2 void * __cdecl operator new(size_t _Size,
const std::_DebugHeapTag_t&, _In_opt_z_ char *, int)
_THROW_BAD_ALLOC; // allocate from the debug CRT heap

A tu z drugiego pliku:

Kod
  #if defined(_DEBUG) && !defined(_M_X64)
_CRTIMP2_PURE void * __CLRCALL_OR_CDECL operator new(size_t _Size)
{ // replace operator new
return (operator new(_Size, std::_DebugHeapTag_func(),
__FILE__, __LINE__));

Takie krzaki trochę ciężko ogarnąć ;/ Tym bardziej że jeszcze nie przeładowywałem operatorów takich jak new.
« Ostatnia zmiana: Luty 26, 2010, 15:08:59 wysłane przez Lavi » Zapisane

"I never make the same mistakes twice" - by Me Tongue | http://blizniak.pcz.pl/~lavi/
radsun
Sr. Member
****

wiadomości: 478



Zobacz profil WWW
« Odpowiedz #24 : Luty 26, 2010, 22:14:50 »

Wklej to co podałem po wszystkich innych nagłówkach, powinno działać.
Zapisane

Khaine
Full Member
***

wiadomości: 205


Zobacz profil
« Odpowiedz #25 : Luty 26, 2010, 23:52:16 »

Cytuj
Cytuj z: Khaine  Luty 24, 2010, 02:58:48
jeśli to Ci nie działa
Kod:

#if defined(DEBUG) || defined(_DEBUG)
    #define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif

to zrób
Kod:

#define moj_new new(_NORMAL_BLOCK, __FILE__, __LINE__)

i po kłopocie Wink

I niestety nie działa. Kompilator VC++ nie przełknie tego ;/
Przełknie, ja tak robiłem w wersji 8 i 9. Pokaż błędy.
Zapisane
Lavi
Jr. Member
**

wiadomości: 60



Zobacz profil WWW
« Odpowiedz #26 : Luty 27, 2010, 22:06:04 »

Błędy są takie jak pokazałem wyżej.
Dla kilku plików może i przełknie ale dla sporego projektu może być to problem Smiley
Zapisane

"I never make the same mistakes twice" - by Me Tongue | http://blizniak.pcz.pl/~lavi/
Strony: 1 [2]
  Drukuj  
 
Skocz do:  

Hosting: Polska Strefa - Ogłoszenia
Powered by SMF 1.1.7 | SMF © 2006, Simple Machines LLC