This is the mail archive of the gdb-prs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

threads/2015: DECR_PC_AFTER_BREAK mishandled in threaded debugging


>Number:         2015
>Category:       threads
>Synopsis:       DECR_PC_AFTER_BREAK mishandled in threaded debugging
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    unassigned
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Sat Sep 24 10:48:01 UTC 2005
>Closed-Date:
>Last-Modified:
>Originator:     schwab@suse.de
>Release:        6.3.50.20050923-cvs
>Organization:
>Environment:
i386-linux, x86_64-linux, s390-linux
>Description:
During single stepping a threaded process a spurious SIGTRAP is reported instead of treating it as a breakpoint hit.  That can also result in the process receiving a SIGSEGV because the pc isn't properly backed up over the breakpoint before continuing.  This only happens on targets that set DECR_PC_AFTER_BREAK to non-zero.
>How-To-Repeat:
$ g++ -g thread4.cc -o thread4 -lpthread
$ gdb/gdb thread4
GNU gdb 6.3.50.20050923-cvs
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "x86_64-linux"...Using host libthread_db library "/lib64/tls/libthread_db.so.1".

(gdb) b 93
Breakpoint 1 at 0x401095: file thread4.cc, line 93.
(gdb) r 5 10
Starting program: /tmp/thread4 5 10
[Thread debugging using libthread_db enabled]
[New Thread 46912505087168 (LWP 31048)]
[New Thread 1075837280 (LWP 31051)]
[Switching to Thread 1075837280 (LWP 31051)]

Breakpoint 1, consumerThread (data=0x7fffffd4dd20) at thread4.cc:93
93            int data = tq->consume ();
(gdb) n
[New Thread 1077934432 (LWP 31052)]
[Switching to Thread 1077934432 (LWP 31052)]

Breakpoint 1, consumerThread (data=0x7fffffd4dd20) at thread4.cc:93
93            int data = tq->consume ();
(gdb) n
[New Thread 1080031584 (LWP 31053)]
[New Thread 1082128736 (LWP 31054)]
[Switching to Thread 1080031584 (LWP 31053)]

Breakpoint 1, consumerThread (data=0x7fffffd4dd20) at thread4.cc:93
93            int data = tq->consume ();
(gdb) 
[New Thread 1084225888 (LWP 31055)]
[Switching to Thread 1082128736 (LWP 31054)]

Breakpoint 1, consumerThread (data=0x7fffffd4dd20) at thread4.cc:93
93            int data = tq->consume ();
(gdb) 
[Switching to Thread 1077934432 (LWP 31052)]
94            if (data == -1)
(gdb) 
97            tq->process (data);
(gdb) s
[Switching to Thread 1080031584 (LWP 31053)]
94            if (data == -1)
(gdb) n
97            tq->process (data);
(gdb) s
[Switching to Thread 1075837280 (LWP 31051)]
94            if (data == -1)
(gdb) n
97            tq->process (data);
(gdb) s
TestQueue::process (this=0x7fffffd4dd20, data=2) at thread4.cc:66
66          pthread_mutex_lock (&queueLock_);
(gdb) n
[Switching to Thread 1084225888 (LWP 31055)]

Breakpoint 1, consumerThread (data=0x7fffffd4dd20) at thread4.cc:93
93            int data = tq->consume ();
(gdb) 
[Switching to Thread 1075837280 (LWP 31051)]
TestQueue::process (this=0x7fffffd4dd20, data=2) at thread4.cc:67
67          cout << "Thread t@" << pthread_self ()
(gdb) 
Thread t@1075837280 consuming [2]
69          pthread_mutex_unlock (&queueLock_);
(gdb) 
70        }
(gdb) 
Thread t@1080031584 consuming [1]
Thread t@1082128736 consuming [3]
Thread t@1077934432 consuming [0]
consumerThread (data=0x7fffffd4dd20) at thread4.cc:93
93            int data = tq->consume ();
(gdb) 

Program received signal SIGTRAP, Trace/breakpoint trap.
[Switching to Thread 1080031584 (LWP 31053)]
0x00000000004010b6 in consumerThread (data=0x7fffffd4dd20) at thread4.cc:97
97            tq->process (data);
(gdb) 
>Fix:
A partial fix is to call context_switch in adjust_pc_after_break so that prev_pc contains the value connected to the stopped thread, but that does not fix the spurious SIGSEGV.

