1# Copyright 2002, 2003, 2004, 2007, 2008, 2009, 2010, 2011
2# Free Software Foundation, Inc.
3
4# This program is free software; you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by
6# the Free Software Foundation; either version 3 of the License, or
7# (at your option) any later version.
8#
9# This program is distributed in the hope that it will be useful,
10# but WITHOUT ANY WARRANTY; without even the implied warranty of
11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12# GNU General Public License for more details.
13#
14# You should have received a copy of the GNU General Public License
15# along with this program.  If not, see <http://www.gnu.org/licenses/>.
16
17# This file was written by Michael Snyder (msnyder@redhat.com)
18# This is a test for the gdb command "generate-core-file".
19
20if $tracelevel then {
21	strace $tracelevel
22}
23
24
25set testfile "gcore"
26set srcfile  ${testfile}.c
27set binfile  ${objdir}/${subdir}/${testfile}
28
29if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
30     untested gcore.exp
31     return -1
32}
33
34# Start with a fresh gdb.
35
36gdb_exit
37gdb_start
38gdb_reinitialize_dir $srcdir/$subdir
39gdb_load ${binfile}
40
41# Does this gdb support gcore?
42gdb_test_multiple "help gcore" "help gcore" {
43    -re "Undefined command: .gcore.*$gdb_prompt $" {
44	# gcore command not supported -- nothing to test here.
45	unsupported "gdb does not support gcore on this target"
46	return -1;
47    }
48    -re "Save a core file .*$gdb_prompt $" {
49	pass "help gcore"
50    }
51}
52
53if { ! [ runto_main ] } then {
54    untested gcore.exp
55    return -1
56}
57
58proc capture_command_output { command prefix } {
59    global gdb_prompt
60    global expect_out
61
62    set output_string ""
63    gdb_test_multiple "$command" "capture_command_output for $command" {
64	-re "${command}\[\r\n\]+${prefix}(.*)\[\r\n\]+$gdb_prompt $" {
65	    set output_string $expect_out(1,string)
66	}
67    }
68    return $output_string
69}
70
71gdb_test "break terminal_func" "Breakpoint .* at .*${srcfile}, line .*" \
72	"set breakpoint at terminal_func"
73
74gdb_test "continue" "Breakpoint .* terminal_func.*" \
75	"continue to terminal_func"
76
77set print_prefix ".\[0123456789\]* = "
78
79set pre_corefile_backtrace [capture_command_output "backtrace" ""]
80set pre_corefile_regs [capture_command_output "info registers" ""]
81set pre_corefile_allregs [capture_command_output "info all-reg" ""]
82set pre_corefile_static_array \
83	[capture_command_output "print static_array" "$print_prefix"]
84set pre_corefile_uninit_array \
85	[capture_command_output "print un_initialized_array" "$print_prefix"]
86set pre_corefile_heap_string \
87	[capture_command_output "print heap_string" "$print_prefix"]
88set pre_corefile_local_array \
89	[capture_command_output "print array_func::local_array" "$print_prefix"]
90set pre_corefile_extern_array \
91	[capture_command_output "print extern_array" "$print_prefix"]
92
93set escapedfilename [string_to_regexp ${objdir}/${subdir}/gcore.test]
94
95set core_supported 0
96gdb_test_multiple "gcore ${objdir}/${subdir}/gcore.test" \
97	"save a corefile" \
98{
99  -re "Saved corefile ${escapedfilename}\[\r\n\]+$gdb_prompt $" {
100    pass "save a corefile"
101    global core_supported
102    set core_supported 1
103  }
104  -re "Can't create a corefile\[\r\n\]+$gdb_prompt $" {
105    unsupported "save a corefile"
106    global core_supported
107    set core_supported 0
108  }
109}
110
111if {!$core_supported} {
112  return -1
113}
114
115# Now restart gdb and load the corefile.
116gdb_exit
117gdb_start
118gdb_reinitialize_dir $srcdir/$subdir
119gdb_load ${binfile}
120
121gdb_test_multiple "core ${objdir}/${subdir}/gcore.test" \
122    "re-load generated corefile" {
123    -re ".* is not a core dump:.*$gdb_prompt $" {
124	fail "re-load generated corefile (bad file format)"
125	# No use proceeding from here.
126	return;
127    }
128    -re ".*: No such file or directory.*$gdb_prompt $" {
129	fail "re-load generated corefile (file not found)"
130	# No use proceeding from here.
131	return;
132    }
133    -re ".*Couldn't find .* registers in core file.*$gdb_prompt $" {
134	fail "re-load generated corefile (incomplete note section)"
135    }
136    -re "Core was generated by .*$gdb_prompt $" {
137	pass "re-load generated corefile"
138    }
139}
140
141gdb_test_sequence "where" "where in corefile" {
142    "\[\r\n\]+#0 .* terminal_func \\(\\) at "
143    "\[\r\n\]+#1 .* array_func \\(\\) at "
144    "\[\r\n\]+#2 .* factorial_func \\(value=1\\) at "
145    "\[\r\n\]+#3 .* factorial_func \\(value=2\\) at "
146    "\[\r\n\]+#4 .* factorial_func \\(value=3\\) at "
147    "\[\r\n\]+#5 .* factorial_func \\(value=4\\) at "
148    "\[\r\n\]+#6 .* factorial_func \\(value=5\\) at "
149    "\[\r\n\]+#7 .* factorial_func \\(value=6\\) at "
150    "\[\r\n\]+#8 .* main \\(.*\\) at "
151}
152
153set post_corefile_regs [capture_command_output "info registers" ""]
154if ![string compare $pre_corefile_regs $post_corefile_regs] then {
155    pass "corefile restored general registers"
156} else {
157    fail "corefile restored general registers"
158}
159
160set post_corefile_allregs [capture_command_output "info all-reg" ""]
161if ![string compare $pre_corefile_allregs $post_corefile_allregs] then {
162    pass "corefile restored all registers"
163} else {
164    fail "corefile restored all registers"
165}
166
167set post_corefile_extern_array \
168	[capture_command_output "print extern_array" "$print_prefix"]
169if ![string compare $pre_corefile_extern_array $post_corefile_extern_array]  {
170    pass "corefile restored extern array"
171} else {
172    fail "corefile restored extern array"
173}
174
175set post_corefile_static_array \
176	[capture_command_output "print static_array" "$print_prefix"]
177if ![string compare $pre_corefile_static_array $post_corefile_static_array]  {
178    pass "corefile restored static array"
179} else {
180    fail "corefile restored static array"
181}
182
183set post_corefile_uninit_array \
184	[capture_command_output "print un_initialized_array" "$print_prefix"]
185if ![string compare $pre_corefile_uninit_array $post_corefile_uninit_array]  {
186    pass "corefile restored un-initialized array"
187} else {
188    fail "corefile restored un-initialized array"
189}
190
191set post_corefile_heap_string \
192	[capture_command_output "print heap_string" "$print_prefix"]
193if ![string compare $pre_corefile_heap_string $post_corefile_heap_string]  {
194    pass "corefile restored heap array"
195} else {
196    fail "corefile restored heap array"
197}
198
199set post_corefile_local_array \
200	[capture_command_output "print array_func::local_array" "$print_prefix"]
201if ![string compare $pre_corefile_local_array $post_corefile_local_array]  {
202    pass "corefile restored stack array"
203} else {
204    fail "corefile restored stack array"
205}
206
207set post_corefile_backtrace [capture_command_output "backtrace" ""]
208if ![string compare $pre_corefile_backtrace $post_corefile_backtrace]  {
209    pass "corefile restored backtrace"
210} else {
211    fail "corefile restored backtrace"
212}
213