Kolla minnesläckage i ett C projekt med Visual Studio Community

Permalänk

Kolla minnesläckage i ett C projekt med Visual Studio Community

Finns det något program som kan propert kolla om man har minnesläckage i ett C projekt i Visual Studio Community 2022?
Jag har använt mig av PVS-Studio, men den klagade på exakt allt, så man blev helt tokig på den. Trots att det inte var något fel.
Nu har min gratisnyckel gått ut, så jag måste hitta ett annat program.

Notera att jag använder MSVC kompilatorn, och den har tydligen någon mystisk egenskap som kan avgöra om man t.ex. överindexerar eller glömmer att frigöra minne, men den säger dock inte vart, utan bara vilken array som är "corrupted". Till skillnad från GCC, som är helt tyst.

Så jag vill testa om jag överindexerar och glömmer frigöra minnet. Jag har alltid manuellt korrigerat detta igenom att testa koden med olika data för att kolla om jag får skräpvärden.

Permalänk
Medlem
Permalänk

Jag har testat med att detektera minnesläckage.
Jag såg på denna film:
https://www.youtube.com/watch?v=t1wqj6J6Vhs&ab_channel=CodeVa...

Jag har inkluderat den där define

#define _CRTDGB_MAP_ALLOC /* Memory leackage library for Visual Studio */

och

#ifdef _MSC_VER #include <crtdbg.h> #endif /* !_MSC_VER */

Samt denna kod-rad på slutet av min main.c fil

_CrtDumpMemoryLeaks();

Men jag får bara:

'Main.exe' (Win32): Loaded 'C:\Users\dmn\GitHub\Main\x64\Debug\Main.exe'. Symbols loaded. 'Main.exe' (Win32): Loaded 'C:\Windows\System32\ntdll.dll'. 'Main.exe' (Win32): Loaded 'C:\Windows\System32\kernel32.dll'. 'Main.exe' (Win32): Loaded 'C:\Windows\System32\KernelBase.dll'. 'Main.exe' (Win32): Loaded 'C:\Program Files (x86)\Intel\oneAPI\mkl\2023.2.0\redist\intel64\mkl_sequential.2.dll'. Module was built without symbols. 'Main.exe' (Win32): Loaded 'C:\Windows\System32\vcruntime140d.dll'. 'Main.exe' (Win32): Loaded 'C:\Windows\System32\ucrtbased.dll'. The thread 0x3bcc has exited with code 0 (0x0). 'Main.exe' (Win32): Loaded 'C:\Program Files (x86)\Intel\oneAPI\mkl\2023.2.0\redist\intel64\mkl_core.2.dll'. Module was built without symbols. 'Main.exe' (Win32): Loaded 'C:\Program Files (x86)\Intel\oneAPI\mkl\2023.2.0\redist\intel64\mkl_avx512.2.dll'. Module was built without symbols. 'Main.exe' (Win32): Loaded 'C:\Program Files (x86)\Intel\oneAPI\mkl\2023.2.0\redist\intel64\mkl_vml_avx512.2.dll'. Module was built without symbols. 'Main.exe' (Win32): Loaded 'C:\Program Files (x86)\Intel\oneAPI\mkl\2023.2.0\redist\intel64\libimalloc.dll'. Module was built without symbols. 'Main.exe' (Win32): Unloaded 'C:\Program Files (x86)\Intel\oneAPI\mkl\2023.2.0\redist\intel64\libimalloc.dll' 'Main.exe' (Win32): Loaded 'C:\Program Files (x86)\Intel\oneAPI\mkl\2023.2.0\redist\intel64\libimalloc.dll'. Module was built without symbols. 'Main.exe' (Win32): Unloaded 'C:\Program Files (x86)\Intel\oneAPI\mkl\2023.2.0\redist\intel64\libimalloc.dll' Detected memory leaks! Dumping objects -> {1189} normal block at 0x00000155357ED9B0, 4864 bytes long. Data: <% ' > 25 00 00 00 08 00 00 00 27 00 00 00 09 00 00 00 Object dump complete. 'Main.exe' (Win32): Loaded 'C:\Windows\System32\kernel.appcore.dll'. 'Main.exe' (Win32): Loaded 'C:\Windows\System32\msvcrt.dll'. The thread 0x59c8 has exited with code 0 (0x0). The thread 0x37c4 has exited with code 0 (0x0). The program '[17220] Main.exe' has exited with code 0 (0x0).

