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 14:00] – [Dmalloc] 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 160: | Řádek 188: | ||
| ==== Google' | ==== Google' | ||
| - | http:// | + | * starý: |
| + | * nový: https:// | ||
| + | * kompilace | ||
| + | * spustit ./ | ||
| + | * 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 asi stejný. | ||
| + | * zkoušel jsem i ten auto leaks checker | ||
| + | < | ||
| + | PPROF_PATH=/ | ||
| + | Starting tracking the heap | ||
| + | WARNING: Perftools heap leak checker is active -- Performance may suffer | ||
| + | Dumping heap profile to / | ||
| + | Dumping heap profile to / | ||
| + | Have memory regions w/o callers: might report false leaks | ||
| + | Leak check _main_ detected leaks of 600000000 bytes in 2 objects | ||
| + | The 2 largest leaks: | ||
| + | Using local file / | ||
| + | Leak of 500000000 bytes in 1 objects allocated from: | ||
| + | @ 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 | ||
| + | |||
| + | * ukázka spuštění programu s profilováním paměti | ||
| + | |||
| + | < | ||
| + | $ HEAPPROFILE=/ | ||
| + | </ | ||
| + | |||
| + | |||
| + | * ukázka jednoduchého textového výpisu snaphostu | ||
| + | |||
| + | < | ||
| + | $ 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 | ||
| Řádek 181: | Řádek 273: | ||
| * zní to pěkně, ale nikdy se mi to nepodařilo úplně rozběhnout | * zní to pěkně, ale nikdy se mi to nepodařilo úplně rozběhnout | ||
| + | * věčně nějaké nepochopitelné python syntax errors | ||
| * https:// | * https:// | ||
debuging_c.1446555645.txt.gz · Poslední úprava: (upraveno mimo DokuWiki)
