From patchwork Mon Jul 16 13:38:59 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Ser X-Patchwork-Id: 28401 Received: (qmail 38218 invoked by alias); 16 Jul 2018 13:39:10 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 38192 invoked by uid 89); 16 Jul 2018 13:39:09 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-24.4 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_LOW, SPF_HELO_PASS, SPF_PASS, UNWANTED_LANGUAGE_BODY autolearn=ham version=3.3.2 spammy=H*F:U*contact, H*R:U*contact, Possible, H*R:D*fr X-HELO: mail-1857040132.protonmail.ch Received: from mail-1857040132.protonmail.ch (HELO mail-1857040132.protonmail.ch) (185.70.40.132) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 16 Jul 2018 13:39:07 +0000 Date: Mon, 16 Jul 2018 09:38:59 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=emersion.fr; s=protonmail; t=1531748344; bh=ijbJ/JsuRXfmtet+fm0Ihvh2R85beecv/U3/iEhHi8E=; h=Date:To:From:Cc:Reply-To:Subject:In-Reply-To:References: Feedback-ID:From; b=k5CPZ1xCdokW915WQD6guklZcHTacrjEuGEFfzJctYCFYZckq0H9wRBpgnoLAJwot 8qnjAMi/8z/0vUEGfArCdn5WXABdXtKyFOibTd6qg5yxIl+ls1AhOc2Y/jHwMRiLsB DiHsQQeXUV+k+Hjy6N5tsvnLcUCbWMkhij2j/9m8= To: gdb-patches@sourceware.org From: Simon Ser Cc: Simon Ser , jhb@FreeBSD.org Reply-To: Simon Ser Subject: [PATCH v2] Generate NT_PROCSTAT_{AUXV, VMMAP, PS_STRINGS} in FreeBSD coredumps Message-ID: <_LRTDYZchE3m5uYvETytJBLgsrWRhqIDAXHnzDsU6kJBhItMetbpfxGe8OJD9a4K4b9brDxF9YvXWOzdDfTRBRfrZI-4XLl8mWwlrEpqmm0=@emersion.fr> In-Reply-To: References: MIME-Version: 1.0 gcore generates NT_AUXV and NT_FILE notes for Linux targets. On FreeBSD auxv is stored in a NT_PROCSTAT_AUXV section, file mappings are stored in a NT_PROCSTAT_VMMAP and both are prefixed with the struct size. 2018-07-16 Simon Ser * target.h (enum target_object): add FreeBSD-specific TARGET_OBJECT_FREEBSD_VMMAP and TARGET_OBJECT_FREEBSD_PS_STRINGS * fbsd-nat.c (fbsd_nat_target::xfer_partial): add support for TARGET_OBJECT_FREEBSD_VMMAP and TARGET_OBJECT_FREEBSD_PS_STRINGS * fbsd-tdep.c (fbsd_make_corefile_notes): write NT_PROCSTAT_AUXV, NT_PROCSTAT_VMMAP and NT_PROCSTAT_PS_STRINGS notes --- This patch uses a different approach than the previous one: it adds two FreeBSD-specific target objects. I chose this approach because there were already some platform-specific target objects (e.g. for Darwin). This should fix the issue John pointed out. gdb/fbsd-nat.c | 17 ++++++++++++++- gdb/fbsd-tdep.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++ gdb/target.h | 4 ++++ 3 files changed, 77 insertions(+), 1 deletion(-) diff --git a/gdb/fbsd-nat.c b/gdb/fbsd-nat.c index 115deac0..2d056676 100644 --- a/gdb/fbsd-nat.c +++ b/gdb/fbsd-nat.c @@ -711,17 +711,32 @@ fbsd_nat_target::xfer_partial (enum target_object object, } #endif case TARGET_OBJECT_AUXV: + case TARGET_OBJECT_FREEBSD_VMMAP: + case TARGET_OBJECT_FREEBSD_PS_STRINGS: { gdb::byte_vector buf_storage; gdb_byte *buf; size_t buflen; int mib[4]; + int proc_target; + switch (object) { + case TARGET_OBJECT_AUXV: + proc_target = KERN_PROC_AUXV; + break; + case TARGET_OBJECT_FREEBSD_VMMAP: + proc_target = KERN_PROC_VMMAP; + break; + case TARGET_OBJECT_FREEBSD_PS_STRINGS: + proc_target = KERN_PROC_PS_STRINGS; + break; + } + if (writebuf != NULL) return TARGET_XFER_E_IO; mib[0] = CTL_KERN; mib[1] = KERN_PROC; - mib[2] = KERN_PROC_AUXV; + mib[2] = proc_target; mib[3] = pid; if (offset == 0) { diff --git a/gdb/fbsd-tdep.c b/gdb/fbsd-tdep.c index 9cea0098..2ea76e66 100644 --- a/gdb/fbsd-tdep.c +++ b/gdb/fbsd-tdep.c @@ -25,6 +25,9 @@ #include "regset.h" #include "gdbthread.h" #include "xml-syscall.h" +#include +#include +#include #include "elf-bfd.h" #include "fbsd-tdep.h" @@ -512,6 +515,20 @@ fbsd_corefile_thread (struct thread_info *info, args->note_size, args->stop_signal); } +static gdb::optional +fbsd_make_note_desc (enum target_object object, uint32_t structsize) +{ + gdb::optional buf = + target_read_alloc (current_top_target (), object, NULL); + if (!buf || buf->empty ()) + return {}; + + gdb::byte_vector desc (sizeof (structsize) + buf->size ()); + memcpy (desc.data (), &structsize, sizeof (structsize)); + memcpy (desc.data () + sizeof (structsize), buf->data (), buf->size ()); + return desc; +} + /* Create appropriate note sections for a corefile, returning them in allocated memory. */ @@ -586,6 +603,46 @@ fbsd_make_corefile_notes (struct gdbarch *gdbarch, bfd *obfd, int *note_size) note_data = thread_args.note_data; + pid_t pid = inferior_ptid.pid (); + + /* Auxillary vector. */ + uint32_t structsize = gdbarch_addr_bit (gdbarch) / 4; /* Elf_Auxinfo */ + gdb::optional note_desc = + fbsd_make_note_desc (TARGET_OBJECT_AUXV, structsize); + if (note_desc && !note_desc->empty ()) + { + note_data = elfcore_write_note (obfd, note_data, note_size, + "FreeBSD", NT_FREEBSD_PROCSTAT_AUXV, + note_desc->data (), note_desc->size ()); + if (!note_data) + return NULL; + } + + /* File mappings */ + structsize = 0x488; /* struct kinfo_vmentry */ + note_desc = fbsd_make_note_desc (TARGET_OBJECT_FREEBSD_VMMAP, structsize); + if (note_desc && !note_desc->empty ()) + { + note_data = elfcore_write_note (obfd, note_data, note_size, + "FreeBSD", NT_FREEBSD_PROCSTAT_VMMAP, + note_desc->data (), note_desc->size ()); + if (!note_data) + return NULL; + } + + structsize = gdbarch_addr_bit (gdbarch) / 8; /* void * */ + note_desc = + fbsd_make_note_desc (TARGET_OBJECT_FREEBSD_PS_STRINGS, structsize); + if (note_desc && !note_desc->empty ()) + { + note_data = elfcore_write_note (obfd, note_data, note_size, + "FreeBSD", + NT_FREEBSD_PROCSTAT_PSSTRINGS, + note_desc->data (), note_desc->size ()); + if (!note_data) + return NULL; + } + return note_data; } diff --git a/gdb/target.h b/gdb/target.h index 18c4a84c..83f1172c 100644 --- a/gdb/target.h +++ b/gdb/target.h @@ -203,6 +203,10 @@ enum target_object of the process ID of the process in question, in hexadecimal format. */ TARGET_OBJECT_EXEC_FILE, + /* FreeBSD file mappings */ + TARGET_OBJECT_FREEBSD_VMMAP, + /* FreeBSD process strings */ + TARGET_OBJECT_FREEBSD_PS_STRINGS, /* Possible future objects: TARGET_OBJECT_FILE, ... */ };