--- infrun.c	01 Aug 2005 11:52:13 +0200	1.203
+++ infrun.c	24 Sep 2005 12:38:39 +0200	
@@ -1174,6 +1174,21 @@ adjust_pc_after_break (struct execution_
   if (ecs->ws.value.sig != TARGET_SIGNAL_TRAP)
     return;
 
+  /* Switch context now so that we access the state of the stopped
+     thread.  */
+  if (!ptid_equal (ecs->ptid, inferior_ptid))
+    {
+      if (debug_infrun)
+	fprintf_unfiltered (gdb_stdlog, "infrun: context switch\n");
+
+      context_switch (ecs);
+
+      if (deprecated_context_hook)
+	deprecated_context_hook (pid_to_thread_id (ecs->ptid));
+
+      flush_cached_frames ();
+    }
+
   /* Find the location where (if we've hit a breakpoint) the
      breakpoint would be.  */
   breakpoint_pc = read_pc_pid (ecs->ptid) - DECR_PC_AFTER_BREAK;
>Release-Note:
>Audit-Trail:
>Unformatted:
----gnatsweb-attachment----
Content-Type: text/x-c++src; name="thread4.cc"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="thread4.cc"

I2luY2x1ZGUgPHB0aHJlYWQuaD4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8cXVldWU+
Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKCi8vIFNpbXBsZSB0ZXN0IGNsYXNzIHRoYXQgd3JhcHMg
YSBxdWV1ZSBhbmQgZXhwb3NlcyBtZXRob2RzIHRvIHByb2R1Y2UgYW5kCi8vIGNvbnN1bWUgZGF0
YSBmcm9tIGl0LiAgVGhlIGNsYXNzIGlzIGluaXRpYWxpemVkIHdpdGggYSBjb3VudGVyIHRoYXQK
Ly8gZGVmaW5lcyBob3cgbWFueSBpdGVtcyB0byBwcm9jZXNzOyBvbmNlIHdlIHJlYWNoIHRoYXQg
bGltaXQsIHdlIHJldHVybgovLyAtMSBmcm9tIGNvbnN1bWUgc2lnbmFsaW5nIHRoZSBjb25zdW1l
cnMgdGhhdCB3ZSdyZSBkb25lCmNsYXNzIFRlc3RRdWV1ZQp7CnB1YmxpYzoKICBUZXN0UXVldWUg
KGludCBudW1JdGVyKQogIHsKICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCAoJnF1ZXVlTG9ja18sIE5V
TEwpOwogICAgcHRocmVhZF9jb25kX2luaXQgKCZxdWV1ZUNWXywgTlVMTCk7CiAgICBudW1MZWZ0
XyA9IG51bUl0ZXI7CiAgfQoKICB+VGVzdFF1ZXVlICgpCiAgewogIH0KCgogIC8vIG5vdGhpbmcg
ZmFuY3kgLSBqdXN0IGxvY2ssIHB1c2gsIHNpZ25hbCwgdW5sb2NrCiAgdm9pZCBwcm9kdWNlIChp
bnQgZGF0YSkKICB7CiAgICBwdGhyZWFkX211dGV4X2xvY2sgKCZxdWV1ZUxvY2tfKTsKICAgIHF1
ZXVlXy5wdXNoIChkYXRhKTsKICAgIHB0aHJlYWRfY29uZF9icm9hZGNhc3QgKCZxdWV1ZUNWXyk7
CiAgICBwdGhyZWFkX211dGV4X3VubG9jayAoJnF1ZXVlTG9ja18pOwogIH0KCiAgLy8gbm90aGlu
ZyBmYW5jeSAtIGp1c3QgbG9jaywgd2FpdCwgcG9wLCB1bmxvY2sKICBpbnQgY29uc3VtZSAoKQog
IHsKICAgIHB0aHJlYWRfbXV0ZXhfbG9jayAoJnF1ZXVlTG9ja18pOwoKICAgIGlmIChudW1MZWZ0
XyA9PSAwKQogICAgICB7CglwdGhyZWFkX211dGV4X3VubG9jayAoJnF1ZXVlTG9ja18pOwoJcmV0
dXJuICgtMSk7CiAgICAgIH0KCiAgICB3aGlsZSAocXVldWVfLmVtcHR5ICgpICYmIG51bUxlZnRf
ICE9IDApCiAgICAgIHB0aHJlYWRfY29uZF93YWl0ICgmcXVldWVDVl8sICZxdWV1ZUxvY2tfKTsK
CiAgICBpZiAobnVtTGVmdF8gPT0gMCkKICAgICAgewoJcHRocmVhZF9tdXRleF91bmxvY2sgKCZx
dWV1ZUxvY2tfKTsKCXJldHVybiAoLTEpOwogICAgICB9CgogICAgaW50IGRhdGEgPSBxdWV1ZV8u
ZnJvbnQgKCk7CiAgICBxdWV1ZV8ucG9wICgpOwogICAgbnVtTGVmdF8tLTsKICAgIHB0aHJlYWRf
bXV0ZXhfdW5sb2NrICgmcXVldWVMb2NrXyk7CiAgICByZXR1cm4gKGRhdGEpOwogIH0KCiAgLy8g
anVzdCBsb2cgdGhlIGZhY3QgdGhhdCB3ZSBwcm9jZXNzZWQgdGhlIGl0ZW0KICB2b2lkIHByb2Nl
c3MgKGludCBkYXRhKQogIHsKICAgIHB0aHJlYWRfbXV0ZXhfbG9jayAoJnF1ZXVlTG9ja18pOwog
ICAgY291dCA8PCAiVGhyZWFkIHRAIiA8PCBwdGhyZWFkX3NlbGYgKCkKCSA8PCAiIGNvbnN1bWlu
ZyBbIiA8PCBkYXRhIDw8ICJdIiA8PCBlbmRsOwogICAgcHRocmVhZF9tdXRleF91bmxvY2sgKCZx
dWV1ZUxvY2tfKTsKICB9Cgpwcml2YXRlOgogIHB0aHJlYWRfbXV0ZXhfdCBxdWV1ZUxvY2tfOwog
IHB0aHJlYWRfY29uZF90IHF1ZXVlQ1ZfOwoKICBxdWV1ZSA8aW50PiBxdWV1ZV87CiAgaW50IG51
bUxlZnRfOwp9OwoKCi8vIGNvbnN1bWVyIHRocmVhZHMgZXhlY3V0ZSB0aGlzCi8vIHRoZXkgbG9v
cCB1bnRpbCB0aGVyZSBhcmUgbm8gbW9yZSBpdGVtcyB0byBwcm9jZXNzCi8vIChUZXN0UXVldWU6
OmNvbnN1bWUoKSByZXR1cm5zIC0xKQp2b2lkICoKY29uc3VtZXJUaHJlYWQgKHZvaWQgKmRhdGEp
CnsKICBUZXN0UXVldWUgKnRxID0gKFRlc3RRdWV1ZSAqKSBkYXRhOwoKICBwdGhyZWFkX3QgdGlk
ID0gcHRocmVhZF9zZWxmICgpOwoKICB3aGlsZSAodHJ1ZSkKICAgIHsKICAgICAgaW50IGRhdGEg
PSB0cS0+Y29uc3VtZSAoKTsKICAgICAgaWYgKGRhdGEgPT0gLTEpCglicmVhazsKCiAgICAgIHRx
LT5wcm9jZXNzIChkYXRhKTsKICAgIH0KCiAgcmV0dXJuIChOVUxMKTsKfQoKCmludAptYWluIChp
bnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKICBpZiAoYXJnYyAhPSAzKQogICAgewogICAgICBjb3V0
IDw8ICJ1c2FnZTogIiA8PCBhcmd2WzBdIDw8ICIgPG51bVRocmVhZHM+IDxudW1JdGVyPiIgPDwg
ZW5kbDsKICAgICAgcmV0dXJuICgxKTsKICAgIH0KCiAgaW50IG51bVRocmVhZHMgPSBhdG9pIChh
cmd2WzFdKTsKICBpbnQgbnVtSXRlciA9IGF0b2kgKGFyZ3ZbMl0pOwogIHB0aHJlYWRfdCAqdGhy
ZWFkSWQgPSBuZXcgcHRocmVhZF90W251bVRocmVhZHNdOwoKICBUZXN0UXVldWUgdHEgKG51bUl0
ZXIpOwoKICBmb3IgKGludCBpZHggKDApOyBpZHggPCBudW1UaHJlYWRzOyBpZHgrKykKICAgIHB0
aHJlYWRfY3JlYXRlICgmdGhyZWFkSWRbaWR4XSwgMCwgJmNvbnN1bWVyVGhyZWFkLCAodm9pZCAq
KSAmdHEpOwoKICAvLyBLZWVwIHByb2R1Y2luZyBkYXRhIGZvciB0aGUgY29uc3VtZXJzCiAgZm9y
IChpbnQgaWR4ICgwKTsgaWR4IDwgbnVtSXRlcjsgaWR4KyspCiAgICB0cS5wcm9kdWNlIChpZHgp
OwoKICBmb3IgKGludCBpZHggKDApOyBpZHggPCBudW1UaHJlYWRzOyBpZHgrKykKICAgIHB0aHJl
YWRfam9pbiAodGhyZWFkSWRbaWR4XSwgMCk7CgogIHJldHVybiAoMCk7Cn0K


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]