diff options
author | davidxu <davidxu@FreeBSD.org> | 2006-02-06 06:07:56 +0000 |
---|---|---|
committer | davidxu <davidxu@FreeBSD.org> | 2006-02-06 06:07:56 +0000 |
commit | 0fdc8d7b7221f0a885507e06716a1e61419a4b35 (patch) | |
tree | 707c96f109f73ea37c22f506e1dfb4e7f3ee5762 /gnu | |
parent | efc29c5782bf616a8dddb3589f2e99eef8d755c7 (diff) | |
download | FreeBSD-src-0fdc8d7b7221f0a885507e06716a1e61419a4b35.zip FreeBSD-src-0fdc8d7b7221f0a885507e06716a1e61419a4b35.tar.gz |
1. Eliminate compile warnings.
2. Add command 'thread signal' to print out current thread's signal mask
and pending signals.
Diffstat (limited to 'gnu')
-rw-r--r-- | gnu/usr.bin/gdb/libgdb/fbsd-threads.c | 68 |
1 files changed, 60 insertions, 8 deletions
diff --git a/gnu/usr.bin/gdb/libgdb/fbsd-threads.c b/gnu/usr.bin/gdb/libgdb/fbsd-threads.c index 6e9184d..e9f83a9 100644 --- a/gnu/usr.bin/gdb/libgdb/fbsd-threads.c +++ b/gnu/usr.bin/gdb/libgdb/fbsd-threads.c @@ -22,6 +22,7 @@ #include <dlfcn.h> #include <sys/types.h> #include <sys/ptrace.h> +#include <signal.h> #include "proc_service.h" #include "thread_db.h" @@ -327,8 +328,8 @@ enable_thread_event (td_thragent_t *thread_agent, int event, CORE_ADDR *bp) /* Set up the breakpoint. */ (*bp) = gdbarch_convert_from_func_ptr_addr (current_gdbarch, - (CORE_ADDR)notify.u.bptaddr, - ¤t_target); + extract_typed_address(¬ify.u.bptaddr, builtin_type_void_func_ptr), + ¤t_target); create_thread_event_breakpoint ((*bp)); return TD_OK; @@ -1198,6 +1199,7 @@ fbsd_thread_get_local_address(ptid_t ptid, struct objfile *objfile, td_thrhandle_t th; void *address; CORE_ADDR lm; + void *lm2; int ret, is_library = (objfile->flags & OBJF_SHARED); if (IS_THREAD (ptid)) @@ -1222,7 +1224,8 @@ fbsd_thread_get_local_address(ptid_t ptid, struct objfile *objfile, ret = td_ta_map_id2thr_p (thread_agent, GET_THREAD(ptid), &th); /* get the address of the variable. */ - ret = td_thr_tls_get_addr_p (&th, (void *)lm, offset, &address); + store_typed_address(&lm2, builtin_type_void_data_ptr, lm); + ret = td_thr_tls_get_addr_p (&th, lm2, offset, &address); if (ret != TD_OK) { @@ -1239,7 +1242,7 @@ fbsd_thread_get_local_address(ptid_t ptid, struct objfile *objfile, } /* Cast assuming host == target. */ - return (CORE_ADDR) address; + return extract_typed_address(&address, builtin_type_void_data_ptr); } return (0); } @@ -1250,7 +1253,8 @@ tsd_cb (thread_key_t key, void (*destructor)(void *), void *ignore) struct minimal_symbol *ms; char *name; - ms = lookup_minimal_symbol_by_pc ((CORE_ADDR)destructor); + ms = lookup_minimal_symbol_by_pc ( + extract_typed_address(&destructor, builtin_type_void_func_ptr)); if (!ms) name = "???"; else @@ -1267,6 +1271,46 @@ fbsd_thread_tsd_cmd (char *exp, int from_tty) td_ta_tsd_iter_p (thread_agent, tsd_cb, NULL); } +static void +fbsd_print_sigset (sigset_t *set) +{ + int i; + + for (i = 1; i <= _SIG_MAXSIG; ++i) { + if (sigismember(set, i)) { + if (i < sizeof(sys_signame)/sizeof(sys_signame[0])) + printf_filtered("%s ", sys_signame[i]); + else + printf_filtered("sig%d ", i); + } + } + printf_filtered("\n"); +} + +static void +fbsd_thread_signal_cmd (char *exp, int from_tty) +{ + td_thrhandle_t th; + td_thrinfo_t ti; + td_err_e err; + + if (!fbsd_thread_active || !IS_THREAD(inferior_ptid)) + return; + + err = td_ta_map_id2thr_p (thread_agent, GET_THREAD (inferior_ptid), &th); + if (err != TD_OK) + return; + + err = td_thr_get_info_p (&th, &ti); + if (err != TD_OK) + return; + + printf_filtered("signal mask:\n"); + fbsd_print_sigset(&ti.ti_sigmask); + printf_filtered("signal pending:\n"); + fbsd_print_sigset(&ti.ti_pending); +} + static int ignore (CORE_ADDR addr, char *contents) { @@ -1473,6 +1517,10 @@ _initialize_thread_db (void) "for the process.\n", &thread_cmd_list); + add_cmd ("signal", class_run, fbsd_thread_signal_cmd, + "Show the thread signal info.\n", + &thread_cmd_list); + memcpy (&orig_core_ops, &core_ops, sizeof (struct target_ops)); memcpy (&core_ops, &fbsd_core_ops, sizeof (struct target_ops)); add_target (&core_ops); @@ -1509,19 +1557,22 @@ ps_pglobal_lookup (struct ps_prochandle *ph, const char *obj, const char *name, psaddr_t *sym_addr) { struct minimal_symbol *ms; + CORE_ADDR addr; ms = lookup_minimal_symbol (name, NULL, NULL); if (ms == NULL) return PS_NOSYM; - *sym_addr = (psaddr_t) SYMBOL_VALUE_ADDRESS (ms); + addr = SYMBOL_VALUE_ADDRESS (ms); + store_typed_address(sym_addr, builtin_type_void_data_ptr, addr); return PS_OK; } ps_err_e ps_pread (struct ps_prochandle *ph, psaddr_t addr, void *buf, size_t len) { - int err = target_read_memory ((CORE_ADDR) addr, buf, len); + int err = target_read_memory ( + extract_typed_address(&addr, builtin_type_void_data_ptr), buf, len); return (err == 0 ? PS_OK : PS_ERR); } @@ -1529,7 +1580,8 @@ ps_err_e ps_pwrite (struct ps_prochandle *ph, psaddr_t addr, const void *buf, size_t len) { - int err = target_write_memory ((CORE_ADDR) addr, (void *)buf, len); + int err = target_write_memory ( + extract_typed_address(&addr, builtin_type_void_data_ptr), (void *)buf, len); return (err == 0 ? PS_OK : PS_ERR); } |