Programmering i C, upptäcka minnesläckor i Xcode.

Permalänk
Medlem

Programmering i C, upptäcka minnesläckor i Xcode.

Någon som vet hur man upptäcker minnesläckor i Xcode? Har försökt använda Profileverktyget(CMD+i) och sedan trycka på leaks. Tyvärr står det inte om jag allokerar minne från början. Det som står är att jag använder malloc. Det står sedan inte om jag allokerar minne, eller när jag frigör det.

All hjälp uppskattas!

/Mvh N0iZE

Visa signatur

OS: MacOS/ Windows 10 Pro 64-bit MB: ASUS-Z97-A CPU: i7 4790k
NÄTAGG: EVGA SUPERNOVA G2
RAM: 32768 MiB GPU: 1070 FTW Chassi: Fractal Design R4
MBP 13" i5 | 256GB | 16GB RAM | MID 2014

Permalänk

Du har kanske inte funderat på att använda andra profiling verktyg då?

Om du kör på Linux kan du ju använda Valgrind.

På windows brukar jag köra VLD men den kanske kräver att man kör Visual Studio.

Permalänk
Hedersmedlem

Är det en väldigt stor kod du jobbar med? Annars skulle jag föreslå att du själv kollar över var du allokerar minne och ökar din förståelse för koden.

Permalänk

Nu kanske det är så att det är "Captain Obvius to the rescue" men det är ju bättre att vara övertydlig.

malloc är ju att av de sätt som man kan allokera minne på heapen med i C. Men då skall man ju vara noga med att också lämna tillbaka minnet genom att göra free.

struct Foo { int kalle; int pelle; int olle; } int main(int argv, char** argc) { Foo * f = (Foo)malloc(sizeof(Foo)); // allokering av minne free(f); // ge tillbaka minnet. Foo *bar = (Foo)malloc(sizeof(Foo)); // allokering av minne bar = (Foo)malloc(sizeof(Foo)); // MINNESLÄCKA!! Det gamla minnet har inte blivit återlämnat. free(bar); // Ge tillbaka det senast allokerade minnet. return 0; }

Permalänk
Medlem
Skrivet av Superhepper:

Du har kanske inte funderat på att använda andra profiling verktyg då?

Om du kör på Linux kan du ju använda Valgrind.

På windows brukar jag köra VLD men den kanske kräver att man kör Visual Studio.

kör OSX, därav Xcode

Skrivet av Shimonu:

Är det en väldigt stor kod du jobbar med? Annars skulle jag föreslå att du själv kollar över var du allokerar minne och ökar din förståelse för koden.

Nja det är inte en stor kod och jag är 99,9% att jag lämnar tillbaka minnet rätt. Tänkte snarare för framtida bruk.

Skrivet av Superhepper:

Nu kanske det är så att det är "Captain Obvius to the rescue" men det är ju bättre att vara övertydlig.

malloc är ju att av de sätt som man kan allokera minne på heapen med i C. Men då skall man ju vara noga med att också lämna tillbaka minnet genom att göra free.

struct Foo { int kalle; int pelle; int olle; } int main(int argv, char** argc) { Foo * f = (Foo)malloc(sizeof(Foo)); // allokering av minne free(f); // ge tillbaka minnet. Foo *bar = (Foo)malloc(sizeof(Foo)); // allokering av minne bar = (Foo)malloc(sizeof(Foo)); // MINNESLÄCKA!! Det gamla minnet har inte blivit återlämnat. free(bar); // Ge tillbaka det senast allokerade minnet. return 0; }

Yeah, frigör i slutet av mitt program, och är som sagt 99.9% säker på att jag frigör minne på rätt sätt. Vill däremot undvika minnesläckor när jag gör större program framöver.

Visa signatur

OS: MacOS/ Windows 10 Pro 64-bit MB: ASUS-Z97-A CPU: i7 4790k
NÄTAGG: EVGA SUPERNOVA G2
RAM: 32768 MiB GPU: 1070 FTW Chassi: Fractal Design R4
MBP 13" i5 | 256GB | 16GB RAM | MID 2014

Permalänk

Får du någon form av stack trace som du kan visa?

Permalänk
Medlem
Skrivet av Superhepper:

Får du någon form av stack trace som du kan visa?

Nope, har försökt utan resultat.

Visa signatur

OS: MacOS/ Windows 10 Pro 64-bit MB: ASUS-Z97-A CPU: i7 4790k
NÄTAGG: EVGA SUPERNOVA G2
RAM: 32768 MiB GPU: 1070 FTW Chassi: Fractal Design R4
MBP 13" i5 | 256GB | 16GB RAM | MID 2014

Permalänk
Medlem

Om det är ett litet simpelt program som inte allokerar mängder med minne så kan du ju skriva minnesadresserna till en fil eller bara ut i console/terminal både när du allokerar och frigör bara för att kolla att du gör på rätt sätt.

Är det för stort för det så knåpa ihop ett litet program som bara testar minnesallokering/frigörning.

Visa signatur

i7 8700k @ 4.7GHz | NH-L12 | ASUS Z270i ROG Strix Gaming | EVGA 1080 FTW | 32GB Corsair Vengeance 3000MHz | Samsung 970 Evo M.2 500GB, 840 250GB, Crucial MX500 2TB | Loque Ghost S1 | XB271HU | QX2710 | U2412M | U2719D | Filco Majestouch 2 MX Brown TKL

Permalänk

Kollade på valgrinds hemsida där står det att de stödjer Mac OS X(Darwin). Så kanske kan köra det och se om du kan hitta läckan genom det verktyget.

Permalänk
Medlem

Du kan även köra valgrind genom att använda tex macports, körde det förut och det fungerade utmärkt