gdb/gdbserver:

2012-02-29  Yao Qi  <yao@codesourcery.com>
	    Pedro Alves  <palves@redhat.com>

	* linux-low.c (linux_wait_1): Call unsuspend_all_lwps when
	`step_over_finished' is true.

gdb/testsuite:

2012-02-29  Yao Qi  <yao@codesourcery.com>
	    Pedro Alves  <palves@redhat.com>

	* gdb.trace/trace-mt.c: New
	* gdb.trace/trace-mt.exp: New.
This commit is contained in:
Yao Qi 2012-02-29 13:59:41 +00:00
parent ae9ab7c019
commit c03e6ccce2
5 changed files with 220 additions and 0 deletions

View file

@ -1,3 +1,9 @@
2012-02-29 Yao Qi <yao@codesourcery.com>
Pedro Alves <palves@redhat.com>
* linux-low.c: (linux_wait_1): Call unsuspend_all_lwps when
`step_over_finished' is true.
2012-02-27 Pedro Alves <palves@redhat.com>
* linux-low.c (pid_is_stopped): Delete, moved to common/.

View file

@ -2509,6 +2509,15 @@ Check if we're already there.\n",
why. */
find_inferior (&all_lwps, cancel_breakpoints_callback, event_child);
/* If we were going a step-over, all other threads but the stepping one
had been paused in start_step_over, with their suspend counts
incremented. We don't want to do a full unstop/unpause, because we're
in all-stop mode (so we want threads stopped), but we still need to
unsuspend the other threads, to decrement their `suspended' count
back. */
if (step_over_finished)
unsuspend_all_lwps (event_child);
/* Stabilize threads (move out of jump pads). */
stabilize_threads ();
}

View file

@ -1,3 +1,9 @@
2012-02-29 Yao Qi <yao@codesourcery.com>
Pedro Alves <palves@redhat.com>
* gdb.trace/trace-mt.c: New.
* gdb.trace/trace-mt.exp: New.
2012-02-28 Thomas Schwinge <thomas@codesourcery.com>
* gdb.base/annota1.exp: Use gdb_get_line_number for retrieving line

View file

@ -0,0 +1,63 @@
/* This testcase is part of GDB, the GNU debugger.
Copyright 2012 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include <pthread.h>
#ifdef SYMBOL_PREFIX
#define SYMBOL(str) SYMBOL_PREFIX #str
#else
#define SYMBOL(str) #str
#endif
/* Called from asm. */
static void __attribute__((used))
func (void)
{}
static void *
thread_function(void *arg)
{
/* `set_point1' is the label at which to set a fast tracepoint. The
insn at the label must be large enough to fit a fast tracepoint
jump. */
asm (" .global " SYMBOL(set_point1) "\n"
SYMBOL(set_point1) ":\n"
#if (defined __x86_64__ || defined __i386__)
" call " SYMBOL(func) "\n"
#endif
);
}
static void
end (void)
{}
int
main (int argc, char *argv[], char *envp[])
{
pthread_t threads[2];
int i;
for (i = 0; i < 2; i++)
pthread_create (&threads[i], NULL, thread_function, NULL);
for (i = 0; i < 2; i++)
pthread_join (threads[i], NULL);
end ();
return 0;
}

View file

@ -0,0 +1,136 @@
# Copyright 2012 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
load_lib "trace-support.exp";
set testfile "trace-mt"
set executable $testfile
set srcfile $testfile.c
set binfile $objdir/$subdir/$testfile
set expfile $testfile.exp
# Some targets have leading underscores on assembly symbols.
set additional_flags [gdb_target_symbol_prefix_flags]
if { [gdb_compile_pthreads "$srcdir/$subdir/$srcfile" $binfile \
executable [list debug $additional_flags] ] != "" } {
untested "Couldn't compile test program"
return -1
}
clean_restart ${testfile}
if ![runto_main] {
fail "Can't run to main to check for trace support"
return -1
}
if ![gdb_target_supports_trace] {
unsupported "target does not support trace"
return -1
}
proc step_over_tracepoint { trace_type } \
{with_test_prefix "step over $trace_type" \
{
global executable
global hex
# Start with a fresh gdb.
clean_restart ${executable}
# Make sure inferior is running in all-stop mode.
gdb_test_no_output "set non-stop 0"
if ![runto_main] {
fail "Can't run to main"
return -1
}
gdb_test "break set_point1" "Breakpoint \[0-9\] at $hex: file.*"
gdb_test "continue" "Continuing\\.\[ \r\n\]+.*Breakpoint.*" "continue to set_point1"
gdb_test "${trace_type} *\$pc" "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*"
gdb_test_no_output "tstart"
gdb_test "stepi" ".*"
gdb_test_no_output "tstop"
}}
# Set breakpoint and tracepoint at the same address.
proc break_trace_same_addr { trace_type option } \
{with_test_prefix "$trace_type $option" \
{
global executable
global hex
# Start with a fresh gdb.
clean_restart ${executable}
if ![runto_main] {
fail "Can't run to main"
return -1
}
gdb_test_no_output "set breakpoint always-inserted ${option}"
gdb_test "break end" "Breakpoint \[0-9\] at $hex: file.*"
gdb_test "break set_point1" "Breakpoint \[0-9\] at $hex: file.*"
gdb_test "${trace_type} set_point1" "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*"
gdb_test_no_output "tstart"
gdb_test "continue" "Continuing\\.\[ \r\n\]+.*Breakpoint.*" "continue to set_point1 1"
gdb_test "continue" "Continuing\\.\[ \r\n\]+.*Breakpoint.*" "continue to set_point1 2"
gdb_test "continue" "Continuing\\.\[ \r\n\]+.*Breakpoint.*" "continue to end"
gdb_test_no_output "tstop"
gdb_test "tfind" "Found trace frame 0, tracepoint .*" "tfind frame 0"
gdb_test "tfind" "Found trace frame 1, tracepoint .*" "tfind frame 1"
gdb_test "tfind" "Target failed to find requested trace frame\\..*"
}}
foreach break_always_inserted { "on" "off" } {
break_trace_same_addr "trace" ${break_always_inserted}
}
step_over_tracepoint "trace"
set libipa $objdir/../gdbserver/libinproctrace.so
gdb_load_shlibs $libipa
# Compile test case again with IPA.
if { [gdb_compile_pthreads "$srcdir/$subdir/$srcfile" $binfile \
executable [list debug $additional_flags shlib=$libipa] ] != "" } {
untested "failed to compile ftrace tests"
return -1
}
clean_restart ${executable}
if ![runto_main] {
fail "Can't run to main for ftrace tests"
return 0
}
gdb_reinitialize_dir $srcdir/$subdir
if { [gdb_test "info sharedlibrary" ".*libinproctrace\.so.*" "IPA loaded"] != 0 } {
untested "Could not find IPA lib loaded"
} else {
foreach break_always_inserted { "on" "off" } {
break_trace_same_addr "ftrace" ${break_always_inserted}
}
step_over_tracepoint "ftrace"
}