aboutsummaryrefslogtreecommitdiff
path: root/gdb/i386fbsd-nat.c
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@freebsd.org>2015-02-25 09:51:42 -0500
committerPedro Alves <palves@redhat.com>2015-02-26 11:10:25 +0000
commitcf424aef0af89903abdd6c4e055684929e4990af (patch)
tree2dd568a48d7a0ee4bd6d523e9acb7b09e62fe332 /gdb/i386fbsd-nat.c
parentc5cb74eeb3ea13a9fbeb0ec26b5bad10c4b92e4a (diff)
downloadgdb-cf424aef0af89903abdd6c4e055684929e4990af.zip
gdb-cf424aef0af89903abdd6c4e055684929e4990af.tar.gz
gdb-cf424aef0af89903abdd6c4e055684929e4990af.tar.bz2
Rework signal frame probing for FreeBSD/x86
- Use signal frame sniffers that look for the signal trampoline instruction sequence to detect most signal frames. - FreeBSD kernels between 9.2 and 10.1 inclusive do not include the signal trampoline code in process core dumps. To detect signal frames for core dumps under these kernels, use the kern.proc.sigtramp.<pid> sysctl to fetch the location of the signal trampoline in the gdb process and assume that PC values within this location are signal frames. This depends on that location being identical for all binaries. gdb/ChangeLog: 2015-02-25 John Baldwin <jhb@FreeBSD.org> * amd64fbsd-nat.c: Include sys/user.h. (_initialize_amd64fbsd_nat): Use the KERN_PROC_SIGTRAMP sysctl instead of KERN_PS_STRINGS to locate the signal trampoline. * i386fbsd-nat.c: Include sys/user.h. (_initialize_i386fbsd_nat): Use the KERN_PROC_SIGTRAMP sysctl instead of KERN_PS_STRINGS to locate the signal trampoline. * amd64fbsd-tdep.c (amd64fbsd_sigtramp_code): New. (amd64fbsd_sigtramp_p): New. (amd64fbsd_sigtramp_start_addr, amd64fbsd_sigtramp_end_addr): No longer set default values. (amd64fbsd_init_abi): Set "sigtramp_p" to "amd64fbsd_sigtramp_p". * i386fbsd-tdep.c (i386fbsd_sigtramp_start) (i386fbsd_sigtramp_middle, i386fbsd_sigtramp_end) (i386fbsd_freebsd4_sigtramp_start) (i386fbsd_freebsd4_sigtramp_middle) (i386fbsd_freebsd4_sigtramp_end, i386fbsd_osigtramp_start) (i386fbsd_osigtramp_middle, i386fbsd_osigtramp_end): New. (i386fbsd_sigtramp_p): New. (i386fbsd_sigtramp_start_addr, i386fbsd_sigtramp_end_addr): No longer set default values. (i386fbsd_init_abi): Set "sigtramp_p" to "i386fbsd_sigtramp_p".
Diffstat (limited to 'gdb/i386fbsd-nat.c')
-rw-r--r--gdb/i386fbsd-nat.c32
1 files changed, 18 insertions, 14 deletions
diff --git a/gdb/i386fbsd-nat.c b/gdb/i386fbsd-nat.c
index f4951d1..ad439e3 100644
--- a/gdb/i386fbsd-nat.c
+++ b/gdb/i386fbsd-nat.c
@@ -25,6 +25,7 @@
#include <sys/types.h>
#include <sys/ptrace.h>
#include <sys/sysctl.h>
+#include <sys/user.h>
#include "fbsd-nat.h"
#include "i386-tdep.h"
@@ -148,25 +149,28 @@ _initialize_i386fbsd_nat (void)
/* Support debugging kernel virtual memory images. */
bsd_kvm_add_target (i386fbsd_supply_pcb);
- /* FreeBSD provides a kern.ps_strings sysctl that we can use to
- locate the sigtramp. That way we can still recognize a sigtramp
- if its location is changed in a new kernel. Of course this is
- still based on the assumption that the sigtramp is placed
- directly under the location where the program arguments and
- environment can be found. */
-#ifdef KERN_PS_STRINGS
+#ifdef KERN_PROC_SIGTRAMP
+ /* Normally signal frames are detected via i386fbsd_sigtramp_p.
+ However, FreeBSD 9.2 through 10.1 do not include the page holding
+ the signal code in core dumps. These releases do provide a
+ kern.proc.sigtramp.<pid> sysctl that returns the location of the
+ signal trampoline for a running process. We fetch the location
+ of the current (gdb) process and use this to identify signal
+ frames in core dumps from these releases. */
{
- int mib[2];
- u_long ps_strings;
+ int mib[4];
+ struct kinfo_sigtramp kst;
size_t len;
mib[0] = CTL_KERN;
- mib[1] = KERN_PS_STRINGS;
- len = sizeof (ps_strings);
- if (sysctl (mib, 2, &ps_strings, &len, NULL, 0) == 0)
+ mib[1] = KERN_PROC;
+ mib[2] = KERN_PROC_SIGTRAMP;
+ mib[3] = getpid ();
+ len = sizeof (kst);
+ if (sysctl (mib, 4, &kst, &len, NULL, 0) == 0)
{
- i386fbsd_sigtramp_start_addr = ps_strings - 128;
- i386fbsd_sigtramp_end_addr = ps_strings;
+ i386fbsd_sigtramp_start_addr = (uintptr_t) kst.ksigtramp_start;
+ i386fbsd_sigtramp_end_addr = (uintptr_t) kst.ksigtramp_end;
}
}
#endif