* [Bug libbacktrace/105240] backtrace_pcinfo leaks memory
2022-04-12 14:49 [Bug libbacktrace/105240] New: backtrace_pcinfo leaks memory redi at gcc dot gnu.org
@ 2022-04-12 14:50 ` redi at gcc dot gnu.org
2022-04-12 14:52 ` redi at gcc dot gnu.org
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: redi at gcc dot gnu.org @ 2022-04-12 14:50 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105240
Jonathan Wakely <redi at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Last reconfirmed| |2022-04-12
Status|UNCONFIRMED |NEW
Ever confirmed|0 |1
--- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> ---
This simple C++ program:
#include <backtrace.h>
int cb_pcinfo(void*, uintptr_t, const char*, int, const char* function)
{ return function != nullptr; }
int cb(void* p, uintptr_t pc) { *static_cast<uintptr_t*>(p) = pc; return 1; }
int main()
{
auto state = backtrace_create_state(nullptr, 1, nullptr, nullptr);
uintptr_t pc;
backtrace_simple(state, 0, cb, nullptr, &pc);
backtrace_pcinfo(state, pc, cb_pcinfo, nullptr, nullptr);
}
Built with:
g++ bt.cc build/libbacktrace/.libs/libbacktrace.a -I
~/src/gcc/gcc/libbacktrace/ -g
When run under valgrind shows:
valgrind --leak-check=full ./a.out
==410984== Memcheck, a memory error detector
==410984== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==410984== Using Valgrind-3.18.1 and LibVEX; rerun with -h for copyright info
==410984== Command: ./a.out
==410984==
==410984==
==410984== HEAP SUMMARY:
==410984== in use at exit: 112,638,104 bytes in 729,676 blocks
==410984== total heap usage: 729,861 allocs, 185 frees, 115,412,593 bytes
allocated
==410984==
==410984== 84 bytes in 3 blocks are definitely lost in loss record 5 of 43
==410984== at 0x484086F: malloc (vg_replace_malloc.c:381)
==410984== by 0x406FF1: backtrace_alloc (alloc.c:57)
==410984== by 0x409283: read_lnct (dwarf.c:2543)
==410984== by 0x409283: read_line_header_format_entries (dwarf.c:2618)
==410984== by 0x40B08A: read_line_header (dwarf.c:2712)
==410984== by 0x40B08A: read_line_info (dwarf.c:2965)
==410984== by 0x40B08A: dwarf_lookup_pc (dwarf.c:3747)
==410984== by 0x40C1BE: dwarf_fileline (dwarf.c:3935)
==410984== by 0x40134E: main (bt.cc:13)
==410984==
==410984== 13,920 bytes in 1 blocks are definitely lost in loss record 25 of 43
==410984== at 0x484086F: malloc (vg_replace_malloc.c:381)
==410984== by 0x406FF1: backtrace_alloc (alloc.c:57)
==410984== by 0x406ED6: backtrace_get_view (read.c:68)
==410984== by 0x40568A: elf_get_view (elf.c:426)
==410984== by 0x40568A: elf_add (elf.c:4329)
==410984== by 0x406BC8: phdr_callback (elf.c:4848)
==410984== by 0x4D2A314: dl_iterate_phdr (dl-iteratephdr.c:75)
==410984== by 0x406DDD: backtrace_initialize (elf.c:4892)
==410984== by 0x4014B1: fileline_initialize (fileline.c:261)
==410984== by 0x401581: backtrace_pcinfo (fileline.c:295)
==410984== by 0x40134E: main (bt.cc:13)
==410984==
==410984== 31,248 bytes in 1 blocks are possibly lost in loss record 28 of 43
==410984== at 0x48456AF: realloc (vg_replace_malloc.c:1437)
==410984== by 0x407115: backtrace_vector_release (alloc.c:159)
==410984== by 0x40CDCD: build_dwarf_data (dwarf.c:3976)
==410984== by 0x40CDCD: backtrace_dwarf_add (dwarf.c:4022)
==410984== by 0x406475: elf_add (elf.c:4749)
==410984== by 0x4060E9: elf_add (elf.c:4434)
==410984== by 0x406BC8: phdr_callback (elf.c:4848)
==410984== by 0x4D2A314: dl_iterate_phdr (dl-iteratephdr.c:75)
==410984== by 0x406DDD: backtrace_initialize (elf.c:4892)
==410984== by 0x4014B1: fileline_initialize (fileline.c:261)
==410984== by 0x401581: backtrace_pcinfo (fileline.c:295)
==410984== by 0x40134E: main (bt.cc:13)
==410984==
==410984== 69,736 bytes in 2 blocks are possibly lost in loss record 30 of 43
==410984== at 0x484086F: malloc (vg_replace_malloc.c:381)
==410984== by 0x406FF1: backtrace_alloc (alloc.c:57)
==410984== by 0x406ED6: backtrace_get_view (read.c:68)
==410984== by 0x40568A: elf_get_view (elf.c:426)
==410984== by 0x40568A: elf_add (elf.c:4329)
==410984== by 0x406BC8: phdr_callback (elf.c:4848)
==410984== by 0x4D2A314: dl_iterate_phdr (dl-iteratephdr.c:75)
==410984== by 0x406DDD: backtrace_initialize (elf.c:4892)
==410984== by 0x4014B1: fileline_initialize (fileline.c:261)
==410984== by 0x401581: backtrace_pcinfo (fileline.c:295)
==410984== by 0x40134E: main (bt.cc:13)
==410984==
==410984== 164,768 bytes in 1 blocks are possibly lost in loss record 31 of 43
==410984== at 0x484086F: malloc (vg_replace_malloc.c:381)
==410984== by 0x406FF1: backtrace_alloc (alloc.c:57)
==410984== by 0x406ED6: backtrace_get_view (read.c:68)
==410984== by 0x405C50: elf_add (elf.c:4591)
==410984== by 0x406BC8: phdr_callback (elf.c:4848)
==410984== by 0x4D2A314: dl_iterate_phdr (dl-iteratephdr.c:75)
==410984== by 0x406DDD: backtrace_initialize (elf.c:4892)
==410984== by 0x4014B1: fileline_initialize (fileline.c:261)
==410984== by 0x401581: backtrace_pcinfo (fileline.c:295)
==410984== by 0x40134E: main (bt.cc:13)
==410984==
==410984== 174,888 bytes in 3 blocks are possibly lost in loss record 32 of 43
==410984== at 0x48456AF: realloc (vg_replace_malloc.c:1437)
==410984== by 0x407115: backtrace_vector_release (alloc.c:159)
==410984== by 0x40CDAA: build_dwarf_data (dwarf.c:3974)
==410984== by 0x40CDAA: backtrace_dwarf_add (dwarf.c:4022)
==410984== by 0x406475: elf_add (elf.c:4749)
==410984== by 0x4060E9: elf_add (elf.c:4434)
==410984== by 0x406BC8: phdr_callback (elf.c:4848)
==410984== by 0x4D2A314: dl_iterate_phdr (dl-iteratephdr.c:75)
==410984== by 0x406DDD: backtrace_initialize (elf.c:4892)
==410984== by 0x4014B1: fileline_initialize (fileline.c:261)
==410984== by 0x401581: backtrace_pcinfo (fileline.c:295)
==410984== by 0x40134E: main (bt.cc:13)
==410984==
==410984== 231,094 bytes in 1 blocks are possibly lost in loss record 33 of 43
==410984== at 0x484086F: malloc (vg_replace_malloc.c:381)
==410984== by 0x406FF1: backtrace_alloc (alloc.c:57)
==410984== by 0x406ED6: backtrace_get_view (read.c:68)
==410984== by 0x405C50: elf_add (elf.c:4591)
==410984== by 0x406D83: backtrace_initialize (elf.c:4877)
==410984== by 0x4014B1: fileline_initialize (fileline.c:261)
==410984== by 0x401581: backtrace_pcinfo (fileline.c:295)
==410984== by 0x40134E: main (bt.cc:13)
==410984==
==410984== 308,808 bytes in 3 blocks are possibly lost in loss record 35 of 43
==410984== at 0x484086F: malloc (vg_replace_malloc.c:381)
==410984== by 0x406FF1: backtrace_alloc (alloc.c:57)
==410984== by 0x4067B5: elf_initialize_syminfo (elf.c:661)
==410984== by 0x4067B5: elf_add (elf.c:4392)
==410984== by 0x406BC8: phdr_callback (elf.c:4848)
==410984== by 0x4D2A314: dl_iterate_phdr (dl-iteratephdr.c:75)
==410984== by 0x406DDD: backtrace_initialize (elf.c:4892)
==410984== by 0x4014B1: fileline_initialize (fileline.c:261)
==410984== by 0x401581: backtrace_pcinfo (fileline.c:295)
==410984== by 0x40134E: main (bt.cc:13)
==410984==
==410984== 438,981 bytes in 4 blocks are possibly lost in loss record 36 of 43
==410984== at 0x484086F: malloc (vg_replace_malloc.c:381)
==410984== by 0x406FF1: backtrace_alloc (alloc.c:57)
==410984== by 0x406ED6: backtrace_get_view (read.c:68)
==410984== by 0x40667B: elf_add (elf.c:4381)
==410984== by 0x406BC8: phdr_callback (elf.c:4848)
==410984== by 0x4D2A314: dl_iterate_phdr (dl-iteratephdr.c:75)
==410984== by 0x406DDD: backtrace_initialize (elf.c:4892)
==410984== by 0x4014B1: fileline_initialize (fileline.c:261)
==410984== by 0x401581: backtrace_pcinfo (fileline.c:295)
==410984== by 0x40134E: main (bt.cc:13)
==410984==
==410984== 767,840 bytes in 4,799 blocks are possibly lost in loss record 37 of
43
==410984== at 0x484086F: malloc (vg_replace_malloc.c:381)
==410984== by 0x406FF1: backtrace_alloc (alloc.c:57)
==410984== by 0x40C54F: build_address_map (dwarf.c:2183)
==410984== by 0x40C54F: build_dwarf_data (dwarf.c:3969)
==410984== by 0x40C54F: backtrace_dwarf_add (dwarf.c:4022)
==410984== by 0x406475: elf_add (elf.c:4749)
==410984== by 0x4060E9: elf_add (elf.c:4434)
==410984== by 0x406BC8: phdr_callback (elf.c:4848)
==410984== by 0x4D2A314: dl_iterate_phdr (dl-iteratephdr.c:75)
==410984== by 0x406DDD: backtrace_initialize (elf.c:4892)
==410984== by 0x4014B1: fileline_initialize (fileline.c:261)
==410984== by 0x401581: backtrace_pcinfo (fileline.c:295)
==410984== by 0x40134E: main (bt.cc:13)
==410984==
==410984== 16,608,019 (72 direct, 16,607,947 indirect) bytes in 1 blocks are
definitely lost in loss record 40 of 43
==410984== at 0x484086F: malloc (vg_replace_malloc.c:381)
==410984== by 0x406FF1: backtrace_alloc (alloc.c:57)
==410984== by 0x401773: backtrace_create_state (state.c:66)
==410984== by 0x401308: main (bt.cc:10)
==410984==
==410984== 18,629,920 bytes in 5,066 blocks are possibly lost in loss record 41
of 43
==410984== at 0x484086F: malloc (vg_replace_malloc.c:381)
==410984== by 0x406FF1: backtrace_alloc (alloc.c:57)
==410984== by 0x40C747: read_abbrevs (dwarf.c:1409)
==410984== by 0x40C747: build_address_map (dwarf.c:2197)
==410984== by 0x40C747: build_dwarf_data (dwarf.c:3969)
==410984== by 0x40C747: backtrace_dwarf_add (dwarf.c:4022)
==410984== by 0x406475: elf_add (elf.c:4749)
==410984== by 0x4060E9: elf_add (elf.c:4434)
==410984== by 0x406BC8: phdr_callback (elf.c:4848)
==410984== by 0x4D2A314: dl_iterate_phdr (dl-iteratephdr.c:75)
==410984== by 0x406DDD: backtrace_initialize (elf.c:4892)
==410984== by 0x4014B1: fileline_initialize (fileline.c:261)
==410984== by 0x401581: backtrace_pcinfo (fileline.c:295)
==410984== by 0x40134E: main (bt.cc:13)
==410984==
==410984== 21,644,094 bytes in 5 blocks are possibly lost in loss record 42 of
43
==410984== at 0x484086F: malloc (vg_replace_malloc.c:381)
==410984== by 0x406FF1: backtrace_alloc (alloc.c:57)
==410984== by 0x406ED6: backtrace_get_view (read.c:68)
==410984== by 0x405C50: elf_add (elf.c:4591)
==410984== by 0x4060E9: elf_add (elf.c:4434)
==410984== by 0x406BC8: phdr_callback (elf.c:4848)
==410984== by 0x4D2A314: dl_iterate_phdr (dl-iteratephdr.c:75)
==410984== by 0x406DDD: backtrace_initialize (elf.c:4892)
==410984== by 0x4014B1: fileline_initialize (fileline.c:261)
==410984== by 0x401581: backtrace_pcinfo (fileline.c:295)
==410984== by 0x40134E: main (bt.cc:13)
==410984==
==410984== 53,554,704 bytes in 575,533 blocks are possibly lost in loss record
43 of 43
==410984== at 0x484086F: malloc (vg_replace_malloc.c:381)
==410984== by 0x406FF1: backtrace_alloc (alloc.c:57)
==410984== by 0x40CB1E: read_abbrevs (dwarf.c:1457)
==410984== by 0x40CB1E: build_address_map (dwarf.c:2197)
==410984== by 0x40CB1E: build_dwarf_data (dwarf.c:3969)
==410984== by 0x40CB1E: backtrace_dwarf_add (dwarf.c:4022)
==410984== by 0x406475: elf_add (elf.c:4749)
==410984== by 0x4060E9: elf_add (elf.c:4434)
==410984== by 0x406BC8: phdr_callback (elf.c:4848)
==410984== by 0x4D2A314: dl_iterate_phdr (dl-iteratephdr.c:75)
==410984== by 0x406DDD: backtrace_initialize (elf.c:4892)
==410984== by 0x4014B1: fileline_initialize (fileline.c:261)
==410984== by 0x401581: backtrace_pcinfo (fileline.c:295)
==410984== by 0x40134E: main (bt.cc:13)
==410984==
==410984== LEAK SUMMARY:
==410984== definitely lost: 14,076 bytes in 5 blocks
==410984== indirectly lost: 16,607,947 bytes in 144,253 blocks
==410984== possibly lost: 96,016,081 bytes in 585,418 blocks
==410984== still reachable: 0 bytes in 0 blocks
==410984== of which reachable via heuristic:
==410984== newarray : 4,064 bytes in 1 blocks
==410984== suppressed: 0 bytes in 0 blocks
==410984==
==410984== For lists of detected and suppressed errors, rerun with: -s
==410984== ERROR SUMMARY: 14 errors from 14 contexts (suppressed: 0 from 0)
^ permalink raw reply [flat|nested] 6+ messages in thread
* [Bug libbacktrace/105240] backtrace_pcinfo leaks memory
2022-04-12 14:49 [Bug libbacktrace/105240] New: backtrace_pcinfo leaks memory redi at gcc dot gnu.org
` (2 preceding siblings ...)
2022-04-12 16:31 ` ian at airs dot com
@ 2022-04-12 17:39 ` redi at gcc dot gnu.org
2022-04-12 21:39 ` cvs-commit at gcc dot gnu.org
4 siblings, 0 replies; 6+ messages in thread
From: redi at gcc dot gnu.org @ 2022-04-12 17:39 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105240
--- Comment #4 from Jonathan Wakely <redi at gcc dot gnu.org> ---
The report in comment 0 is from libstdc++ which uses a local static variable to
hold the state.
Modifying the comment 1 example to use a global:
#include <backtrace.h>
int cb_pcinfo(void*, uintptr_t, const char*, int, const char* function)
{ return function != nullptr; }
int cb(void* p, uintptr_t pc) { *static_cast<uintptr_t*>(p) = pc; return 1; }
backtrace_state* state;
int main()
{
state = backtrace_create_state(nullptr, 1, nullptr, nullptr);
uintptr_t pc;
backtrace_simple(state, 0, cb, nullptr, &pc);
backtrace_pcinfo(state, pc, cb_pcinfo, nullptr, nullptr);
}
I get:
==494586== Memcheck, a memory error detector
==494586== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==494586== Using Valgrind-3.18.1 and LibVEX; rerun with -h for copyright info
==494586== Command: ./a.out
==494586==
==494586==
==494586== HEAP SUMMARY:
==494586== in use at exit: 112,638,181 bytes in 729,676 blocks
==494586== total heap usage: 729,861 allocs, 185 frees, 115,412,694 bytes
allocated
==494586==
==494586== 84 bytes in 3 blocks are definitely lost in loss record 6 of 35
==494586== at 0x484086F: malloc (vg_replace_malloc.c:381)
==494586== by 0x406FF1: backtrace_alloc (alloc.c:57)
==494586== by 0x409283: read_lnct (dwarf.c:2543)
==494586== by 0x409283: read_line_header_format_entries (dwarf.c:2618)
==494586== by 0x40B08A: read_line_header (dwarf.c:2712)
==494586== by 0x40B08A: read_line_info (dwarf.c:2965)
==494586== by 0x40B08A: dwarf_lookup_pc (dwarf.c:3747)
==494586== by 0x40C1BE: dwarf_fileline (dwarf.c:3935)
==494586== by 0x401357: main (bt.cc:15)
==494586==
==494586== 2,839 bytes in 1 blocks are possibly lost in loss record 19 of 35
==494586== at 0x484086F: malloc (vg_replace_malloc.c:381)
==494586== by 0x406FF1: backtrace_alloc (alloc.c:57)
==494586== by 0x406ED6: backtrace_get_view (read.c:68)
==494586== by 0x40667B: elf_add (elf.c:4381)
==494586== by 0x406D83: backtrace_initialize (elf.c:4877)
==494586== by 0x4014B1: fileline_initialize (fileline.c:261)
==494586== by 0x401581: backtrace_pcinfo (fileline.c:295)
==494586== by 0x401357: main (bt.cc:15)
==494586==
==494586== 13,920 bytes in 1 blocks are definitely lost in loss record 23 of 35
==494586== at 0x484086F: malloc (vg_replace_malloc.c:381)
==494586== by 0x406FF1: backtrace_alloc (alloc.c:57)
==494586== by 0x406ED6: backtrace_get_view (read.c:68)
==494586== by 0x40568A: elf_get_view (elf.c:426)
==494586== by 0x40568A: elf_add (elf.c:4329)
==494586== by 0x406BC8: phdr_callback (elf.c:4848)
==494586== by 0x4D2A314: dl_iterate_phdr (dl-iteratephdr.c:75)
==494586== by 0x406DDD: backtrace_initialize (elf.c:4892)
==494586== by 0x4014B1: fileline_initialize (fileline.c:261)
==494586== by 0x401581: backtrace_pcinfo (fileline.c:295)
==494586== by 0x401357: main (bt.cc:15)
==494586==
==494586== 69,736 bytes in 2 blocks are possibly lost in loss record 26 of 35
==494586== at 0x484086F: malloc (vg_replace_malloc.c:381)
==494586== by 0x406FF1: backtrace_alloc (alloc.c:57)
==494586== by 0x406ED6: backtrace_get_view (read.c:68)
==494586== by 0x40568A: elf_get_view (elf.c:426)
==494586== by 0x40568A: elf_add (elf.c:4329)
==494586== by 0x406BC8: phdr_callback (elf.c:4848)
==494586== by 0x4D2A314: dl_iterate_phdr (dl-iteratephdr.c:75)
==494586== by 0x406DDD: backtrace_initialize (elf.c:4892)
==494586== by 0x4014B1: fileline_initialize (fileline.c:261)
==494586== by 0x401581: backtrace_pcinfo (fileline.c:295)
==494586== by 0x401357: main (bt.cc:15)
==494586==
==494586== 451,020 bytes in 7 blocks are possibly lost in loss record 31 of 35
==494586== at 0x484086F: malloc (vg_replace_malloc.c:381)
==494586== by 0x406FF1: backtrace_alloc (alloc.c:57)
==494586== by 0x406ED6: backtrace_get_view (read.c:68)
==494586== by 0x40667B: elf_add (elf.c:4381)
==494586== by 0x406BC8: phdr_callback (elf.c:4848)
==494586== by 0x4D2A314: dl_iterate_phdr (dl-iteratephdr.c:75)
==494586== by 0x406DDD: backtrace_initialize (elf.c:4892)
==494586== by 0x4014B1: fileline_initialize (fileline.c:261)
==494586== by 0x401581: backtrace_pcinfo (fileline.c:295)
==494586== by 0x401357: main (bt.cc:15)
==494586==
==494586== LEAK SUMMARY:
==494586== definitely lost: 14,004 bytes in 4 blocks
==494586== indirectly lost: 0 bytes in 0 blocks
==494586== possibly lost: 523,595 bytes in 10 blocks
==494586== still reachable: 112,100,582 bytes in 729,662 blocks
==494586== suppressed: 0 bytes in 0 blocks
==494586== Reachable blocks (those to which a pointer was found) are not shown.
==494586== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==494586==
==494586== For lists of detected and suppressed errors, rerun with: -s
==494586== ERROR SUMMARY: 5 errors from 5 contexts (suppressed: 0 from 0)
So that's still 14kB definitely lost, 500kB possibly lost.
^ permalink raw reply [flat|nested] 6+ messages in thread