summaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.threads/attach-stopped.exp
blob: 65a5f2b9da3550bca738eafdf025c78fdc4fa080 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
# Copyright 2008
# 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/>.

# This test was created by modifying attach.exp.
# This file was created by Jeff Johnston <jjohnstn@redhat.com>.
# This file was updated by Jan Kratochvil <jan.kratochvil@redhat.com>.

# This test only works on Linux
if { ![isnative] || [is_remote host] || ![istarget *-linux*] } {
    continue
}

set testfile "attach-stopped"
set srcfile  ${testfile}.c
set binfile  ${objdir}/${subdir}/${testfile}
set escapedbinfile  [string_to_regexp ${objdir}/${subdir}/${testfile}]

#execute_anywhere "rm -f ${binfile}"
remote_exec build "rm -f ${binfile}"
# For debugging this test
#
#log_user 1

proc corefunc { threadtype } {
    global srcfile
    global binfile
    global escapedbinfile
    global srcdir
    global subdir
    global gdb_prompt

    if [get_compiler_info ${binfile}] {
	return -1
    }

    # Start the program running and then wait for a bit, to be sure
    # that it can be attached to.

    set testpid [eval exec $binfile &]

    # Avoid some race:
    sleep 2

    # Stop the program 
    remote_exec build "kill -s STOP ${testpid}"

    # Start with clean gdb
    gdb_exit
    gdb_start
    gdb_reinitialize_dir $srcdir/$subdir
    gdb_load ${binfile}

    # Verify that we can attach to the stopped process.
       
    set test "$threadtype: attach2 to stopped, after setting file"
    gdb_test_multiple "attach $testpid" "$test" {
	-re "Attaching to program.*`?$escapedbinfile'?, process $testpid.*$gdb_prompt $" {
	    pass "$test"
	}
    }

    # ".*sleep.*clone.*" would fail on s390x as bt stops at START_THREAD there.
    if {[string equal $threadtype threaded]} {
	gdb_test "thread apply all bt" ".*sleep.*start_thread.*" "$threadtype: attach2 to stopped bt"
    } else {
	gdb_test "bt" ".*sleep.*main.*" "$threadtype: attach2 to stopped bt"
    }
    # This breakpoint is there for old/non-x86 kernels not restarting syscalls.
    gdb_breakpoint [gdb_get_line_number "Second sleep"]
    set test "$threadtype: attach2 continue"
    send_gdb "continue\n"
    gdb_expect {
      -re "Continuing"
	{ pass "continue ($test)" }
      timeout
	{ fail "continue ($test) (timeout)" }
    }

    # For this to work we must be sure to consume the "Continuing."
    # message first, or GDB's signal handler may not be in place.
    after 1000 {send_gdb "\003"}
    set test "$threadtype: attach2 stop interrupt"
    gdb_expect 10 {
      -re "Program received signal SIGINT.*$gdb_prompt $"
	{
	  pass $test
	}
      -re "Breakpoint \[0-9\].*$srcfile.*$gdb_prompt $"
	{
	  pass $test
	}
      timeout
	{
	  fail $test
	}
    }

    gdb_exit

    # Avoid some race:
    sleep 2

    # At this point, the process should be sleeping

    if [catch {open /proc/${testpid}/status r} fileid2] {
	set line2 "NOTFOUND"
    } else {
	gets $fileid2 line1;
	gets $fileid2 line2;
	close $fileid2;
    }

    set test "$threadtype: attach2, exit leaves process sleeping"
    if {[string match "*(sleeping)*" $line2]} {
      pass $test
    } else {
      fail $test
    }

    # Make sure we don't leave a process around to confuse
    # the next test run (and prevent the compile by keeping
    # the text file busy), in case the "set should_exit" didn't
    # work.
       
    remote_exec build "kill -9 ${testpid}"
}

# build the test case first without threads
#
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
    untested "attach-stopped.exp (unthreaded)"
    return -1
}

corefunc nonthreaded

# build the test case first without threads
#
if  { [gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-DUSE_THREADS}] != "" } {
    untested "attach-stopped.exp (threaded)"
    return -1
}

corefunc threaded

return 0