Obsah

Ladění a odvšivování C

Obecné nástroje

ps

ps axjf | less
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
12052 12540 12540 12540 ?           -1 Ss       0   0:00  \_ sshd: flowmon [priv]
12540 12542 12540 12540 ?           -1 S      500   0:03  |   \_ sshd: flowmon@pts/0
12542 12543 12543 12543 pts/0    24512 Ss     500   0:00  |       \_ -bash
12543 24511 24511 12543 pts/0    24512 S        0   0:00  |           \_ su
24511 24512 24512 12543 pts/0    24512 S+       0   0:00  |               \_ bash
ps -eFL | grep "/bin/some"
UID        PID  PPID   LWP  C NLWP    SZ   RSS PSR STIME TTY          TIME CMD
503      26207 10278 26207 11    4 1455062 4857636 6 Nov15 ?      13:28:28 /bin/something
503      26207 10278 26207 11    4 1455062 4857636 6 Nov15 ?      13:28:28 /bin/something
503      26207 10278 26768  0    4 1455062 4857636 1 Nov15 ?      00:00:00 /bin/something
503      26207 10278  1849  0    4 1455062 4857636 1 Nov18 ?      00:00:00 /bin/something
503      26207 10278  1850  0    4 1455062 4857636 3 Nov18 ?      00:00:00 /bin/something
ps -ef | grep postgress
UID        PID  PPID  C STIME TTY          TIME CMD
postgres  7534  4669  0 Dec01 ?        00:01:04 postgres: somebody somebody 127.0.0.1(37573) VACUUM
postgres 13828  4669  0 Dec01 ?        00:01:28 postgres: somebody somebody 127.0.0.1(35066) VACUUM
postgres 14167  4669  0 Dec01 ?        00:01:11 postgres: somebody somebody 127.0.0.1(60953) VACUUM
postgres 16436  4669  0 Dec01 ?        00:01:19 postgres: somebody somebody 127.0.0.1(58098) VACUUM
ps ax | grep postgress
  PID TTY      STAT   TIME COMMAND
 7534 ?        D      1:04 postgres: somebody somebody 127.0.0.1(37573) VACUUM
13828 ?        D      1:28 postgres: somebody somebody 127.0.0.1(35066) VACUUM
14167 ?        D      1:12 postgres: somebody somebody 127.0.0.1(60953) VACUUM
16436 ?        D      1:19 postgres: somebody somebody 127.0.0.1(58098) VACUUM
17723 ?        D      1:07 postgres: somebody somebody 127.0.0.1(47033) VACUUM

top

top - 18:20:11 up 83 days, 10:59,  1 user,  load average: 0.06, 0.10, 0.09
Tasks: 137 total,   2 running, 135 sleeping,   0 stopped,   0 zombie
Cpu0  :  5.1%us,  1.0%sy,  0.0%ni, 92.5%id,  1.0%wa,  0.0%hi,  0.3%si,  0.0%st
Cpu1  :  5.2%us,  0.9%sy,  0.0%ni, 93.1%id,  0.7%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   2059524k total,  1823764k used,   235760k free,   212016k buffers
Swap:  1028312k total,    90556k used,   937756k free,  1218500k cached
  PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM     TIME+ COMMAND
16069 somebody  20   0 1385m  95m  60m S  10,0  1,2   2:08.56 vlc
22567 somebody  20   0 1889m 274m  97m S   8,3  3,5 131:34.02 gnome-shell
22291 somebody  20   0  324m 129m  58m S   5,7  1,6  71:22.25 Xorg
 5685 somebody  20   0  642m   9m 5764 S   3,7  0,1 107:27.06 pulseaudio

lsof

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

strace

gdb

gcore

pmap

time

real    2m4.884s
user    0m52.677s
sys     0m2.528

Diagnostika neoprávněného přístupu do paměti

V céčku jsou nejoblibenější chyby typu segmentation fault. Objevují se totiž náhodně, hlavně když si programátor myslí, že už to má určitě dobře

Nástroje

valgrind

address sanitizer

Google's tcmalloc heapprofiler

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
Dumping heap profile to /tmp/heapprof7.0001.heap (476 MB currently in use)
Dumping heap profile to /tmp/heapprof7.0002.heap (667 MB currently in use)
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 /data/xx_memtest.
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
$ HEAPPROFILE=/data/ads/tmp/ads-nf-loader.memprof LD_PRELOAD=/data/ads/tmp/bari-memprof/libtcmalloc.so.4.2.6 ads-nf-loader
$ 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
..

Heaptrack

mtrace

Memory not freed:
-----------------
           Address     Size     Caller
0x0000000001b75460      0x4  at /home/bari/Plocha/heaptest/mtrace/badcode-mtrace.c:10

memprof

http://www.secretlabs.de/projects/memprof/

gdb-heap

Dmalloc

http://dmalloc.com/

vlastní nástroj

LD_PRELOAD

Backtrace