debuging_c
Rozdíly
Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
| Obě strany předchozí revizePředchozí verzeNásledující verze | Předchozí verze | ||
| debuging_c [2015/11/03 16:27] – [gdb-heap] djbuldog | debuging_c [2025/08/28 10:09] (aktuální) – upraveno mimo DokuWiki 127.0.0.1 | ||
|---|---|---|---|
| Řádek 104: | Řádek 104: | ||
| ==== lsof ==== | ==== lsof ==== | ||
| * zobrazí file deskriptory (soubory, sockety, pipe), které má proces aktuálně otevřené | * zobrazí file deskriptory (soubory, sockety, pipe), které má proces aktuálně otevřené | ||
| + | * seznam obsahuje rovněž spuštěnou binárku a všechny knihovny | ||
| + | * dále zde lze zjistit pracovní adresář | ||
| + | * u souborů lze zjistit, jaký je aktuální seek | ||
| + | * příklad: | ||
| + | * pracovní adresář je / | ||
| + | * předchozí adresář je / | ||
| + | * binárka je /bin/bash | ||
| + | * stdin (0), stdout (1) i stderr (2) je navěšen na terminál /dev/pts0 | ||
| + | < | ||
| + | lsof -p 16901 | ||
| + | COMMAND | ||
| + | bash 16901 root cwd DIR 8,3 4096 464983 / | ||
| + | bash 16901 root rtd DIR 8,3 | ||
| + | bash 16901 root txt REG 8,3 | ||
| + | bash 16901 root mem REG 8,3 | ||
| + | .. | ||
| + | bash 16901 root 0u | ||
| + | bash 16901 root 1u | ||
| + | bash 16901 root 2u | ||
| + | </ | ||
| ==== strace ==== | ==== strace ==== | ||
| Řádek 111: | Řádek 131: | ||
| * Vypisuje vždy systémové volání s argumenty a návratovou hodnotou. Například u operace write je prvním argumentem file deskriptor. File deskriptory je pak možné dohledat přes lsof -p <pid> (fd 1 je typicky stdinout, fd2 je typicky stderr) | * Vypisuje vždy systémové volání s argumenty a návratovou hodnotou. Například u operace write je prvním argumentem file deskriptor. File deskriptory je pak možné dohledat přes lsof -p <pid> (fd 1 je typicky stdinout, fd2 je typicky stderr) | ||
| * výpis strace je zkrácený na 32 znaků, pokud je potřeba vidět víc, je třeba nastavit větší délku přes strace -s < | * výpis strace je zkrácený na 32 znaků, pokud je potřeba vidět víc, je třeba nastavit větší délku přes strace -s < | ||
| + | * užitečné volby | ||
| + | * -tt detailed timestamps | ||
| + | * -f also strace any child processes | ||
| + | * -v be very verbose, even with common structures | ||
| + | * -o write output to file | ||
| + | * -s N capture up to N characters of strings, rather than abbreviating with ... | ||
| ==== gdb ==== | ==== gdb ==== | ||
| Řádek 120: | Řádek 146: | ||
| ==== gcore ==== | ==== gcore ==== | ||
| * kompletní dump procesu včetně celé paměti, k pozdější analýze | * kompletní dump procesu včetně celé paměti, k pozdější analýze | ||
| + | * alternativně lze nastavit | ||
| + | * v environment přes '' | ||
| + | * globálně, pro uživatele, přes ''/ | ||
| ==== pmap ==== | ==== pmap ==== | ||
| * výpis alokované paměti | * výpis alokované paměti | ||
| Řádek 164: | Řádek 192: | ||
| * kompilace | * kompilace | ||
| * spustit ./ | * spustit ./ | ||
| - | * ./configure --enable-frame-pointers | + | * na x86_64 vyžaduje knihovnu libunwind, bez toho nefunguje trasování volání, více info v INSTALL souboru |
| - | * zkoušel jsem s LD_PRELOAD i přímo s -ltcmalloc při kompilaci binárky. Výsledek byl stejný. Nějaký profilový soubor se sice zakládá, ale evidentně mu to nejdůležitější chybí. Vypadá téměř prázdný a nic jsem z toho nevyrazil. | + | * zkoušel jsem s LD_PRELOAD i přímo s -ltcmalloc při kompilaci binárky. Výsledek byl asi stejný. |
| * zkoušel jsem i ten auto leaks checker | * zkoušel jsem i ten auto leaks checker | ||
| - | * PPROF_PATH=/ | ||
| - | * ten sice detekoval leaks a program ukončil, ale chybí mu tam ty trasovací informace, takže z toho vlastně nic nevím | ||
| < | < | ||
| - | PPROF_PATH=/ | + | PPROF_PATH=/ |
| + | Starting tracking the heap | ||
| WARNING: Perftools heap leak checker is active -- Performance may suffer | WARNING: Perftools heap leak checker is active -- Performance may suffer | ||
| Dumping heap profile to / | Dumping heap profile to / | ||
| Řádek 176: | Řádek 203: | ||
| Have memory regions w/o callers: might report false leaks | Have memory regions w/o callers: might report false leaks | ||
| Leak check _main_ detected leaks of 600000000 bytes in 2 objects | Leak check _main_ detected leaks of 600000000 bytes in 2 objects | ||
| - | The 1 largest leaks: | + | The 2 largest leaks: |
| Using local file / | Using local file / | ||
| - | Leak of 600000000 | + | Leak of 500000000 |
| + | @ 4005ea main | ||
| + | @ 3a0001d9f4 __libc_start_main | ||
| + | @ 400529 _start | ||
| + | Leak of 100000000 bytes in 1 objects allocated from: | ||
| + | @ 40061c main | ||
| + | @ 3a0001d9f4 __libc_start_main | ||
| + | @ 400529 _start | ||
| + | </ | ||
| + | * profilování paměti | ||
| + | * proces je zpomalen, naměřil jsem cca 14x (dříve to zvládlo zapsat 2.4M flow, při profilování 0.17M) | ||
| + | * snapshoty se ukládají v pravidelných intervalech (default, po alokaci zhruba 1 GB) do zvoleného adresáře | ||
| + | * snapshoty jsou v interním formátu, programem pprof lze převést do svg, postscript, callgrind formátu | ||
| + | * export do postscript nebo svg vyžaduje nějaké desktopové knihovny/ | ||
| + | * export do callgrind je super, lze otevřít v kcachegrind | ||
| + | * jde zde vidět kdo jakou funkci zavolal a kolik má daná funkce aktuálně alokováno paměti ve snapshotu | ||
| + | * například: | ||
| + | * pprof vyžaduje cestu k binárce a snaphostu | ||
| + | * je žádoucí, aby binárka byla zkompilována s ladícími symboly (přepínač -g) | ||
| + | * místo binárky lze použít i samotné debug symboly ze souboru binárka.debug | ||
| - | If the preceding stack traces are not enough to find the leaks, try running THIS shell command: | + | * ukázka spuštění programu s profilováním paměti |
| + | |||
| + | < | ||
| + | $ HEAPPROFILE=/ | ||
| + | </ | ||
| - | pprof / | ||
| - | If you are still puzzled about why the leaks are there, try rerunning this program with HEAP_CHECK_TEST_POINTER_ALIGNMENT=1 and/or with HEAP_CHECK_MAX_POINTER_OFFSET=-1 | + | * ukázka jednoduchého textového výpisu snaphostu |
| - | If the leak report occurs in a small fraction of runs, try running with TCMALLOC_MAX_FREE_QUEUE_SIZE of few hundred MB or with TCMALLOC_RECLAIM_MEMORY=false, | + | |
| - | Exiting with error code (instead of crashing) because of whole-program memory leaks | + | < |
| + | $ pprof --text | ||
| + | Using local file / | ||
| + | Using local file / | ||
| + | Total: 673.8 MB | ||
| + | | ||
| + | 48.5 | ||
| + | 26.4 | ||
| + | 20.0 | ||
| + | | ||
| + | | ||
| + | | ||
| + | .. | ||
| </ | </ | ||
| + | |||
| + | |||
| + | ==== Heaptrack ==== | ||
| + | * http:// | ||
| ==== mtrace ==== | ==== mtrace ==== | ||
| * součástí GNU C knihovny | * součástí GNU C knihovny | ||
debuging_c.1446564442.txt.gz · Poslední úprava: (upraveno mimo DokuWiki)
