From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 7187 invoked by alias); 27 Aug 2013 11:31:31 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 7178 invoked by uid 89); 27 Aug 2013 11:31:31 -0000 Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 27 Aug 2013 11:31:31 +0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-3.0 required=5.0 tests=AWL,BAYES_00,KHOP_THREADED,RDNS_NONE,SPF_HELO_FAIL autolearn=no version=3.3.2 X-HELO: relay1.mentorg.com Received: from svr-orw-exc-10.mgc.mentorg.com ([147.34.98.58]) by relay1.mentorg.com with esmtp id 1VEHUb-0006CT-5D from Muhammad_Waqas@mentor.com ; Tue, 27 Aug 2013 04:31:25 -0700 Received: from SVR-IES-FEM-01.mgc.mentorg.com ([137.202.0.104]) by SVR-ORW-EXC-10.mgc.mentorg.com with Microsoft SMTPSVC(6.0.3790.4675); Tue, 27 Aug 2013 04:31:25 -0700 Received: from waqas-desktop.mgc.mentorg.com (137.202.0.76) by SVR-IES-FEM-01.mgc.mentorg.com (137.202.0.104) with Microsoft SMTP Server (TLS) id 14.2.247.3; Tue, 27 Aug 2013 12:31:21 +0100 From: Muhammad Waqas To: CC: , Muhammad Waqas Subject: Re: [PATCH with testcase] Bug 11568 - delete thread-specific breakpoint on the thread exit Date: Tue, 27 Aug 2013 11:31:00 -0000 Message-ID: <1377602943-9177-1-git-send-email-mwaqas@codesourcery.com> In-Reply-To: <521646F5.1010509@redhat.com> References: <521646F5.1010509@redhat.com> MIME-Version: 1.0 Content-Type: text/plain X-SW-Source: 2013-08/txt/msg00776.txt.bz2 2013-08-05 Muhammad Waqas PR gdb/11568 * breakpoint.c (remove_threaded_breakpoints): New function. * breakpoint.c (_initialize_breakpoint): function remove_threaded_breakpoints registers with thread_exit. 2013-07-24 Muhammad Waqas Jan Kratochvil PR gdb/11568 * gdb.thread/thread-specific-bp.c: New file. * gdb.thread/thread-specific-bp.exp: New file. --- gdb/breakpoint.c | 19 +++++ gdb/testsuite/gdb.threads/thread-specific-bp.c | 33 ++++++++ gdb/testsuite/gdb.threads/thread-specific-bp.exp | 98 ++++++++++++++++++++++ 3 files changed, 150 insertions(+) create mode 100644 gdb/testsuite/gdb.threads/thread-specific-bp.c create mode 100644 gdb/testsuite/gdb.threads/thread-specific-bp.exp diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index 44bb7a8..588a9b0 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -2928,6 +2928,24 @@ remove_breakpoints (void) return val; } +/* Used when a thread exits, it will remove breakpoints which + are related to that thread. */ + +static void +remove_threaded_breakpoints (struct thread_info *tp, int silent) +{ + struct breakpoint *b, *b_tmp; + + ALL_BREAKPOINTS_SAFE (b, b_tmp) + { + if (b->thread == tp->num) + { + b->disposition = disp_del_at_next_stop; + b->number = 0; + } + } +} + /* Remove breakpoints of process PID. */ int @@ -16587,4 +16605,5 @@ agent-printf \"printf format string\", arg1, arg2, arg3, ..., argn\n\ automatic_hardware_breakpoints = 1; observer_attach_about_to_proceed (breakpoint_about_to_proceed); + observer_attach_thread_exit (remove_threaded_breakpoints); } diff --git a/gdb/testsuite/gdb.threads/thread-specific-bp.c b/gdb/testsuite/gdb.threads/thread-specific-bp.c new file mode 100644 index 0000000..474d667 --- /dev/null +++ b/gdb/testsuite/gdb.threads/thread-specific-bp.c @@ -0,0 +1,33 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2013 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 . */ + +#include + +static void * +start (void *arg) +{ + return NULL; +} + +int +main (void) +{ + pthread_t thread; + pthread_create (&thread, NULL, start, NULL); + pthread_join (thread, NULL); + return 0; /*set break here*/ +} diff --git a/gdb/testsuite/gdb.threads/thread-specific-bp.exp b/gdb/testsuite/gdb.threads/thread-specific-bp.exp new file mode 100644 index 0000000..44df563 --- /dev/null +++ b/gdb/testsuite/gdb.threads/thread-specific-bp.exp @@ -0,0 +1,98 @@ +# Copyright (C) 2013 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 . +# +# Verify that a thread-specific breakpoint is deleted when the +# corresponding thread is gone. + +standard_testfile + +if {[gdb_compile_pthreads \ + "${srcdir}/${subdir}/${srcfile}" \ + "${binfile}" executable {debug} ] != "" } { + return -1 +} + +clean_restart ${binfile} + +proc check_threaded_breakpoint {mode} { with_test_prefix "$mode" { + + global gdb_prompt + gdb_breakpoint "start" + gdb_continue_to_breakpoint "start" + set thre 0 + + gdb_test_multiple "info threads" "get thread 1 id" { + -re "(\[0-9\]+)(\[^\n\r\]*Thread\[^\n\r\]*start.*)($gdb_prompt $)" { + pass "thread created" + # get the id of thread + set thre $expect_out(1,string) + } + } + gdb_breakpoint "main thread $thre" + gdb_test "info break" ".*breakpoint.*thread $thre" "Breakpoint set" + gdb_breakpoint [gdb_get_line_number "set break here"] + + # Force GDB to update its knowledge on existing threads when this + # breakpoint is hit. Otherwise, GDB doesn't realize thread $thre + # has exited and doesn't remove the thread specific breakpoint. + gdb_test "commands\ninfo threads\nend" "End with.*" "add breakpoint commands" + gdb_test "thread $thre" "Switching to thread $thre.*" "Thread $thre selected" + set full_name "continue to breakpoint: set break here" + + send_gdb "continue\n" + gdb_expect 10 { + -re "(?:Breakpoint|Temporary breakpoint) .* (at|in) .*\r\n$gdb_prompt $" { + pass $full_name + } + -re ".*$gdb_prompt $" { + fail $full_name + } + timeout { + send_gdb "thread 1\n" + exp_continue + } + } + + set test "thread-specific breakpoint is deleted" + gdb_test_multiple "info breakpoint" $test { + -re "thread $thre.*$gdb_prompt $" { + fail $test + } + -re "$gdb_prompt $" { + pass $test + } + }} +} + +if ![runto_main] { + untested "could not run to main" + return -1 +} + +# Testing in all stop mode. +check_threaded_breakpoint "All stop" + +clean_restart ${binfile} + +gdb_test "set target-async on" ".*" "Set async mode" +gdb_test "set non-stop on" ".*" "Set non stop mode" + +if ![runto_main] { + untested "could not run to main" + return -1 +} + +# Testing in non-stop with async mode. +check_threaded_breakpoint "non-stop with async" -- 1.7.9.5