Varför blir det så här?
Har jag missat något?

Permalänk
Medlem

Jag är inte bekant med de där verktygen, men det ser ju ut som om allting fungerar precis som det skall.
En minnesläcka av något slag upptäcks, och du får en minnesdump precis som du bad om.

Om du anser att något har gått fel - vad hade du väntat dig för output istället?

Permalänk
Skrivet av Erik_T:

Jag är inte bekant med de där verktygen, men det ser ju ut som om allting fungerar precis som det skall.
En minnesläcka av något slag upptäcks, och du får en minnesdump precis som du bad om.

Om du anser att något har gått fel - vad hade du väntat dig för output istället?

Jag förväntar mig vart minnesläckan finns i koden.
Precis som på filmen.

Permalänk
Hedersmedlem

Dum fråga kanske, men definierar du _CRTDBG_MAP_ALLOC innan du inkluderar crtdbg.h? Och kör debug-build (med _DEBUG definierad så crtdbg.h ser det)?

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
NAS: 6700K/16GB/Debian+ZFS | Backup (offsite): 9600K/16GB/Debian+ZFS

Permalänk
Skrivet av Thomas:

Dum fråga kanske, men definierar du _CRTDBG_MAP_ALLOC innan du inkluderar crtdbg.h? Och kör debug-build (med _DEBUG definierad så crtdbg.h ser det)?

Jag hade definierat _CRTDBG_MAP_ALLOC, men skrivit _CRTDGB_MAP_ALLOC istället.

Nu fungerar det.

C:\Users\dmn\GitHub\Main\src\CControl\Sources\MachineLearning\fasto.c(18302) : {1189} normal block at 0x000002A1EABCD9B0, 4864 bytes long. Data: <% ' > 25 00 00 00 08 00 00 00 27 00 00 00 09 00 00 00

Då ser jag att det är något som ej frigörs.

Svårt med att hålla koll på minnet i C. Utmanande.

Permalänk
Hedersmedlem

Haha, vad lustigt, jag gjorde nästan samma typo i mitt svar men märkte det precis innan jag skickade iväg det.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
NAS: 6700K/16GB/Debian+ZFS | Backup (offsite): 9600K/16GB/Debian+ZFS

Permalänk
Skrivet av Thomas:

Haha, vad lustigt, jag gjorde nästan samma typo i mitt svar men märkte det precis innan jag skickade iväg det.

Det är tydligen en statisk array som jag ej frigör minnet på vid avslut av program.

Det är en statisk array som kan hålla i 16 strukturer. Dessa strukturer måste allokeras. Strukturerna innehåller data av olika längd. Tanken är att dom ska fungera som en behållare som roterar sin indexposition. Dvs index 0 får ny allokering, sedan får index 1 ny allokering osv. När man kommer till index 16 så börjar den om på index 0 igen, fast nu frigör den minnet.

Eller hur gör man här? Bör man ens göra något åt detta?

Permalänk
Hedersmedlem

Frigör du minnet i övrigt, när den roterar?
Att frigöra i slutet av programmet eller inte ska inte spela någon som helst roll, hela programmets minnesutrymme returneras ju till operativsystemet när processen försvinner. Det som spelar roll är om du läcker minne under tiden det är igång.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
NAS: 6700K/16GB/Debian+ZFS | Backup (offsite): 9600K/16GB/Debian+ZFS

Permalänk
Skrivet av Thomas:

Frigör du minnet i övrigt, när den roterar?
Att frigöra i slutet av programmet eller inte ska inte spela någon som helst roll, hela programmets minnesutrymme returneras ju till operativsystemet när processen försvinner. Det som spelar roll är om du läcker minne under tiden det är igång.

Ja, den frigör minnet under programmets körning. Den allokerar inte mer minne än vid behov.

Det är AI som jag håller på med...i rent C