old-cross-binutils/gdb/testsuite/gdb.base
Sergio Durigan Junior df8411da08 Implement support for checking /proc/PID/coredump_filter
This patch, as the subject says, extends GDB so that it is able to use
the contents of the file /proc/PID/coredump_filter when generating a
corefile.  This file contains a bit mask that is a representation of
the different types of memory mappings in the Linux kernel; the user
can choose to dump or not dump a certain type of memory mapping by
enabling/disabling the respective bit in the bit mask.  Currently,
here is what is supported:

  bit 0  Dump anonymous private mappings.
  bit 1  Dump anonymous shared mappings.
  bit 2  Dump file-backed private mappings.
  bit 3  Dump file-backed shared mappings.
  bit 4 (since Linux 2.6.24)
         Dump ELF headers.
  bit 5 (since Linux 2.6.28)
         Dump private huge pages.
  bit 6 (since Linux 2.6.28)
         Dump shared huge pages.

(This table has been taken from core(5), but you can also read about it
on Documentation/filesystems/proc.txt inside the Linux kernel source
tree).

The default value for this file, used by the Linux kernel, is 0x33,
which means that bits 0, 1, 4 and 5 are enabled.  This is also the
default for GDB implemented in this patch, FWIW.

Well, reading the file is obviously trivial.  The hard part, mind you,
is how to determine the types of the memory mappings.  For that, I
extended the code of gdb/linux-tdep.c:linux_find_memory_regions_full and
made it rely *much more* on the information gathered from
/proc/<PID>/smaps.  This file contains a "verbose dump" of the
inferior's memory mappings, and we were not using as much information as
we could from it.  If you want to read more about this file, take a look
at the proc(5) manpage (I will also write a blog post soon about
everything I had to learn to get this patch done, and when I it is ready
I will post it here).

With Oleg Nesterov's help, we could improve the current algorithm for
determining whether a memory mapping is anonymous/file-backed,
private/shared.  GDB now also respects the MADV_DONTDUMP flag and does
not dump the memory mapping marked as so, and will always dump
"[vsyscall]" or "[vdso]" mappings (just like the Linux kernel).

In a nutshell, what the new code is doing is:

- If the mapping is associated to a file whose name ends with
  " (deleted)", or if the file is "/dev/zero", or if it is "/SYSV%08x"
  (shared memory), or if there is no file associated with it, or if
  the AnonHugePages: or the Anonymous: fields in the /proc/PID/smaps
  have contents, then GDB considers this mapping to be anonymous.
  There is a special case in this, though: if the memory mapping is a
  file-backed one, but *also* contains "Anonymous:" or
  "AnonHugePages:" pages, then GDB considers this mapping to be *both*
  anonymous and file-backed, just like the Linux kernel does.  What
  that means is simple: this mapping will be dumped if the user
  requested anonymous mappings *or* if the user requested file-backed
  mappings to be present in the corefile.

  It is worth mentioning that, from all those checks described above,
  the most fragile is the one to see if the file name ends with
  " (deleted)".  This does not necessarily mean that the mapping is
  anonymous, because the deleted file associated with the mapping may
  have been a hard link to another file, for example.  The Linux
  kernel checks to see if "i_nlink == 0", but GDB cannot easily do
  this check (as it has been discussed, GDB would need to run as root,
  and would need to check the contents of the /proc/PID/map_files/
  directory in order to determine whether the deleted was a hardlink
  or not).  Therefore, we made a compromise here, and we assume that
  if the file name ends with " (deleted)", then the mapping is indeed
  anonymous.  FWIW, this is something the Linux kernel could do
  better: expose this information in a more direct way.

- If we see the flag "sh" in the VmFlags: field (in /proc/PID/smaps),
  then certainly the memory mapping is shared (VM_SHARED).  If we have
  access to the VmFlags, and we don't see the "sh" there, then
  certainly the mapping is private.  However, older Linux kernels (see
  the code for more details) do not have the VmFlags field; in that
  case, we use another heuristic: if we see 'p' in the permission
  flags, then we assume that the mapping is private, even though the
  presence of the 's' flag there would mean VM_MAYSHARE, which means
  the mapping could still be private.  This should work OK enough,
  however.

Finally, it is worth mentioning that I added a new command, 'set
use-coredump-filter on/off'.  When it is 'on', it will read the
coredump_filter' file (if it exists) and use its value; otherwise, it
will use the default value mentioned above (0x33) to decide which memory
mappings to dump.

gdb/ChangeLog:
2015-03-31  Sergio Durigan Junior  <sergiodj@redhat.com>
	    Jan Kratochvil  <jan.kratochvil@redhat.com>
	    Oleg Nesterov  <oleg@redhat.com>

	PR corefiles/16092
	* linux-tdep.c: Include 'gdbcmd.h' and 'gdb_regex.h'.
	New enum identifying the various options of the coredump_filter
	file.
	(struct smaps_vmflags): New struct.
	(use_coredump_filter): New variable.
	(decode_vmflags): New function.
	(mapping_is_anonymous_p): Likewise.
	(dump_mapping_p): Likewise.
	(linux_find_memory_regions_full): New variables
	'coredumpfilter_name', 'coredumpfilterdata', 'pid', 'filterflags'.
	Removed variable 'modified'.  Read /proc/<PID>/smaps file; improve
	parsing of its information.  Implement memory mapping filtering
	based on its contents.
	(show_use_coredump_filter): New function.
	(_initialize_linux_tdep): New command 'set use-coredump-filter'.
	* NEWS: Mention the possibility of using the
	'/proc/PID/coredump_filter' file when generating a corefile.
	Mention new command 'set use-coredump-filter'.

gdb/doc/ChangeLog:
2015-03-31  Sergio Durigan Junior  <sergiodj@redhat.com>

	PR corefiles/16092
	* gdb.texinfo (gcore): Mention new command 'set
	use-coredump-filter'.
	(set use-coredump-filter): Document new command.

gdb/testsuite/ChangeLog:
2015-03-31  Sergio Durigan Junior  <sergiodj@redhat.com>

	PR corefiles/16092
	* gdb.base/coredump-filter.c: New file.
	* gdb.base/coredump-filter.exp: Likewise.
2015-03-31 19:32:34 -04:00
..
comp-dir/subdir
a2-run.exp
advance.c
advance.exp
alias.exp
all-bin.exp
all-types.c
annota-input-while-running.c
annota-input-while-running.exp
annota1.c
annota1.exp
annota3.c
annota3.exp
anon.c
anon.exp
args.c
args.exp
argv0-symlink.c
argv0-symlink.exp
arithmet.exp
arrayidx.c
arrayidx.exp
assign.exp
async-shell.c
async-shell.exp
async.c
async.exp
attach-pie-misread.c
attach-pie-misread.exp
attach-pie-noexec.c
attach-pie-noexec.exp
attach-twice.c
attach-twice.exp
attach-wait-input.c
attach-wait-input.exp
attach.c
attach.exp
attach2.c
auto-connect-native-target.c
auto-connect-native-target.exp
auto-load-script
auto-load.c
auto-load.exp
auxv.c
auxv.exp
average.c
bang.exp
bar.c
batch-preserve-term-settings.c
batch-preserve-term-settings.exp
baz.c
bfp-test.c
bfp-test.exp
bg-execution-repeat.c
bg-execution-repeat.exp
bigcore.c
bigcore.exp
bitfields.c
bitfields.exp
bitfields2.c
bitfields2.exp
bitops.exp
bp-cmds-execution-x-script.c
bp-cmds-execution-x-script.exp
bp-cmds-execution-x-script.gdb
bp-permanent.c
bp-permanent.exp gdb.base/bp-permanent.exp: Tighten regex 2015-03-05 23:40:39 +00:00
branches.c
break-always.c
break-always.exp
break-caller-line.c
break-caller-line.exp
break-entry.exp
break-idempotent.c
break-idempotent.exp
break-inline.c
break-inline.exp
break-interp-lib.c
break-interp-main.c
break-interp.exp
break-main-file-remove-fail.c
break-main-file-remove-fail.exp
break-on-linker-gcd-function.cc
break-on-linker-gcd-function.exp
break-probes-solib.c
break-probes.c
break-probes.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
break-unload-file.c
break-unload-file.exp
break.c
break.exp
break1.c
breakpoint-in-ro-region.c
breakpoint-in-ro-region.exp breakpoint-in-ro-region.exp: Support targets stopping in mid-line after "si" 2015-03-04 10:40:40 +01:00
breakpoint-shadow.c
breakpoint-shadow.exp
call-ar-st.c
call-ar-st.exp
call-rt-st.c
call-rt-st.exp
call-sc.c
call-sc.exp
call-signal-resume.exp
call-signals.c
call-strs.c
call-strs.exp
callexit.c
callexit.exp
callfuncs.c
callfuncs.exp
catch-gdb-caused-signals.c
catch-gdb-caused-signals.exp
catch-load-so.c
catch-load.c
catch-load.exp
catch-signal-fork.c
catch-signal-fork.exp
catch-signal.c
catch-signal.exp
catch-syscall.c Support catch syscall on aarch64 linux 2015-03-18 10:47:45 +00:00
catch-syscall.exp Support catch syscall on aarch64 linux 2015-03-18 10:47:45 +00:00
charset-malloc.c
charset.c
charset.exp
checkpoint.c
checkpoint.exp
chng-syms.c
chng-syms.exp
code-expr.exp
code_elim.exp
code_elim1.c
code_elim2.c
commands.exp
compare-sections.c
compare-sections.exp
completion.exp
complex.c
complex.exp
comprdebug.exp
cond-eval-mode.c
cond-eval-mode.exp
cond-expr.exp
condbreak-call-false.c
condbreak-call-false.exp
condbreak.exp
consecutive-step-over.c
consecutive-step-over.exp
consecutive.c
consecutive.exp
constvars.c
constvars.exp
continue-all-already-running.c
continue-all-already-running.exp
coredump-filter.c Implement support for checking /proc/PID/coredump_filter 2015-03-31 19:32:34 -04:00
coredump-filter.exp Implement support for checking /proc/PID/coredump_filter 2015-03-31 19:32:34 -04:00
corefile.exp
coremaker.c
coremaker2.c
ctxobj-f.c
ctxobj-m.c
ctxobj-v.c
ctxobj.exp
cursal.c
cursal.exp
cvexpr.c
cvexpr.exp
d10v.ld
d10vovly.c
dbx.exp
dcache-line-read-error.c
dcache-line-read-error.exp
debug-expr.c
debug-expr.exp
default.exp
define.exp
del.c
del.exp
detach.exp
dfp-exprs.exp
dfp-test.c
dfp-test.exp
disabled-location.c
disabled-location.exp
disasm-end-cu-1.c
disasm-end-cu-2.c
disasm-end-cu.exp
disp-step-fork.c
disp-step-syscall.exp Tighten gdb.base/disp-step-syscall.exp 2015-03-18 19:28:08 +00:00
disp-step-vfork.c
display.c
display.exp
dmsym.c
dmsym.exp
dmsym_main.c
double-prompt-target-event-error.c
double-prompt-target-event-error.exp
dprintf-bp-same-addr.c
dprintf-bp-same-addr.exp
dprintf-detach.c
dprintf-detach.exp
dprintf-next.c
dprintf-next.exp
dprintf-non-stop.c
dprintf-non-stop.exp
dprintf-pending.c
dprintf-pending.exp
dprintf-pendshr.c
dprintf.c
dprintf.exp
dtrace-probe.c
dtrace-probe.d
dtrace-probe.exp
dump.c
dump.exp
dup-sect.exp
dup-sect.S
duplicate-bp.c
duplicate-bp.exp
echo.exp
empty_exe.exp
ena-dis-br.exp
ending-run.c
ending-run.exp
enum_cond.c
enum_cond.exp
enumval.c
enumval.exp
environ.exp
eu-strip-infcall.c
eu-strip-infcall.exp
eval-avoid-side-effects.exp
eval-skip.exp
eval.exp
exe-lock.exp
execd-prog.c
execl-update-breakpoints.c
execl-update-breakpoints.exp
execution-termios.c
execution-termios.exp
exitsignal.exp
expand-psymtabs.c
expand-psymtabs.exp
exprs.c
exprs.exp
fileio.c
fileio.exp
filesym.c
filesym.exp
find-unmapped.c
find-unmapped.exp
find.c
find.exp
finish.exp
fixsection.c
fixsection.exp
fixsectshr.c
float.c
float.exp
foll-exec.c
foll-exec.exp
foll-fork.c
foll-fork.exp Enable gdb.base/foll-fork.exp on OpenBSD 2015-03-04 14:53:14 +01:00
foll-vfork-exit.c
foll-vfork.c
foll-vfork.exp
foo.c
fortran-sym-case.c
fortran-sym-case.exp
frame-args.c
frame-args.exp
freebpcmd.c
freebpcmd.exp
fullname.c
fullname.exp
fullpath-expand-func.c
fullpath-expand.c
fullpath-expand.exp
func-ptr.c
func-ptr.exp
func-ptrs.c
func-ptrs.exp
funcargs.c
funcargs.exp
gcore-buffer-overflow.c
gcore-buffer-overflow.exp
gcore-relro-lib.c
gcore-relro-main.c
gcore-relro-pie.c
gcore-relro-pie.exp
gcore-relro.exp
gcore.c
gcore.exp
gdb-sigterm.c
gdb-sigterm.exp
gdb1056.exp
gdb1090.c
gdb1090.exp
gdb1250.c
gdb1250.exp
gdb1555-main.c
gdb1555.c
gdb1555.exp
gdb1821.c
gdb1821.exp
gdb11530.c
gdb11530.exp
gdb11531.c
gdb11531.exp
gdb_history
gdbindex-stabs-dwarf.c
gdbindex-stabs.c
gdbindex-stabs.exp
gdbvars.c
gdbvars.exp
global-var-nested-by-dso-solib1.c
global-var-nested-by-dso-solib2.c
global-var-nested-by-dso.c
global-var-nested-by-dso.exp
gnu-debugdata.c
gnu-debugdata.exp
gnu-ifunc-lib.c
gnu-ifunc.c
gnu-ifunc.exp
gnu_vector.c
gnu_vector.exp
grbx.c
hashline1.exp
hashline2.exp
hashline3.exp
hbreak-in-shr-unsupported-shr.c
hbreak-in-shr-unsupported.c
hbreak-in-shr-unsupported.exp
hbreak-unmapped.c
hbreak-unmapped.exp
hbreak.c
hbreak.exp
hbreak2.exp
help.exp
hook-stop-continue.c
hook-stop-continue.exp
hook-stop-frame.c
hook-stop-frame.exp
huge.c
huge.exp
ifelse.exp
included.c
included.exp
included.h
inferior-died.c
inferior-died.exp
infnan.c
infnan.exp
info-fun-solib.c
info-fun.c
info-fun.exp
info-macros.c
info-macros.exp
info-os.c
info-os.exp
info-proc.exp
info-shared-solib1.c
info-shared-solib2.c
info-shared.c
info-shared.exp
info-target.exp
infoline.c
infoline.exp
int-type.c
interact.exp
interp.c
interp.exp
interrupt-noterm.c
interrupt-noterm.exp
interrupt.c Add "../lib/unbuffer_output.c" and use it in gdb.base/interrupt.c 2015-02-27 13:54:22 +00:00
interrupt.exp
jit-dlmain.c
jit-main.c
jit-simple.c
jit-simple.exp
jit-so.exp
jit-solib.c
jit.exp
jump.c
jump.exp
kill-after-signal.c
kill-after-signal.exp
label.c
label.exp
langs.exp
langs0.c
langs1.c
langs1.f
langs2.c
langs2.cxx
ldbl_e308.c
ldbl_e308.exp
line-symtabs.c
line-symtabs.exp
line-symtabs.h
lineinc.c
lineinc.exp
lineinc1.h
lineinc2.h
lineinc3.h
linespecs.exp
list.exp
list0.c
list0.h
list1.c
logical.exp
long_long.c
long_long.exp
longest-types.c
longest-types.exp
longjmp.c
longjmp.exp
m32r.ld
m32rovly.c
macscp.exp
macscp1.c
macscp2.h
macscp3.h
macscp4.h
maint.exp
Makefile.in
memattr.c
memattr.exp
mips_pro.c
mips_pro.exp
miscexprs.c
miscexprs.exp
morestack.c
morestack.exp
moribund-step.exp
multi-forks.c
multi-forks.exp
multi-line-starts-subshell.exp
nextoverexit.c
nextoverexit.exp
nodebug.c
nodebug.exp
nofield.c
nofield.exp
noreturn-finish.c
noreturn-finish.exp
noreturn-return.c
noreturn-return.exp
normal.c
nostdlib.c
nostdlib.exp
opaque.exp
opaque0.c
opaque1.c
overlays.c
overlays.exp
ovlymgr.c
ovlymgr.h
page.exp
paginate-after-ctrl-c-running.c
paginate-after-ctrl-c-running.exp
paginate-bg-execution.c
paginate-bg-execution.exp
paginate-execution-startup.c
paginate-execution-startup.exp
paginate-inferior-exit.c
paginate-inferior-exit.exp
pc-fp.c
pc-fp.exp
pending.c
pending.exp
pendshr.c
permissions.exp
pi.txt
pie-execl.c
pie-execl.exp
pointers.c
pointers.exp
pr10179-a.c
pr10179-b.c
pr10179.exp
pr11022.c
pr11022.exp
prelink-lib.c
prelink.c
prelink.exp
print-file-var-lib1.c
print-file-var-lib2.c
print-file-var-main.c
print-file-var.exp
print-symbol-loading-lib.c
print-symbol-loading-main.c
print-symbol-loading.exp
printcmds.c
printcmds.exp
prologue-include.c
prologue-include.exp
prologue-include.h
prologue.c
prologue.exp
psymtab.exp
psymtab1.c
psymtab2.c
ptr-typedef.c
ptr-typedef.exp
ptype.c
ptype.exp
ptype1.c
radix.exp
random-signal.c
random-signal.exp
randomize.c
randomize.exp
range-stepping.c
range-stepping.exp
readline-ask.c
readline-ask.exp
readline-ask.inputrc
readline.exp
realname-expand-real.c
realname-expand.c
realname-expand.exp
recpar.c
recpar.exp
recurse.c
recurse.exp
relational.exp
relativedebug.c
relativedebug.exp
relocate.c
relocate.exp
remote.c
remote.exp
remotetimeout.exp
reread.exp
reread1.c
reread2.c
restore.c
restore.exp
return-nodebug.c
return-nodebug.exp
return-nodebug1.c
return.c
return.exp
return2.c
return2.exp
run.c
save-bp.c
save-bp.exp
savedregs.c
savedregs.exp Relax pattern to match the output of "info frame" in gdb.base/savedregs.exp 2015-03-26 08:16:20 +00:00
scope.exp
scope0.c
scope1.c
sect-cmd.exp
segv.c
sep-proc.c
sep.c
sep.exp
sepdebug.c
sepdebug.exp
sepdebug2.c
sepsymtab.c
sepsymtab.exp
set-lang-auto.exp
set-noassign.exp
setshow.c
setshow.exp
setvar.c
setvar.exp
shell.exp
shlib-call.exp
shmain.c
shr1.c
shr2.c
shreloc.c
shreloc.exp
shreloc1.c
shreloc2.c
sigall.c
sigall.exp
sigaltstack.c
sigaltstack.exp
sigbpt.c
sigbpt.exp
sigchld.c
sigchld.exp
siginfo-addr.c
siginfo-addr.exp
siginfo-infcall.c
siginfo-infcall.exp
siginfo-obj.c
siginfo-obj.exp
siginfo-thread.c
siginfo-thread.exp
siginfo.c
siginfo.exp
signals.c
signals.exp
signest.c
signest.exp
signull.c
signull.exp
sigrepeat.c
sigrepeat.exp
sigstep.c
sigstep.exp
sizeof.c
sizeof.exp
skip-solib-lib.c
skip-solib-main.c
skip-solib.exp
skip.c
skip.exp
skip1.c
so-disc-shr.c
so-impl-ld.c
so-impl-ld.exp
so-indr-cl.c
so-indr-cl.exp
solib-corrupted.exp
solib-disc.c
solib-disc.exp
solib-display-lib.c
solib-display-main.c
solib-display.exp
solib-nodir.exp
solib-overlap-lib.c
solib-overlap-main.c
solib-overlap.exp
solib-search-lib1.c
solib-search-lib2.c
solib-search.c
solib-search.exp
solib-search.h
solib-symbol-lib.c
solib-symbol-main.c
solib-symbol.exp
solib-weak.c
solib-weak.exp
solib.c
solib.exp
solib1.c
solib2.c
source-dir.exp
source-error.gdb
source-execution.c
source-execution.exp
source-execution.gdb
source-nofile.gdb
source-test.gdb
source.exp
spu.ld
ss.h
sss-bp-on-user-bp-2.c
sss-bp-on-user-bp-2.exp
sss-bp-on-user-bp.c
sss-bp-on-user-bp.exp
stack-checking.c
stack-checking.exp
stale-infcall.c
stale-infcall.exp
stap-probe.c
stap-probe.exp
start.c
start.exp
statistics.exp
step-break.c
step-break.exp
step-bt.c
step-bt.exp
step-line.c
step-line.exp
step-line.inp
step-resume-infcall.c
step-resume-infcall.exp
step-sw-breakpoint-adjust-pc.c
step-sw-breakpoint-adjust-pc.exp
step-symless.c
step-symless.exp
step-test.c
step-test.exp
store.c
store.exp
structs.c
structs.exp
structs2.c
structs2.exp
structs3.c
structs3.exp
subst.exp
sum.c
sym-file-lib.c
sym-file-loader.c
sym-file-loader.h
sym-file-main.c
sym-file.exp
symbol-without-target_section.c
symbol-without-target_section.exp
symtab-search-order-1.c
symtab-search-order-shlib-1.c
symtab-search-order.c
symtab-search-order.exp
term.c
term.exp
testenv.c
testenv.exp
trace-commands.exp
tui-layout.exp
twice.c
twice.exp
type-opaque-lib.c
type-opaque-main.c
type-opaque.exp
ui-redirect.exp
unload.c
unload.exp
unloadshr.c
unloadshr2.c
until-nodebug.exp
until.exp
unwindonsignal.c
unwindonsignal.exp
valgrind-db-attach.c
valgrind-db-attach.exp
valgrind-infcall.c
valgrind-infcall.exp
value-double-free.c
value-double-free.exp
varargs.c
varargs.exp
vdso-warning.c
vdso-warning.exp
vforked-prog.c
vla-datatypes.c
vla-datatypes.exp
vla-ptr.c
vla-ptr.exp
vla-sideeffect.c
vla-sideeffect.exp
vla-stub-define.c
vla-stub.c
vla-stub.exp
volatile.exp
watch-bitfields.c
watch-bitfields.exp
watch-cond-infcall.c
watch-cond-infcall.exp
watch-cond.c
watch-cond.exp
watch-non-mem.c
watch-non-mem.exp
watch-read.c
watch-read.exp
watch-vfork.c
watch-vfork.exp
watch_thread_num.c
watch_thread_num.exp
watchpoint-cond-gone-stripped.c
watchpoint-cond-gone.c
watchpoint-cond-gone.exp
watchpoint-delete.c
watchpoint-delete.exp
watchpoint-hw-hit-once.c
watchpoint-hw-hit-once.exp
watchpoint-hw.c
watchpoint-hw.exp
watchpoint-reuse-slot.c
watchpoint-reuse-slot.exp watchpoint-reuse-slot.exp: skip setting HW breakpoints on some address 2015-03-16 17:27:02 +00:00
watchpoint-solib-shr.c
watchpoint-solib.c
watchpoint-solib.exp
watchpoint-stops-at-right-insn.c
watchpoint-stops-at-right-insn.exp
watchpoint.c
watchpoint.exp
watchpoints.c
watchpoints.exp
wchar.c
wchar.exp
weaklib1.c
weaklib2.c
whatis-exp.exp
whatis.c
whatis.exp