Autor Wątek: Wycieki Pamięci  (Przeczytany 4171 razy)

Offline yarpen

  • Użytkownik

# Luty 24, 2010, 20: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 ;)
Gaah, slusznie, zamieszalem. Chodzilo mi o cos takiego:
long& g_BreakOnAlloc (_crtBreakAlloc);
Teraz w debuggerze mozna zmieniac wartosc g_BreakOnAlloc, bez ruszania kodu.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Lavi

  • Użytkownik
    • using namspace <Lavi.h>

# Luty 24, 2010, 21: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 :)

Offline yarpen

  • Użytkownik

# Luty 24, 2010, 23: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 :)
Huh? Kompletny callstack to malo informacji?

Offline Lavi

  • Użytkownik
    • using namspace <Lavi.h>

# Luty 25, 2010, 16:59:50
Nie bo czasami niektóre wycieki są takie że nic a nic nie mówią o ich źródle :)
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 :)

Offline Esidar

  • Użytkownik

# Luty 25, 2010, 17: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.

Offline Lavi

  • Użytkownik
    • using namspace <Lavi.h>

# Luty 25, 2010, 21: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.

Offline yarpen

  • Użytkownik

# Luty 25, 2010, 23: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?

Offline radsun

  • Użytkownik
    • CaRpg

# Luty 26, 2010, 11:42:26
Program:
Kod: (cpp) [Zaznacz]
#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:
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.

Offline Lavi

  • Użytkownik
    • using namspace <Lavi.h>

# Luty 26, 2010, 14:02:01
Niestety nie tida ;/ Kompilator wywalił mi masę błędów na temat operatora "new".

Kod: (cpp) [Zaznacz]
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: (cpp) [Zaznacz]
_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: (cpp) [Zaznacz]
  #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, 14:08:59 wysłana przez Lavi »

Offline radsun

  • Użytkownik
    • CaRpg

# Luty 26, 2010, 21:14:50
Wklej to co podałem po wszystkich innych nagłówkach, powinno działać.

Offline Khaine

  • Użytkownik

# Luty 26, 2010, 22: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.

Offline Lavi

  • Użytkownik
    • using namspace <Lavi.h>

# Luty 27, 2010, 21: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 :)