Uživatelské nástroje

Nástroje pro tento web


debuging_c

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revizePředchozí verze
Následující verze
Předchozí verze
debuging_c [2015/11/03 16:27] – [gdb-heap] djbuldogdebuging_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 /home/flowmon/commleak
 +    * předchozí adresář je /
 +    * binárka je /bin/bash
 +    * stdin (0), stdout (1) i stderr (2) je navěšen na terminál /dev/pts0
  
 +<code>
 +lsof -p 16901
 +COMMAND   PID USER   FD   TYPE DEVICE     SIZE   NODE NAME
 +bash    16901 root  cwd    DIR    8,3     4096 464983 /home/flowmon/commleak
 +bash    16901 root  rtd    DIR    8,3     4096      2 /
 +bash    16901 root  txt    REG    8,3   801816  48121 /bin/bash
 +bash    16901 root  mem    REG    8,3   144776 547197 /lib64/ld-2.5.so
 +..
 +bash    16901 root    0u   CHR  136,0               3 /dev/pts/0
 +bash    16901 root    1u   CHR  136,0               3 /dev/pts/0
 +bash    16901 root    2u   CHR  136,0               3 /dev/pts/0
 +</code>
 ==== 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 <newlength>   * 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 <newlength>
 +  * 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 ''ulimit -c unlimited'' 
 +    * globálně, pro uživatele, přes ''/etc/security/limits.conf''
 ==== pmap ==== ==== pmap ====
    * výpis alokované paměti    * výpis alokované paměti
Řádek 164: Řádek 192:
   * kompilace   * kompilace
     * spustit ./autogen.sh     * spustit ./autogen.sh
-    * ./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=/usr/local/bin/pprof HEAPCHECK=normal HEAPPROFILE=/tmp/heapprof7 /data/xx_memtest 
-    * ten sice detekoval leaks a program ukončil, ale chybí mu tam ty trasovací informace, takže z toho vlastně nic nevím 
 <code> <code>
-PPROF_PATH=/usr/local/bin/pprof HEAPCHECK=normal HEAPPROFILE=/tmp/heapprof7 /data/xx_memtest                 Starting tracking the heap+PPROF_PATH=/usr/local/bin/pprof HEAPCHECK=normal HEAPPROFILE=/tmp/heapprof7 /data/xx_memtest 
 +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 /tmp/heapprof7.0001.heap (476 MB currently in use) Dumping heap profile to /tmp/heapprof7.0001.heap (476 MB currently in use)
Řá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 largest leaks:+The largest leaks:
 Using local file /data/xx_memtest. Using local file /data/xx_memtest.
-Leak of 600000000 bytes in objects allocated from:+Leak of 500000000 bytes in 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 
 +</code>
  
 +  * 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/binárky, nezkoušel jsem
 +      * 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: když vyberu funkci main, tak vidím jaké jiné funkce (alokující nějakou paměť) se z main zavolaly (callee) a kolik každá alokovala. Postup lze opakovat vybráním nějaké ze zavolaných funkcí. Krásně se to analyzuje.
 +    * 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 
 +  
 +<code> 
 +$ HEAPPROFILE=/data/ads/tmp/ads-nf-loader.memprof LD_PRELOAD=/data/ads/tmp/bari-memprof/libtcmalloc.so.4.2.6 ads-nf-loader 
 +</code>
  
-pprof /data/xx_memtest "/tmp/xx_memtest.12371._main_-end.heap" --inuse_objects --lines --heapcheck  --edgefraction=1e-10 --nodefraction=1e-10 --gv 
  
-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, it might help find leaks + 
-Exiting with error code (instead of crashing) because of whole-program memory leaks+<code> 
 +$ pprof --text /usr/lib/debug/usr/local/bin/ads-nf-loader.debug  /data/ads/tmp/ads-nf-loader.memprof.0085.heap 
 +Using local file /usr/lib/debug/usr/local/bin/ads-nf-loader.debug. 
 +Using local file /data/ads/tmp/ads-nf-loader.memprof.0085.heap. 
 +Total: 673.8 MB 
 +   572.2  84.9%  84.9%    572.2  84.9% InitCacheBuff 
 +    48.5   7.2%  92.1%     48.5   7.2% mainsub 
 +    26.4   3.9%  96.0%     26.4   3.9% tpxmit 
 +    20.0   3.0%  99.0%     20.0   3.0% NewFile 
 +     5.0   0.7%  99.8%      5.0   0.7% LZO_initialize 
 +     0.9   0.1%  99.9%      0.9   0.1% SQLAllocEnv 
 +     0.4   0.1% 100.0%      0.4   0.1% Insert_Extension_Map 
 +..
 </code> </code>
 +
 +
 +==== Heaptrack ====
 +  * http://milianw.de/blog/heaptrack-a-heap-memory-profiler-for-linux
 ==== mtrace ==== ==== mtrace ====
   * součástí GNU C knihovny   * součástí GNU C knihovny
debuging_c.1446564442.txt.gz · Poslední úprava: (upraveno mimo DokuWiki)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki