aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.trace/tstatus.exp
blob: b929e6c8f755c706b2e7ee34cd91a6d45aa9761b (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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
# Copyright 2011-2013 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/>.

load_lib "trace-support.exp"

standard_testfile actions.c
set executable $testfile
set expfile tstatus.exp

if [prepare_for_testing $expfile $executable $srcfile \
	[list debug]] {
    untested "failed to prepare for trace tests"
    return -1
}

if ![runto_main] {
    fail "Can't run to main to check for trace support"
    return -1
}

if ![gdb_target_supports_trace] {
    unsupported "target does not support trace"
    return -1
}

set libipa [get_in_proc_agent]
gdb_load_shlibs $libipa

# Can't use prepare_for_testing, because that splits compiling into
# building objects and then linking, and we'd fail with "linker input
# file unused because linking not done" when building the object.

if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \
	  executable [list debug shlib=$libipa] ] != "" } {
    untested "failed to compile ftrace tests"
    return -1
}
clean_restart ${executable}

if ![runto_main] {
    fail "Can't run to main for ftrace tests"
    return 0
}

proc run_trace_experiment {} {
    global gdb_prompt
    global decimal

#    gdb_test_no_output "set debug remote 1" ""

    gdb_test "continue" \
	".*Breakpoint \[0-9\]+, begin .*" \
	"advance to trace begin"

    gdb_test_no_output "tstart my tracing note" "start trace experiment"

    gdb_test "continue" \
	".*Breakpoint \[0-9\]+, end .*" \
	"advance through tracing"

    # Now play with tstatus a bit.
    # Since note support is optional, we need to match both with and without
    # cases.

    gdb_test_multiple "tstatus" "check on trace status" {
	-re "Trace is running.*Trace will stop if GDB disconnects\.\[\r\n\]+Trace notes: my tracing note\.\[\r\n\]+Not looking at any trace frame\..*\r\n$gdb_prompt $" {
	    pass "tstatus reports trace note"
	}
	-re "Trace is running.*Trace will stop if GDB disconnects\.\[\r\n\]+Not looking at any trace frame.*\r\n$gdb_prompt $" {
	    pass "tstatus does not report any trace note"
	}
    }

    gdb_test "set trace-notes different note" "" "change tracing note"

    gdb_test_multiple "tstatus" "check on trace status with diff note" {
	-re "Trace is running.*Trace will stop if GDB disconnects\.\[\r\n\]+Trace notes: different note\.\[\r\n\]+Not looking at any trace frame\..*\r\n$gdb_prompt $" {
	    pass "tstatus reports different trace note"
	}
	-re "Trace is running.*Trace will stop if GDB disconnects\.\[\r\n\]+Not looking at any trace frame.*\r\n$gdb_prompt $" {
	    pass "tstatus does not report any different trace note"
	}
    }

    gdb_test "set trace-user me me me" "" "change tracing user"

    gdb_test_multiple "tstatus" "check on trace status with diff note" {
	-re "Trace is running.*Trace will stop if GDB disconnects\.\[\r\n\]+Trace user is me me me\.\[\r\n\]+Trace notes: different note\.\[\r\n\]+Not looking at any trace frame\..*\r\n$gdb_prompt $" {
	    pass "tstatus reports trace user"
	}
	-re "Trace is running.*Trace will stop if GDB disconnects\.\[\r\n\]+Not looking at any trace frame.*\r\n$gdb_prompt $" {
	    pass "tstatus does not report trace user"
	}
    }

    gdb_test_no_output "tstop because I can" "trace stopped with note"

    gdb_test_multiple "tstatus" "check on trace status after stop" {
	-re "Trace stopped by a tstop command \\(because I can\\)\..*Trace will stop if GDB disconnects\.\[\r\n\]+Trace user is me me me\.\[\r\n\]+Trace notes: different note\.\[\r\n\]+Not looking at any trace frame\..*\r\n$gdb_prompt $" {
	    pass "tstatus reports trace stop reason"
	}
	-re "Trace stopped by a tstop command\..*\r\n$gdb_prompt $" {
	    pass "tstatus does not report trace stop reason"
	}
    }

    # Hit count and traceframe usage of tracepoint is optional, so
    # pass it either way.

    gdb_test_multiple "info trace" "show tracepoint state" {
	-re "actions\.c:\[0-9\]+\[\r\n\]+\[\t ]+tracepoint already hit 1 time\[\r\n\]+\[\t ]+trace buffer usage ${decimal} bytes\.\[\r\n\]+\[\t ]+collect parm.*\r\n$gdb_prompt $" {
	    pass "info trace reports tracepoint hit count and traceframe usage"
	}
	-re "actions\.c:\[0-9\]+\[\r\n\]+\[\t ]+collect parm.*\r\n$gdb_prompt $" {
	    pass "info trace does not report tracepoint hit count and traceframe usage"
	}
    }
}

proc test_tracepoints {} {
    global gdb_prompt

    gdb_test "break begin" ".*" ""

    gdb_test "break end" ".*" ""

    gdb_test "trace gdb_c_test" "Tracepoint .*" \
	"tracepoint at gdb_c_test"

    gdb_trace_setactions "collect at set_point: define actions" \
	"" \
	"collect parm" "^$"
    set fastgood 0

    gdb_test_multiple "ftrace gdb_recursion_test" "set fast tracepoint" {
	-re "May not have a fast tracepoint at .*\r\n$gdb_prompt $" {
	    pass "4-byte fast tracepoint could not be set"
	}
	-re "Fast tracepoint .*\r\n$gdb_prompt $" {
	    pass "4-byte fast tracepoint is set"
	    set fastgood 1
	}
    }

    if { $fastgood } {

	gdb_trace_setactions "collect at four_byter: define actions" \
	    "" \
	    "collect globvar, anarg" "^$"
    }

    run_trace_experiment

}

gdb_reinitialize_dir $srcdir/$subdir

if { [gdb_test "info sharedlibrary" ".*${libipa}.*" "IPA loaded"] != 0 } {
    untested "Could not find IPA lib loaded"
    return 1
}

test_tracepoints