From 7e69672e4dfa532607e4ecef99623680264a87b3 Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Tue, 18 Sep 2018 14:05:47 -0700 Subject: [PATCH] Support 'info proc files' on live FreeBSD processes. This walks the list of struct kinfo_file objects returned by a call to kinfo_getfile outputting a description of each open file descriptor. gdb/ChangeLog: * fbsd-nat.c (fbsd_nat_target::info_proc): List open file descriptors for IP_FILES and IP_ALL. --- gdb/ChangeLog | 5 +++++ gdb/fbsd-nat.c | 32 +++++++++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 7cd17a5dab8..88406c7bef7 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2018-09-18 John Baldwin + + * fbsd-nat.c (fbsd_nat_target::info_proc): List open file + descriptors for IP_FILES and IP_ALL. + 2018-09-18 John Baldwin * fbsd-tdep.c (KF_FLAGS, KF_OFFSET, KF_VNODE_TYPE, KF_SOCK_DOMAIN) diff --git a/gdb/fbsd-nat.c b/gdb/fbsd-nat.c index 2b829bfc3b4..24e40e2406b 100644 --- a/gdb/fbsd-nat.c +++ b/gdb/fbsd-nat.c @@ -265,6 +265,9 @@ fbsd_nat_target::info_proc (const char *args, enum info_proc_what what) bool do_cmdline = false; bool do_cwd = false; bool do_exe = false; +#ifdef HAVE_KINFO_GETFILE + bool do_files = false; +#endif #ifdef HAVE_KINFO_GETVMMAP bool do_mappings = false; #endif @@ -295,10 +298,18 @@ fbsd_nat_target::info_proc (const char *args, enum info_proc_what what) case IP_CWD: do_cwd = true; break; +#ifdef HAVE_KINFO_GETFILE + case IP_FILES: + do_files = true; + break; +#endif case IP_ALL: do_cmdline = true; do_cwd = true; do_exe = true; +#ifdef HAVE_KINFO_GETFILE + do_files = true; +#endif #ifdef HAVE_KINFO_GETVMMAP do_mappings = true; #endif @@ -322,7 +333,7 @@ fbsd_nat_target::info_proc (const char *args, enum info_proc_what what) printf_filtered (_("process %d\n"), pid); #ifdef HAVE_KINFO_GETFILE - if (do_cwd || do_exe) + if (do_cwd || do_exe || do_files) fdtbl.reset (kinfo_getfile (pid, &nfd)); #endif @@ -374,6 +385,25 @@ fbsd_nat_target::info_proc (const char *args, enum info_proc_what what) else warning (_("unable to fetch executable path name")); } +#ifdef HAVE_KINFO_GETFILE + if (do_files) + { + struct kinfo_file *kf = fdtbl.get (); + + if (nfd > 0) + { + fbsd_info_proc_files_header (); + for (int i = 0; i < nfd; i++, kf++) + fbsd_info_proc_files_entry (kf->kf_type, kf->kf_fd, kf->kf_flags, + kf->kf_offset, kf->kf_vnode_type, + kf->kf_sock_domain, kf->kf_sock_type, + kf->kf_sock_protocol, &kf->kf_sa_local, + &kf->kf_sa_peer, kf->kf_path); + } + else + warning (_("unable to fetch list of open files")); + } +#endif #ifdef HAVE_KINFO_GETVMMAP if (do_mappings) { -- 2.30.2