diff options
author | Philippe Waroquiers <philippe.waroquiers@skynet.be> | 2018-12-07 18:13:59 +0100 |
---|---|---|
committer | Philippe Waroquiers <philippe.waroquiers@skynet.be> | 2018-12-08 17:06:09 +0100 |
commit | a2419b98d90e89acbef47dbc7a9047f4580fe99d (patch) | |
tree | 01a15e96a9a95f1dc4bf803982c1fee14a1f95ee /gdb/nat | |
parent | Merge forward-search/reverse-search, use gdb::def_vector, remove limit (diff) | |
download | binutils-gdb-a2419b98d90e89acbef47dbc7a9047f4580fe99d.tar.gz binutils-gdb-a2419b98d90e89acbef47dbc7a9047f4580fe99d.tar.bz2 binutils-gdb-a2419b98d90e89acbef47dbc7a9047f4580fe99d.zip |
Fix leak by using td_ta_delete() to deregister target process and deallocate internal process handle.
Valgrind reports the below leak:
==25327== VALGRIND_GDB_ERROR_BEGIN
==25327== 672 bytes in 1 blocks are definitely lost in loss record 2,759 of 3,251
==25327== at 0x4C2E07C: calloc (vg_replace_malloc.c:752)
==25327== by 0x7FDCB3E: ???
==25327== by 0x532A7A: try_thread_db_load_1 (linux-thread-db.c:828)
==25327== by 0x532A7A: try_thread_db_load(char const*, int) (linux-thread-db.c:997)
==25327== by 0x53354D: try_thread_db_load_from_sdir (linux-thread-db.c:1074)
==25327== by 0x53354D: thread_db_load_search (linux-thread-db.c:1129)
==25327== by 0x53354D: thread_db_load() (linux-thread-db.c:1187)
==25327== by 0x611AF1: operator() (functional:2127)
==25327== by 0x611AF1: notify (observable.h:106)
==25327== by 0x611AF1: symbol_file_add_with_addrs(bfd*, char const*, enum_flags<symfile_add_flag>, std::vector<other_sections, std::allocator<other_sections> >*, enum_flags<objfile_flag>, objfile*) (symfile.c:1158)
==25327== by 0x5F5C4A: solib_read_symbols(so_list*, enum_flags<symfile_add_flag>) (solib.c:691)
==25327== by 0x5F6A8B: solib_add(char const*, int, int) (solib.c:1003)
==25327== by 0x5F6BF7: handle_solib_event() (solib.c:1281)
==25327== by 0x3D0A94: bpstat_stop_status(address_space const*, unsigned long, thread_info*, target_waitstatus const*, bpstats*) (breakpoint.c:5417)
==25327== by 0x4FF133: handle_signal_stop(execution_control_state*) (infrun.c:5874)
==25327== by 0x502C29: handle_inferior_event_1 (infrun.c:5300)
==25327== by 0x502C29: handle_inferior_event(execution_control_state*) (infrun.c:5335)
==25327== by 0x5041DB: fetch_inferior_event(void*) (infrun.c:3868)
==25327== by 0x4A1E7C: gdb_wait_for_event(int) (event-loop.c:859)
...
This leak is created because a call to td_ta_new allocates some resources
that must be freed with td_ta_delete, and that was missing.
With this patch, the nr of GDB executions leaking during regression tests
decreases further from 566 to 380.
Note that the gdbserver equivalent code is properly calling
td_ta_delete: see thread_db_mourn in thread-db.c.
Tests run natively on debian/amd64, and run under valgrind.
gdb/ChangeLog
2018-12-08 Philippe Waroquiers <philippe.waroquiers@skynet.be>
* linux-thread-db.c (struct thread_db_info): Add td_ta_delete_p.
(thread_db_err_str): Forward declare.
(delete_thread_db_info): Call td_ta_delete_p if available.
(try_thread_db_load_1): Acquire td_ta_delete address.
* nat/gdb_thread_db.h (td_ta_delete_ftype): Declare.
Diffstat (limited to 'gdb/nat')
-rw-r--r-- | gdb/nat/gdb_thread_db.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/gdb/nat/gdb_thread_db.h b/gdb/nat/gdb_thread_db.h index b8259c3aa27..618516ed3f2 100644 --- a/gdb/nat/gdb_thread_db.h +++ b/gdb/nat/gdb_thread_db.h @@ -41,6 +41,7 @@ typedef td_err_e (td_init_ftype) (void); typedef td_err_e (td_ta_new_ftype) (struct ps_prochandle * ps, td_thragent_t **ta); +typedef td_err_e (td_ta_delete_ftype) (td_thragent_t *ta_p); typedef td_err_e (td_ta_map_lwp2thr_ftype) (const td_thragent_t *ta, lwpid_t lwpid, td_thrhandle_t *th); typedef td_err_e (td_ta_thr_iter_ftype) (const td_thragent_t *ta, |