[Bug gdb/14790] New: Gdb-6.6 'break' displays wrong line number information for multi threaded processes
ocagdas at yahoo dot com
sourceware-bugzilla@sourceware.org
Wed Oct 31 18:04:00 GMT 2012
http://sourceware.org/bugzilla/show_bug.cgi?id=14790
Bug #: 14790
Summary: Gdb-6.6 'break' displays wrong line number information
for multi threaded processes
Product: gdb
Version: 6.6
Status: NEW
Severity: critical
Priority: P2
Component: gdb
AssignedTo: unassigned@sourceware.org
ReportedBy: ocagdas@yahoo.com
Classification: Unclassified
For a multi threaded application running on a MIPS32 platform, gdb-6.6 and
gdb-7.5 do behave differently in terms of setting breakpoints. Basically, after
a certain line number, 6.6 seems to be totally confused about what the line
numbers are. It either rejects setting the breakpoint by saying 'No line X in
file "gdb_test.cpp"' or places the breakpoint where it thinks the line number
corresponds to but actually somewhere irrelevant. However, if I switch to
gdb-7.5 on the same target and within the same environment, it does behave as
expected.
Obviously, issue is not reproducible on 7.5 but on our system we have to use
6.6 so cannot consider a 7.5 upgrade. Therefore, I'd be interested to see if
this can either be fixed or even better can be worked around by a different
compilation/linking option.
I hope below information is sufficient and if not, I'm happy to provide what's
required. The test application is just demonstrative and please just ignore the
poor thread-synchronisation/signalling which is irrelevant to the actual issue.
- The compilation line;
mips-linux-g++ -o gdb_test gdb_test.cpp -ggdb3 -O0 -lpthread
Also tried -g3, -gstabs3 and -gstabs+ options but didn't make any difference.
-Target component versions;
linux kernel 2.6.37
gcc 4.5.3
binutils 2.19.92
uClibc 0.9.32
-ELF header of the binary;
Magic: 7f 45 4c 46 01 02 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, big endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: MIPS R3000
Version: 0x1
Entry point address: 0x4006f0
Start of program headers: 52 (bytes into file)
Start of section headers: 63456 (bytes into file)
Flags: 0x50001007, noreorder, pic, cpic, o32,
mips32
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 9
Size of section headers: 40 (bytes)
Number of section headers: 40
Section header string table index: 37
- objdump disassembled line numbers are in line with the actual source file.
-Experiment output with two different versions of gdb;
#######
# 7.5 #
#######
(gdb) show version
GNU gdb (GDB) 7.5
(gdb) list 1,60
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <pthread.h>
5
6 void* t1_func(void *ptr );
7 void* t2_func(void *ptr );
8
9 pthread_cond_t cond1 = PTHREAD_COND_INITIALIZER;
10 pthread_cond_t cond2 = PTHREAD_COND_INITIALIZER;
11 pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
12 pthread_mutex_t mutex2 = PTHREAD_MUTEX_INITIALIZER;
13
14 int main( int argc, char **argv ) {
15 int rc;
16 pthread_t thread1, thread2;
17
18 rc = pthread_create (&thread1, NULL, &t1_func, 0);
19 rc = pthread_create (&thread2, NULL, &t2_func, 0);
20
21 sleep(5);
22
23 for(;;){
24 printf("\n0");
25 rc = pthread_cond_signal(&cond1);
26 sleep(2);
27 }
28
29 rc = pthread_join(thread1, NULL);
30 rc = pthread_join(thread2, NULL);
31
32 return 0;
33 }
34
35 void* t1_func(void *ptr) {
36 int rc;
37
38 for(;;){
39 rc = pthread_mutex_lock(&mutex1);
40 rc = pthread_cond_wait(&cond1, &mutex1);
41 printf("\n1");
42 rc = pthread_mutex_unlock(&mutex1);
43 }
44
45 pthread_exit(0);
46 }
47
48 void* t2_func(void *ptr) {
49 int rc;
50
51 for(;;){
52 rc = pthread_mutex_lock(&mutex2);
53 rc = pthread_cond_wait(&cond2, &mutex2);
54 printf("\n2");
55 rc = pthread_mutex_unlock(&mutex2);
56 }
57
58 pthread_exit(0);
59 }
60
(gdb) b gdb_test.cpp:26
Breakpoint 1 at 0x400948: file gdb_test.cpp, line 26.
(gdb) b gdb_test.cpp:41
Breakpoint 2 at 0x4009d0: file gdb_test.cpp, line 41.
(gdb) b gdb_test.cpp:54
Breakpoint 3 at 0x400a7c: file gdb_test.cpp, line 54.
(gdb) r
Starting program: /var/viewer/gdb_test
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/libthread_db.so.1".
0[New Thread 0x77e014f0 (LWP 15941)]
[Switching to Thread 0x77e014f0 (LWP 15941)]
Breakpoint 2, t1_func (ptr=0x0) at gdb_test.cpp:41
41 printf("\n1");
(gdb) thread apply all bt
[New Thread 0x77c014f0 (LWP 15942)]
Thread 3 (Thread 0x77c014f0 (LWP 15942)):
#0 0x77fc2608 in pthread_cond_wait () from /lib/libpthread.so.0
#1 0x00400a74 in t2_func (ptr=0x0) at gdb_test.cpp:53
#2 0x77fc60b8 in start_thread () from /lib/libpthread.so.0
#3 0x77fbf080 in __thread_start () from /lib/libpthread.so.0
Backtrace stopped: frame did not save the PC
Thread 2 (Thread 0x77e014f0 (LWP 15941)):
#0 t1_func (ptr=0x0) at gdb_test.cpp:41
#1 0x77fc60b8 in start_thread () from /lib/libpthread.so.0
#2 0x77fbf080 in __thread_start () from /lib/libpthread.so.0
Backtrace stopped: frame did not save the PC
Thread 1 (Thread 0x77ff4000 (LWP 15937)):
#0 main (argc=1, argv=0x7fff6bb4) at gdb_test.cpp:26
(gdb) c
Continuing.
1[Switching to Thread 0x77ff4000 (LWP 15937)]
Breakpoint 1, main (argc=1, argv=0x7fff6bb4) at gdb_test.cpp:26
26 sleep(2);
(gdb) thread apply all bt
Thread 3 (Thread 0x77c014f0 (LWP 15942)):
#0 0x77fc2608 in pthread_cond_wait () from /lib/libpthread.so.0
#1 0x00400a74 in t2_func (ptr=0x0) at gdb_test.cpp:53
#2 0x77fc60b8 in start_thread () from /lib/libpthread.so.0
#3 0x77fbf080 in __thread_start () from /lib/libpthread.so.0
Backtrace stopped: frame did not save the PC
Thread 2 (Thread 0x77e014f0 (LWP 15941)):
#0 0x77fc2608 in pthread_cond_wait () from /lib/libpthread.so.0
#1 0x004009c8 in t1_func (ptr=0x0) at gdb_test.cpp:40
#2 0x77fc60b8 in start_thread () from /lib/libpthread.so.0
#3 0x77fbf080 in __thread_start () from /lib/libpthread.so.0
Backtrace stopped: frame did not save the PC
Thread 1 (Thread 0x77ff4000 (LWP 15937)):
#0 main (argc=1, argv=0x7fff6bb4) at gdb_test.cpp:26
(gdb)
#######
# 6.6 #
#######
(gdb) show version
GNU gdb 6.6.0.20070423-cvs
(gdb) list 1,60
<ManulAddition: Still displays correct source code>
(gdb) b gdb_test.cpp:26
No line 26 in file "gdb_test.cpp".
(gdb) b gdb_test.cpp:41
No line 41 in file "gdb_test.cpp".
(gdb) b gdb_test.cpp:54
No line 54 in file "gdb_test.cpp".
(gdb) r
Starting program: /var/viewer/gdb_test
[Thread debugging using libthread_db enabled]
[New Thread 2003148800 (LWP 16065)]
<ManulAddition: Runs happily and expected prints do come up periodically>
0
1
0
1
Source code;
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
void* t1_func(void *ptr );
void* t2_func(void *ptr );
pthread_cond_t cond1 = PTHREAD_COND_INITIALIZER;
pthread_cond_t cond2 = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mutex2 = PTHREAD_MUTEX_INITIALIZER;
int main( int argc, char **argv ) {
int rc;
pthread_t thread1, thread2;
rc = pthread_create (&thread1, NULL, &t1_func, 0);
rc = pthread_create (&thread2, NULL, &t2_func, 0);
sleep(5);
for(;;){
printf("\n0");
rc = pthread_cond_signal(&cond1);
sleep(2);
}
rc = pthread_join(thread1, NULL);
rc = pthread_join(thread2, NULL);
return 0;
}
void* t1_func(void *ptr) {
int rc;
for(;;){
rc = pthread_mutex_lock(&mutex1);
rc = pthread_cond_wait(&cond1, &mutex1);
printf("\n1");
rc = pthread_mutex_unlock(&mutex1);
}
pthread_exit(0);
}
void* t2_func(void *ptr) {
int rc;
for(;;){
rc = pthread_mutex_lock(&mutex2);
rc = pthread_cond_wait(&cond2, &mutex2);
printf("\n2");
rc = pthread_mutex_unlock(&mutex2);
}
pthread_exit(0);
}
--
Configure bugmail: http://sourceware.org/bugzilla/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.
More information about the Gdb-prs
mailing list