📄 710-debian_thread-db-multiple-libraries.patch
字号:
return err; @@ -534,8 +563,10 @@ enable_thread_event_reporting (void) /* We cannot use the thread event reporting facility if these functions aren't available. */- if (td_ta_event_addr_p == NULL || td_ta_set_event_p == NULL- || td_ta_event_getmsg_p == NULL || td_thr_event_enable_p == NULL)+ if (current_pointers->td_ta_event_addr_p == NULL+ || current_pointers->td_ta_set_event_p == NULL+ || current_pointers->td_ta_event_getmsg_p == NULL+ || current_pointers->td_thr_event_enable_p == NULL) return; /* Set the process wide mask saying which events we're interested in. */@@ -552,7 +583,7 @@ enable_thread_event_reporting (void) #endif td_event_addset (&events, TD_DEATH); - err = td_ta_set_event_p (thread_agent, &events);+ err = current_pointers->td_ta_set_event_p (thread_agent, &events); if (err != TD_OK) { warning ("Unable to set global thread event mask: %s",@@ -592,7 +623,7 @@ disable_thread_event_reporting (void) /* Set the process wide mask saying we aren't interested in any events anymore. */ td_event_emptyset (&events);- td_ta_set_event_p (thread_agent, &events);+ current_pointers->td_ta_set_event_p (thread_agent, &events); /* Delete thread event breakpoints, if any. */ remove_thread_event_breakpoints ();@@ -635,7 +666,6 @@ check_thread_signals (void) static void check_for_thread_db (void) {- td_err_e err; static int already_loaded; /* First time through, report that libthread_db was successfuly@@ -644,19 +674,8 @@ check_for_thread_db (void) if (!already_loaded) {- Dl_info info;- const char *library = NULL;- if (dladdr ((*td_ta_new_p), &info) != 0)- library = info.dli_fname;-- /* Try dlinfo? */-- if (library == NULL)- /* Paranoid - don't let a NULL path slip through. */- library = LIBTHREAD_DB_SO;- printf_unfiltered ("Using host libthread_db library \"%s\".\n",- library);+ all_pointers->filename); already_loaded = 1; } @@ -674,28 +693,34 @@ check_for_thread_db (void) proc_handle.pid = GET_PID (inferior_ptid); /* Now attempt to open a connection to the thread library. */- err = td_ta_new_p (&proc_handle, &thread_agent);- switch (err)+ for (current_pointers = all_pointers;+ current_pointers != NULL;+ current_pointers = current_pointers->next) {- case TD_NOLIBTHREAD:- /* No thread library was detected. */- break;-- case TD_OK:- printf_unfiltered ("[Thread debugging using libthread_db enabled]\n");+ td_err_e err;+ err = current_pointers->td_ta_new_p (&proc_handle, &thread_agent);+ switch (err)+ {+ case TD_NOLIBTHREAD:+ /* No thread library was detected. */+ break; - /* The thread library was detected. Activate the thread_db target. */- push_target (&thread_db_ops);- using_thread_db = 1;+ case TD_OK:+ printf_unfiltered ("[Thread debugging using libthread_db enabled]\n"); - enable_thread_event_reporting ();- thread_db_find_new_threads ();- break;+ /* The thread library was detected. Activate the thread_db target. */+ push_target (&thread_db_ops);+ using_thread_db = 1;++ enable_thread_event_reporting ();+ thread_db_find_new_threads ();+ return; - default:- warning ("Cannot initialize thread debugging library: %s",- thread_db_err_str (err));- break;+ default:+ warning ("Cannot initialize thread debugging library: %s",+ thread_db_err_str (err));+ break;+ } } } @@ -766,7 +791,7 @@ attach_thread (ptid_t ptid, const td_thr #endif /* Enable thread event reporting for this thread. */- err = td_thr_event_enable_p (th_p, 1);+ err = current_pointers->td_thr_event_enable_p (th_p, 1); if (err != TD_OK) error ("Cannot enable thread event reporting for %s: %s", target_pid_to_str (ptid), thread_db_err_str (err));@@ -892,7 +917,7 @@ check_event (ptid_t ptid) do {- err = td_ta_event_getmsg_p (thread_agent, &msg);+ err = current_pointers->td_ta_event_getmsg_p (thread_agent, &msg); if (err != TD_OK) { if (err == TD_NOMSG)@@ -902,7 +927,7 @@ check_event (ptid_t ptid) thread_db_err_str (err)); } - err = td_thr_get_info_p (msg.th_p, &ti);+ err = current_pointers->td_thr_get_info_p (msg.th_p, &ti); if (err != TD_OK) error ("Cannot get thread info: %s", thread_db_err_str (err)); @@ -1015,12 +1040,14 @@ thread_db_fetch_registers (int regno) thread_info = find_thread_pid (inferior_ptid); thread_db_map_id2thr (thread_info, 1); - err = td_thr_getgregs_p (&thread_info->private->th, gregset);+ err = current_pointers->td_thr_getgregs_p (&thread_info->private->th,+ gregset); if (err != TD_OK) error ("Cannot fetch general-purpose registers for thread %ld: %s", (long) GET_THREAD (inferior_ptid), thread_db_err_str (err)); - err = td_thr_getfpregs_p (&thread_info->private->th, &fpregset);+ err = current_pointers->td_thr_getfpregs_p (&thread_info->private->th,+ &fpregset); if (err != TD_OK) error ("Cannot get floating-point registers for thread %ld: %s", (long) GET_THREAD (inferior_ptid), thread_db_err_str (err));@@ -1062,11 +1089,13 @@ thread_db_store_registers (int regno) fill_gregset ((gdb_gregset_t *) gregset, -1); fill_fpregset (&fpregset, -1); - err = td_thr_setgregs_p (&thread_info->private->th, gregset);+ err = current_pointers->td_thr_setgregs_p (&thread_info->private->th,+ gregset); if (err != TD_OK) error ("Cannot store general-purpose registers for thread %ld: %s", (long) GET_THREAD (inferior_ptid), thread_db_err_str (err));- err = td_thr_setfpregs_p (&thread_info->private->th, &fpregset);+ err = current_pointers->td_thr_setfpregs_p (&thread_info->private->th,+ &fpregset); if (err != TD_OK) error ("Cannot store floating-point registers for thread %ld: %s", (long) GET_THREAD (inferior_ptid), thread_db_err_str (err));@@ -1136,15 +1165,14 @@ thread_db_thread_alive (ptid_t ptid) if (!thread_info->private->th_valid) return 0; - err = td_thr_validate_p (&thread_info->private->th);+ err = current_pointers->td_thr_validate_p (&thread_info->private->th); if (err != TD_OK) return 0; if (!thread_info->private->ti_valid) {- err =- td_thr_get_info_p (&thread_info->private->th,- &thread_info->private->ti);+ err = current_pointers->td_thr_get_info_p+ (&thread_info->private->th, &thread_info->private->ti); if (err != TD_OK) return 0; thread_info->private->ti_valid = 1;@@ -1170,7 +1198,7 @@ find_new_threads_callback (const td_thrh td_err_e err; ptid_t ptid; - err = td_thr_get_info_p (th_p, &ti);+ err = current_pointers->td_thr_get_info_p (th_p, &ti); if (err != TD_OK) error ("find_new_threads_callback: cannot get thread info: %s", thread_db_err_str (err));@@ -1192,9 +1220,10 @@ thread_db_find_new_threads (void) td_err_e err; /* Iterate over all user-space threads to discover new threads. */- err = td_ta_thr_iter_p (thread_agent, find_new_threads_callback, NULL,- TD_THR_ANY_STATE, TD_THR_LOWEST_PRIORITY,- TD_SIGNO_MASK, TD_THR_ANY_USER_FLAGS);+ err = current_pointers->td_ta_thr_iter_p+ (thread_agent, find_new_threads_callback, NULL,+ TD_THR_ANY_STATE, TD_THR_LOWEST_PRIORITY,+ TD_SIGNO_MASK, TD_THR_ANY_USER_FLAGS); if (err != TD_OK) error ("Cannot find new threads: %s", thread_db_err_str (err)); }@@ -1257,7 +1286,7 @@ thread_db_get_thread_local_address (ptid struct thread_info *thread_info; /* glibc doesn't provide the needed interface. */- if (!td_thr_tls_get_addr_p)+ if (!current_pointers->td_thr_tls_get_addr_p) error ("Cannot find thread-local variables in this thread library."); /* Get the address of the link map for this objfile. */@@ -1279,8 +1308,8 @@ thread_db_get_thread_local_address (ptid thread_db_map_id2thr (thread_info, 1); /* Finally, get the address of the variable. */- err = td_thr_tls_get_addr_p (&thread_info->private->th, (void *) lm,- offset, &address);+ err = current_pointers->td_thr_tls_get_addr_p+ (&thread_info->private->th, (void *) lm, offset, &address); #ifdef THREAD_DB_HAS_TD_NOTALLOC /* The memory hasn't been allocated, yet. */@@ -1360,17 +1389,49 @@ init_thread_db_ops (void) void _initialize_thread_db (void) {+ struct thread_db_pointers *ptrs;+ const char *p;+ /* Only initialize the module if we can load libthread_db. */- if (thread_db_load ())- {- init_thread_db_ops ();- add_target (&thread_db_ops);+ ptrs = thread_db_load (LIBTHREAD_DB_SO);+ if (ptrs == NULL)+ return;++ all_pointers = ptrs; - /* Add ourselves to objfile event chain. */- target_new_objfile_chain = deprecated_target_new_objfile_hook;- deprecated_target_new_objfile_hook = thread_db_new_objfile;+ /* Some GNU/Linux systems have more than one binary-compatible copy+ of libthread_db. If we can find a second one, load that too.+ The inferior may force the use of a different threading package+ than we expect. Our guess for the location is somewhat hokey:+ strip out anything between /lib (or /lib64) and LIBTHREAD_DB_SO.+ If we loaded the NPTL libthread_db by default, this may find us+ the LinuxThreads copy. */+ p = strrchr (ptrs->filename, '/');+ while (p != NULL && p > ptrs->filename)+ {+ const char *component; - /* Register ourselves for the new inferior observer. */- observer_attach_inferior_created (check_for_thread_db_observer);+ component = memrchr (ptrs->filename, '/', p - ptrs->filename);+ if (component != NULL && strncmp (component, "/lib", 4) == 0)+ {+ char *new_name = xmalloc (p - ptrs->filename + 2+ + strlen (LIBTHREAD_DB_SO));+ memcpy (new_name, ptrs->filename, p - ptrs->filename + 1);+ strcpy (new_name + (p - ptrs->filename) + 1, LIBTHREAD_DB_SO);+ ptrs->next = thread_db_load (new_name);+ xfree (new_name);+ break;+ }+ p = component; }++ init_thread_db_ops ();+ add_target (&thread_db_ops);++ /* Add ourselves to objfile event chain. */+ target_new_objfile_chain = deprecated_target_new_objfile_hook;+ deprecated_target_new_objfile_hook = thread_db_new_objfile;++ /* Register ourselves for the new inferior observer. */+ observer_attach_inferior_created (check_for_thread_db_observer); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -