binutils-gdb/gdb/testsuite/gdb.trace
Yao Qi a880623024 Initialize target description early in IPA
Target descriptions are allocated lazily, that is fine in GDBserver,
but it is not safe to call malloc in gdb_collect in IPA, because we
can set a fast tracepoint in malloc, and when the tracepoint is hit,
gdb_collect/malloc is called, deadlock or memory corruption may be
triggered.

 #0  0xf7cfc200 in malloc ()
 #1  0xf7efdc07 in operator new(unsigned int) ()
 #2  0xf7ef7636 in allocate_target_description() ()
 #3  0xf7efcbe1 in i386_create_target_description(unsigned long long, bool) ()
 #4  0xf7efb474 in i386_linux_read_description(unsigned long long) ()
 #5  0xf7efb190 in get_ipa_tdesc(int) ()
 #6  0xf7ef9baa in gdb_collect ()

The fix is to initialize all target descriptions earlier, when the
IPA is loaded.  In order to guarantee malloc is not called in IPA
in gdb_collect, I change the test to set a breakpoint on malloc, if
IPA gdb_collect calls malloc, program will hit the breakpoint, and
test fail.

continue
Continuing.

Thread 1 "" hit Breakpoint 5, 0xf7cfc200 in malloc ()
(gdb) FAIL: gdb.trace/ftrace.exp: advance through tracing

gdb/gdbserver:

2017-12-07  Yao Qi  <yao.qi@linaro.org>

	* linux-aarch64-ipa.c (initialize_low_tracepoint): Call
	aarch64_linux_read_description.
	* linux-amd64-ipa.c (idx2mask): New array.
	(get_ipa_tdesc): Move idx2mask out.
	(initialize_low_tracepoint): Initialize target descriptions.
	* linux-i386-ipa.c (idx2mask): New array.
	(get_ipa_tdesc): Move idx2mask out.
	(initialize_low_tracepoint): Initialize target descriptions.

gdb/testsuite:

2017-12-07  Yao Qi  <yao.qi@linaro.org>

	* gdb.trace/ftrace.exp (run_trace_experiment): Set breakpoint on
	malloc and catch syscall.
2017-12-07 17:07:01 +00:00
..
actions-changed.c
actions-changed.exp
actions.c
actions.exp
ax.exp
backtrace.exp
change-loc-1.c
change-loc-2.c
change-loc.c
change-loc.exp
change-loc.h
circ.c
circ.exp
collection.c
collection.exp
deltrace.exp
disconnected-tracing.c
disconnected-tracing.exp
entry-values.c
entry-values.exp
ftrace-lock.c
ftrace-lock.exp
ftrace.c
ftrace.exp
infotrace.exp
mi-trace-frame-collected.exp
mi-trace-save.exp
mi-trace-unavailable.exp
mi-traceframe-changed.exp
mi-tracepoint-changed.exp
mi-tsv-changed.exp
no-attach-trace.c
no-attach-trace.exp
packetlen.exp
passc-dyn.exp
passcount.exp
pending.c
pending.exp
pendshr1.c
pendshr2.c
pr16508.exp
qtro.c
qtro.exp
range-stepping.c
range-stepping.exp
read-memory.c
read-memory.exp
report.exp
save-trace.exp
signal.c
signal.exp
stap-trace.c
stap-trace.exp
status-stop.c
status-stop.exp
strace.c
strace.exp
tfile.c
tfile.exp
tfind.exp
trace-break.c
trace-break.exp
trace-buffer-size.c
trace-buffer-size.exp
trace-common.h
trace-condition.c
trace-condition.exp
trace-enable-disable.c
trace-enable-disable.exp
trace-mt.c
trace-mt.exp
trace-unavailable.c
tracecmd.exp
tracefile-pseudo-reg.c
tracefile-pseudo-reg.exp
tspeed.c
tspeed.exp
tstatus.exp
tsv.exp
unavailable-dwarf-piece.c
unavailable-dwarf-piece.exp
unavailable.cc
unavailable.exp
while-dyn.exp
while-stepping.exp