Valgrind: Memcheck, a memory error detector
Valgrind je pomocník pro hledání nekorektní správy paměti - nahlásí třeba čtení z neinicializovaných proměnných, memory leaky, přístupy do paměti, která není přidělena (mimo hranice).
Bývá běžně dostupný z repositářů.
Když pustím bird bota pomocí valgrindu takto:
valgrind --log-file=log.valgrind --leak-check=full --tool=memcheck --time-stamp=yes --leak-resolution=high --num-callers=40 ./birdbot -s /tmp/bird.ctl -d
Do souboru log.valgrind
se zachytí:
==00:00:00:00.000 5420== Memcheck, a memory error detector
==00:00:00:00.000 5420== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==00:00:00:00.000 5420== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==00:00:00:00.000 5420== Command: ./birdbot -s /tmp/bird.ctl -d
==00:00:00:00.000 5420== Parent PID: 5249
==00:00:00:00.000 5420==
==00:00:00:01.366 5420== Conditional jump or move depends on uninitialised value(s)
==00:00:00:01.368 5420== at 0x4C29518: __GI_strlen (mc_replace_strmem.c:391)
==00:00:00:01.368 5420== by 0x5C16D1A: puts (ioputs.c:37)
==00:00:00:01.368 5420== by 0x404EF0: print_config (cbirdbot.c:796)
==00:00:00:01.368 5420== by 0x402B76: main (cbirdbot.c:1190)
==00:00:00:01.368 5420==
==00:00:00:01.369 5420== Conditional jump or move depends on uninitialised value(s)
==00:00:00:01.369 5420== at 0x4C29518: __GI_strlen (mc_replace_strmem.c:391)
==00:00:00:01.370 5420== by 0x5C16D1A: puts (ioputs.c:37)
==00:00:00:01.370 5420== by 0x404F20: print_config (cbirdbot.c:803)
==00:00:00:01.370 5420== by 0x402B76: main (cbirdbot.c:1190)
==00:00:00:01.370 5420==
==00:00:00:01.602 5420== Invalid read of size 4
==00:00:00:01.602 5420== at 0x546A9F9: idna_to_ascii_4z (in /usr/lib/x86_64-linux-gnu/libidn.so.11.6.8)
==00:00:00:01.602 5420== by 0x525941D: _lm_utils_hostname_to_punycode (in /usr/lib/libloudmouth-1.so.0.1.0)
==00:00:00:01.602 5420== by 0x5253960: lm_connection_new (in /usr/lib/libloudmouth-1.so.0.1.0)
==00:00:00:01.602 5420== by 0x4029A3: main (cbirdbot.c:1354)
==00:00:00:01.602 5420== Address 0x7514efc is 12 bytes inside a block of size 15 alloc'd
==00:00:00:01.602 5420== at 0x4C28CCE: realloc (vg_replace_malloc.c:632)
==00:00:00:01.602 5420== by 0x546AA7D: idna_to_ascii_4z (in /usr/lib/x86_64-linux-gnu/libidn.so.11.6.8)
==00:00:00:01.602 5420== by 0x525941D: _lm_utils_hostname_to_punycode (in /usr/lib/libloudmouth-1.so.0.1.0)
==00:00:00:01.602 5420== by 0x5253960: lm_connection_new (in /usr/lib/libloudmouth-1.so.0.1.0)
==00:00:00:01.602 5420== by 0x4029A3: main (cbirdbot.c:1354)
==00:00:00:01.602 5420==
==00:00:00:01.758 5420== Thread 3:
==00:00:00:01.759 5420== Syscall param select(timeout) points to uninitialised byte(s)
==00:00:00:01.759 5420== at 0x5C832B3: ??? (syscall-template.S:82)
==00:00:00:01.759 5420== by 0x4050E4: xmpp_keep_alive_thread (cbirdbot.c:1018)
==00:00:00:01.759 5420== by 0x5997B4F: start_thread (pthread_create.c:304)
==00:00:00:01.759 5420== Address 0x8912e38 is on thread 3's stack
==00:00:00:01.759 5420==
==00:00:06:24.722 5420==
==00:00:06:24.723 5420== HEAP SUMMARY:
==00:00:06:24.723 5420== in use at exit: 25,232 bytes in 186 blocks
==00:00:06:24.723 5420== total heap usage: 4,531 allocs, 4,345 frees, 438,221 bytes allocated
==00:00:06:24.723 5420==
==00:00:06:24.727 5420== Thread 1:
==00:00:06:24.727 5420== 10 bytes in 1 blocks are definitely lost in loss record 9 of 100
==00:00:06:24.727 5420== at 0x4C28BED: malloc (vg_replace_malloc.c:263)
==00:00:06:24.727 5420== by 0x56E8F30: g_malloc (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.727 5420== by 0x56FE98B: g_strdup (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.727 5420== by 0x5255DBC: ??? (in /usr/lib/libloudmouth-1.so.0.1.0)
==00:00:06:24.727 5420== by 0x5257076: ??? (in /usr/lib/libloudmouth-1.so.0.1.0)
==00:00:06:24.727 5420== by 0x56E3354: g_main_context_dispatch (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.727 5420== by 0x56E3687: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.727 5420== by 0x56E3A81: g_main_loop_run (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.727 5420== by 0x402AEA: main (cbirdbot.c:1399)
==00:00:06:24.727 5420==
==00:00:06:24.727 5420== 16 bytes in 1 blocks are possibly lost in loss record 19 of 100
==00:00:06:24.727 5420== at 0x4C272B8: calloc (vg_replace_malloc.c:566)
==00:00:06:24.727 5420== by 0x56E8F88: g_malloc0 (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.727 5420== by 0x5254E94: lm_connection_register_message_handler (in /usr/lib/libloudmouth-1.so.0.1.0)
==00:00:06:24.727 5420== by 0x525C938: ??? (in /usr/lib/libloudmouth-1.so.0.1.0)
==00:00:06:24.727 5420== by 0x5255F3E: ??? (in /usr/lib/libloudmouth-1.so.0.1.0)
==00:00:06:24.727 5420== by 0x5257076: ??? (in /usr/lib/libloudmouth-1.so.0.1.0)
==00:00:06:24.727 5420== by 0x56E3354: g_main_context_dispatch (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.727 5420== by 0x56E3687: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.727 5420== by 0x56E3A81: g_main_loop_run (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.727 5420== by 0x402AEA: main (cbirdbot.c:1399)
==00:00:06:24.727 5420==
==00:00:06:24.727 5420== 16 bytes in 1 blocks are possibly lost in loss record 20 of 100
==00:00:06:24.727 5420== at 0x4C272B8: calloc (vg_replace_malloc.c:566)
==00:00:06:24.727 5420== by 0x56E8F88: g_malloc0 (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.727 5420== by 0x5254E94: lm_connection_register_message_handler (in /usr/lib/libloudmouth-1.so.0.1.0)
==00:00:06:24.728 5420== by 0x525C9C5: ??? (in /usr/lib/libloudmouth-1.so.0.1.0)
==00:00:06:24.728 5420== by 0x5255054: lm_connection_authenticate (in /usr/lib/libloudmouth-1.so.0.1.0)
==00:00:06:24.728 5420== by 0x405002: xmpp_conn_open_handler (cbirdbot.c:867)
==00:00:06:24.728 5420== by 0x5255EE7: ??? (in /usr/lib/libloudmouth-1.so.0.1.0)
==00:00:06:24.728 5420== by 0x5257076: ??? (in /usr/lib/libloudmouth-1.so.0.1.0)
==00:00:06:24.728 5420== by 0x56E3354: g_main_context_dispatch (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.728 5420== by 0x56E3687: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.728 5420== by 0x56E3A81: g_main_loop_run (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.728 5420== by 0x402AEA: main (cbirdbot.c:1399)
==00:00:06:24.728 5420==
==00:00:06:24.728 5420== 16 bytes in 1 blocks are possibly lost in loss record 21 of 100
==00:00:06:24.728 5420== at 0x4C272B8: calloc (vg_replace_malloc.c:566)
==00:00:06:24.728 5420== by 0x56E8F88: g_malloc0 (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.728 5420== by 0x5254E94: lm_connection_register_message_handler (in /usr/lib/libloudmouth-1.so.0.1.0)
==00:00:06:24.728 5420== by 0x525C9EF: ??? (in /usr/lib/libloudmouth-1.so.0.1.0)
==00:00:06:24.728 5420== by 0x5255054: lm_connection_authenticate (in /usr/lib/libloudmouth-1.so.0.1.0)
==00:00:06:24.728 5420== by 0x405002: xmpp_conn_open_handler (cbirdbot.c:867)
==00:00:06:24.728 5420== by 0x5255EE7: ??? (in /usr/lib/libloudmouth-1.so.0.1.0)
==00:00:06:24.728 5420== by 0x5257076: ??? (in /usr/lib/libloudmouth-1.so.0.1.0)
==00:00:06:24.728 5420== by 0x56E3354: g_main_context_dispatch (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.728 5420== by 0x56E3687: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.728 5420== by 0x56E3A81: g_main_loop_run (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.728 5420== by 0x402AEA: main (cbirdbot.c:1399)
==00:00:06:24.728 5420==
==00:00:06:24.728 5420== 64 bytes in 1 blocks are definitely lost in loss record 64 of 100
==00:00:06:24.728 5420== at 0x4C28CCE: realloc (vg_replace_malloc.c:632)
==00:00:06:24.728 5420== by 0x56E8FCE: g_realloc (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.728 5420== by 0x5700CA6: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.728 5420== by 0x5702054: g_string_append_vprintf (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.728 5420== by 0x5702256: g_string_append_printf (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.728 5420== by 0x5256FC4: lm_message_node_to_string (in /usr/lib/libloudmouth-1.so.0.1.0)
==00:00:06:24.728 5420== by 0x4037F5: xmpp_conn_auth_handler (cbirdbot.c:850)
==00:00:06:24.728 5420== by 0x5253456: ??? (in /usr/lib/libloudmouth-1.so.0.1.0)
==00:00:06:24.728 5420== by 0x52544D8: ??? (in /usr/lib/libloudmouth-1.so.0.1.0)
==00:00:06:24.728 5420== by 0x5255CD6: ??? (in /usr/lib/libloudmouth-1.so.0.1.0)
==00:00:06:24.728 5420== by 0x5257076: ??? (in /usr/lib/libloudmouth-1.so.0.1.0)
==00:00:06:24.728 5420== by 0x56E3354: g_main_context_dispatch (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.728 5420== by 0x56E3687: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.728 5420== by 0x56E3A81: g_main_loop_run (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.728 5420== by 0x402AEA: main (cbirdbot.c:1399)
==00:00:06:24.728 5420==
==00:00:06:24.728 5420== 720 bytes in 3 blocks are possibly lost in loss record 90 of 100
==00:00:06:24.728 5420== at 0x4C270FE: memalign (vg_replace_malloc.c:694)
==00:00:06:24.728 5420== by 0x4C271A7: posix_memalign (vg_replace_malloc.c:835)
==00:00:06:24.728 5420== by 0x56B5DCD: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.728 5420== by 0x56FD810: g_slice_alloc (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.728 5420== by 0x56FE07B: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.728 5420== by 0x5254EBA: lm_connection_register_message_handler (in /usr/lib/libloudmouth-1.so.0.1.0)
==00:00:06:24.728 5420== by 0x4029FE: main (cbirdbot.c:1373)
==00:00:06:24.728 5420==
==00:00:06:24.729 5420== 960 bytes in 4 blocks are possibly lost in loss record 91 of 100
==00:00:06:24.729 5420== at 0x4C270FE: memalign (vg_replace_malloc.c:694)
==00:00:06:24.729 5420== by 0x4C271A7: posix_memalign (vg_replace_malloc.c:835)
==00:00:06:24.729 5420== by 0x56B5DCD: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.729 5420== by 0x56FD810: g_slice_alloc (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.729 5420== by 0x56FE11D: g_slist_prepend (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.729 5420== by 0x525683F: lm_message_node_set_attribute (in /usr/lib/libloudmouth-1.so.0.1.0)
==00:00:06:24.729 5420== by 0x52568F8: lm_message_node_set_attributes (in /usr/lib/libloudmouth-1.so.0.1.0)
==00:00:06:24.729 5420== by 0x5257870: ??? (in /usr/lib/libloudmouth-1.so.0.1.0)
==00:00:06:24.729 5420== by 0x56E5DF8: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.729 5420== by 0x56E74F8: g_markup_parse_context_parse (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.729 5420== by 0x5257AAE: lm_parser_parse (in /usr/lib/libloudmouth-1.so.0.1.0)
==00:00:06:24.729 5420== by 0x525A92E: ??? (in /usr/lib/libloudmouth-1.so.0.1.0)
==00:00:06:24.729 5420== by 0x56E3354: g_main_context_dispatch (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.729 5420== by 0x56E3687: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.729 5420== by 0x56E3A81: g_main_loop_run (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.729 5420== by 0x402AEA: main (cbirdbot.c:1399)
==00:00:06:24.729 5420==
==00:00:06:24.729 5420== 960 bytes in 4 blocks are possibly lost in loss record 92 of 100
==00:00:06:24.729 5420== at 0x4C270FE: memalign (vg_replace_malloc.c:694)
==00:00:06:24.729 5420== by 0x4C271A7: posix_memalign (vg_replace_malloc.c:835)
==00:00:06:24.729 5420== by 0x56B5DCD: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.729 5420== by 0x56FD810: g_slice_alloc (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.729 5420== by 0x56FE11D: g_slist_prepend (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.729 5420== by 0x525683F: lm_message_node_set_attribute (in /usr/lib/libloudmouth-1.so.0.1.0)
==00:00:06:24.729 5420== by 0x52562C2: lm_message_new (in /usr/lib/libloudmouth-1.so.0.1.0)
==00:00:06:24.729 5420== by 0x525632C: lm_message_new_with_sub_type (in /usr/lib/libloudmouth-1.so.0.1.0)
==00:00:06:24.729 5420== by 0x40513E: xmpp_keep_alive_thread (cbirdbot.c:1023)
==00:00:06:24.729 5420== by 0x5997B4F: start_thread (pthread_create.c:304)
==00:00:06:24.729 5420==
==00:00:06:24.729 5420== 1,488 bytes in 3 blocks are possibly lost in loss record 96 of 100
==00:00:06:24.729 5420== at 0x4C270FE: memalign (vg_replace_malloc.c:694)
==00:00:06:24.729 5420== by 0x4C271A7: posix_memalign (vg_replace_malloc.c:835)
==00:00:06:24.729 5420== by 0x56B5DCD: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.729 5420== by 0x56FD810: g_slice_alloc (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.729 5420== by 0x56FD875: g_slice_alloc0 (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.729 5420== by 0x5706419: g_thread_self (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.729 5420== by 0x56E3A1C: g_main_loop_run (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==00:00:06:24.729 5420== by 0x402AEA: main (cbirdbot.c:1399)
==00:00:06:24.729 5420==
==00:00:06:24.729 5420== LEAK SUMMARY:
==00:00:06:24.729 5420== definitely lost: 74 bytes in 2 blocks
==00:00:06:24.729 5420== indirectly lost: 0 bytes in 0 blocks
==00:00:06:24.729 5420== possibly lost: 4,176 bytes in 17 blocks
==00:00:06:24.729 5420== still reachable: 20,982 bytes in 167 blocks
==00:00:06:24.729 5420== suppressed: 0 bytes in 0 blocks
==00:00:06:24.729 5420== Reachable blocks (those to which a pointer was found) are not shown.
==00:00:06:24.729 5420== To see them, rerun with: --leak-check=full --show-reachable=yes
==00:00:06:24.729 5420==
==00:00:06:24.729 5420== For counts of detected and suppressed errors, rerun with: -v
==00:00:06:24.729 5420== Use --track-origins=yes to see where uninitialised values come from
==00:00:06:24.729 5420== ERROR SUMMARY: 18 errors from 13 contexts (suppressed: 4 from 4)
Některé chyby jsou možná nejsou ani způsobené přímo bird botem. Nevím. Ale třeba se to povede vše opravit.