]>
Commit | Line | Data |
---|---|---|
e2882c85 | 1 | # Copyright 2002-2018 Free Software Foundation, Inc. |
a911c360 MS |
2 | |
3 | # This program is free software; you can redistribute it and/or modify | |
4 | # it under the terms of the GNU General Public License as published by | |
e22f8b7c | 5 | # the Free Software Foundation; either version 3 of the License, or |
a911c360 | 6 | # (at your option) any later version. |
e22f8b7c | 7 | # |
a911c360 MS |
8 | # This program is distributed in the hope that it will be useful, |
9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
11 | # GNU General Public License for more details. | |
e22f8b7c | 12 | # |
a911c360 | 13 | # You should have received a copy of the GNU General Public License |
e22f8b7c | 14 | # along with this program. If not, see <http://www.gnu.org/licenses/>. |
a911c360 | 15 | |
a911c360 MS |
16 | # This file was written by Michael Snyder (msnyder@redhat.com) |
17 | # This is a test for the gdb command "generate-core-file". | |
18 | ||
a911c360 | 19 | # Single-threaded test case |
0efbbabc TT |
20 | standard_testfile pthreads.c |
21 | set objfile $binfile.o | |
22 | set corefile $binfile.test | |
23 | set core0file ${binfile}0.test | |
a911c360 | 24 | |
a911c360 MS |
25 | if [istarget "*-*-linux"] then { |
26 | set target_cflags "-D_MIT_POSIX_THREADS" | |
27 | } else { | |
28 | set target_cflags "" | |
29 | } | |
b5ab8ff3 | 30 | |
774094b8 JK |
31 | # Attempt to prevent -Wl,-z,relro which happens by default at least on |
32 | # Kubuntu-10.10. Due to PR corefiles/11804 will then GDB be unable to find | |
33 | # libpthread, therefore libthread_db will not fail as expected | |
34 | # on the test `zeroed-threads cannot be listed'. | |
35 | ||
0efbbabc | 36 | set opts [list debug] |
774094b8 JK |
37 | if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${objfile}" object $opts] != "" |
38 | || ([gdb_compile_pthreads "${objfile}" "${binfile}" executable [concat $opts {additional_flags=-Wl,-z,norelro}] ] != "" | |
39 | && [gdb_compile_pthreads "${objfile}" "${binfile}" executable $opts] != "") } { | |
a911c360 MS |
40 | return -1 |
41 | } | |
42 | ||
43 | # Now we can proceed with the real testing. | |
44 | ||
45 | # Start with a fresh gdb. | |
46 | ||
4fe85f5c | 47 | clean_restart ${testfile} |
a911c360 MS |
48 | |
49 | # regexp for "horizontal" text (i.e. doesn't include newline or | |
50 | # carriage return) | |
51 | set horiz "\[^\n\r\]*" | |
52 | ||
53 | # regexp for newline | |
54 | set nl "\[\r\n\]+" | |
55 | ||
56 | set timeout 30 | |
57 | ||
3ad13771 | 58 | if { ! [ runto_main ] } then { |
5b362f04 | 59 | untested "could not run to main" |
b60f0898 | 60 | return -1 |
a911c360 MS |
61 | } |
62 | ||
9db70545 | 63 | gdb_test_multiple "info threads" "threads are supported" { |
a911c360 MS |
64 | -re ".* main .*$gdb_prompt $" { |
65 | # OK, threads are supported. | |
66 | } | |
67 | -re "${nl}$gdb_prompt $" { | |
68 | unsupported "gdb does not support threads on this target" | |
ae59b1da | 69 | return -1 |
a911c360 MS |
70 | } |
71 | } | |
72 | ||
73 | # Make sure thread 1 is running | |
74 | delete_breakpoints | |
75 | gdb_breakpoint "thread1" | |
76 | gdb_test "continue" "Continuing.*Breakpoint.* thread1 .*" "thread 1 is running" | |
77 | ||
78 | # Make sure thread 2 is running | |
79 | delete_breakpoints | |
80 | gdb_breakpoint "thread2" | |
81 | gdb_test "continue" "Continuing.*Breakpoint.* thread2 .*" "thread 2 is running" | |
82 | ||
83 | # Drop corefile | |
2d338fa9 | 84 | set core_supported [gdb_gcore_cmd "$corefile" "save a corefile"] |
7d605576 | 85 | |
7d605576 DJ |
86 | if {!$core_supported} { |
87 | return -1 | |
88 | } | |
a911c360 | 89 | |
4fe85f5c | 90 | |
254f582e JK |
91 | # Test the uninitialized thread list. |
92 | # Provide the case of glibc td_thr_get_info handling of: | |
93 | # /* Special case for the main thread before initialization. */ | |
94 | ||
95 | foreach symbol {__stack_user stack_used} { | |
96 | set test "clear ${symbol}.next" | |
97 | gdb_test_multiple "p *(void **) &${symbol} = 0" $test { | |
98 | -re " = \\(void \\*\\) 0x0\r\n$gdb_prompt $" { | |
99 | pass $test | |
100 | } | |
101 | -re "No symbol \"${symbol}\" in current context\\.\r\n$gdb_prompt $" { | |
102 | xfail $test | |
103 | # Do not do the verification. | |
104 | set core0file "" | |
105 | } | |
106 | } | |
107 | } | |
108 | ||
109 | if {"$core0file" != ""} { | |
110 | gdb_test "gcore $core0file" "Saved corefile .*" "save a zeroed-threads corefile" | |
111 | } | |
112 | ||
113 | ||
a911c360 | 114 | # Now restart gdb and load the corefile. |
4fe85f5c JK |
115 | clean_restart ${testfile} |
116 | ||
fcb44371 | 117 | foreach name { corefile core0file } { with_test_prefix $name { |
fac51dd9 DE |
118 | set core_loaded [gdb_core_cmd [subst $$name] "re-load generated corefile"] |
119 | if { $core_loaded == -1 } { | |
120 | # No use proceeding from here. | |
fcb44371 JK |
121 | continue |
122 | } | |
a911c360 | 123 | |
fcb44371 JK |
124 | # FIXME: now what can we test about the thread state? |
125 | # We do not know for certain that there should be at least | |
126 | # three threads, because who knows what kind of many-to-one | |
127 | # mapping various OS's may do? Let's assume that there must | |
128 | # be at least two threads: | |
a911c360 | 129 | |
b05b1202 | 130 | gdb_test "info threads" "\\* 1 ${horiz}${nl} 2 ${horiz}.*" \ |
fcb44371 | 131 | "corefile contains at least two threads" |
254f582e | 132 | |
fcb44371 | 133 | # One thread in the corefile should be in the "thread2" function. |
254f582e | 134 | |
fcb44371 JK |
135 | gdb_test "info threads" ".* thread2 .*" \ |
136 | "a corefile thread is executing thread2" | |
254f582e | 137 | |
fcb44371 | 138 | # The thread2 thread should be marked as the current thread. |
254f582e | 139 | |
b05b1202 | 140 | gdb_test "info threads" "\\* ${horiz} thread2 .*${nl}" \ |
fcb44371 JK |
141 | "thread2 is current thread in corefile" |
142 | }} |