Files
mercury/tests/debugger/queens.exp2
Zoltan Somogyi f51d94e054 Provide support for list syntax and quoted function symbols in the terms
Estimated hours taken: 6
Branches: main

Provide support for list syntax and quoted function symbols in the terms
that appear in breakpoint conditions.

runtime/mercury_trace_term.[ch]:
	Provide the new capability when creating terms from strings.

	Since with nonempty lists, the function symbol of the created term
	("[|]") does not appear in the original string, do not try to reuse
	the memory of the string for the memory of the function symbols;
	instead, make a copy of each function symbol as needed. This also
	makes the code simpler by avoiding the need to mangle the original
	string to null-terminate these function symbols.

	Add a mechanism for reporting the location and nature of syntax errors.

	Don't assume that the initial string has no spaces.

trace/mercury_trace_spy.[ch]:
	Don't record the strings from which the terms in breakpoint conditions
	came from, since function symbols' memory no longer comes from there,
	and thus we don't have to free them when the breakpoint is deleted.

trace/mercury_trace_cmd_breakpoint.c:
	Use the new mechanism for reporting the details of syntax errors in
	terms.

	Include spaces in the string from which terms are constructed
	at the points at which the user included spaces, since the absence
	of such spaces in any reports of syntax errors would be surprising.

	Delete the temporary memory for strings containing terms as soon
	as they have been used to construct their terms.

trace/mercury_trace_internal.c:
	Document a problem.

trace/Mmakefile:
	Rebuild this directory automatically if a few more headers in the
	runtime change.

doc/user_guide.texi:
	Document the new capability.

tests/debugger/queens.{inp,exp,exp2}:
	Test the new capability.
2007-06-15 08:26:47 +00:00

433 lines
17 KiB
Plaintext

E1: C1 CALL pred queens.main/2-0 (cc_multi) queens.m:14
mdb> echo on
Command echo enabled.
mdb> register --quiet
mdb> retry 1
not that many ancestors
mdb> print *
mdb: there are no live variables.
mdb> b data
0: + stop interface pred queens.data/1-0 (det)
mdb> continue
E2: C2 CALL pred queens.data/1-0 (det) queens.m:24 (queens.m:15)
mdb> delete 0
0: E stop interface pred queens.data/1-0 (det)
mdb> print *
mdb: there are no live variables.
mdb>
E3: C2 EXIT pred queens.data/1-0 (det) queens.m:24 (queens.m:15)
mdb> print *
HeadVar__1 [1, 2, 3, 4, 5]
mdb>
E4: C3 CALL pred queens.queen/2-0 (nondet) queens.m:29 (queens.m:15)
mdb> print *
Data (arg 1) [1, 2, 3, 4, 5]
mdb>
E5: C4 CALL pred queens.qperm/2-0 (nondet) queens.m:36 (queens.m:30)
mdb> print *
HeadVar__1 [1, 2, 3, 4, 5]
mdb> print_optionals on
mdb> print *
HeadVar__1 [1, 2, 3, 4, 5]
TypeInfo_for_T int
mdb> print_optionals off
mdb> print *
HeadVar__1 [1, 2, 3, 4, 5]
mdb>
E6: C4 SWTC pred queens.qperm/2-0 (nondet) s2-2; queens.m:37
mdb> print *
HeadVar__1 [1, 2, 3, 4, 5]
mdb>
E7: C5 CALL pred queens.qdelete/3-0 (nondet) queens.m:45 (queens.m:38)
mdb> print *
HeadVar__2 [1, 2, 3, 4, 5]
mdb>
E8: C5 DISJ pred queens.qdelete/3-0 (nondet) c2;d1; queens.m:45
mdb> print *
HeadVar__2 [1, 2, 3, 4, 5]
mdb> level 1
Ancestor level set to 1:
1 pred queens.qperm/2-0 (nondet) queens.m:38
mdb> level -d 1
Ancestor level set to 1:
1 E5 C4 3 pred queens.qperm/2-0 (nondet) queens.m:38
mdb> context nextline
Contexts will be printed on the next line.
mdb> level 1
Ancestor level set to 1:
1 pred queens.qperm/2-0 (nondet)
queens.m:38
mdb> level -d 1
Ancestor level set to 1:
1 E5 C4 3 pred queens.qperm/2-0 (nondet)
queens.m:38
mdb> context prevline
Contexts will be printed on the previous line.
mdb> level 1
Ancestor level set to 1:
1 queens.m:38
pred queens.qperm/2-0 (nondet)
mdb> level -d 1
Ancestor level set to 1:
1 E5 C4 3 queens.m:38
pred queens.qperm/2-0 (nondet)
mdb> print *
HeadVar__1 [1, 2, 3, 4, 5]
L [1, 2, 3, 4, 5]
mdb> up 1
Ancestor level set to 2:
2 queens.m:30
pred queens.queen/2-0 (nondet)
mdb> vars
1 Data (arg 1)
mdb> print *
Data (arg 1) [1, 2, 3, 4, 5]
mdb>
E9: C5 EXIT queens.m:45 (from queens.m:38)
pred queens.qdelete/3-0 (nondet)
mdb> print HeadVar__1
HeadVar__1 1
mdb> print HeadVar__2
HeadVar__2 [1, 2, 3, 4, 5]
mdb> print HeadVar__3
HeadVar__3 [2, 3, 4, 5]
mdb> hold HeadVar__2^1 x
mdb> hold HeadVar__2^2 y
mdb> hold HeadVar__2 y
mdb: there is already a held variable $y
mdb> hold HeadVar__2 z
mdb> held_vars
$x
$y
$z
mdb> print $x
x 1
mdb> print $y
y [2, 3, 4, 5]
mdb> print $z
z [1, 2, 3, 4, 5]
mdb> diff $x $y
The two values are of different types.
mdb> diff $y $z
There are 5 diffs, showing diffs 1-5:
1: 1: 2/0 vs 1/0
2: 2/1: 3/0 vs 2/0
3: 2/2/1: 4/0 vs 3/0
4: 2/2/2/1: 5/0 vs 4/0
5: 2/2/2/2: []/0 vs [|]/2
mdb> diff -m 2 $y $z
There are 5 diffs, showing diffs 1-2:
1: 1: 2/0 vs 1/0
2: 2/1: 3/0 vs 2/0
mdb> diff -s 2 -m 2 $y $z
There are 5 diffs, showing diffs 3-4:
3: 2/2/1: 4/0 vs 3/0
4: 2/2/2/1: 5/0 vs 4/0
mdb> diff -s 4 -m 2 $y $z
There are 5 diffs, showing diff 5:
5: 2/2/2/2: []/0 vs [|]/2
mdb> diff $y $z^2
There are no diffs.
mdb>
E10: C6 CALL queens.m:36 (from queens.m:40)
pred queens.qperm/2-0 (nondet)
mdb> print *
HeadVar__1 [2, 3, 4, 5]
mdb>
E11: C6 SWTC queens.m:37
pred queens.qperm/2-0 (nondet) s2-2;
mdb> print *
HeadVar__1 [2, 3, 4, 5]
mdb>
E12: C7 CALL queens.m:45 (from queens.m:38)
pred queens.qdelete/3-0 (nondet)
mdb> print *
HeadVar__2 [2, 3, 4, 5]
mdb>
E13: C7 DISJ queens.m:45
pred queens.qdelete/3-0 (nondet) c2;d1;
mdb> print *
HeadVar__2 [2, 3, 4, 5]
mdb>
E14: C7 EXIT queens.m:45 (from queens.m:38)
pred queens.qdelete/3-0 (nondet)
mdb> print *
HeadVar__1 2
HeadVar__2 [2, 3, 4, 5]
HeadVar__3 [3, 4, 5]
mdb>
E15: C8 CALL queens.m:36 (from queens.m:40)
pred queens.qperm/2-0 (nondet)
mdb> goto -a 21
E16: C8 SWTC queens.m:37
pred queens.qperm/2-0 (nondet) s2-2;
E17: C9 CALL queens.m:45 (from queens.m:38)
pred queens.qdelete/3-0 (nondet)
E18: C9 DISJ queens.m:45
pred queens.qdelete/3-0 (nondet) c2;d1;
E19: C9 EXIT queens.m:45 (from queens.m:38)
pred queens.qdelete/3-0 (nondet)
E20: C10 CALL queens.m:36 (from queens.m:40)
pred queens.qperm/2-0 (nondet)
mdb> stack
0 4* pred queens.qperm/2-0 (nondet) (queens.m:36 and others)
4 pred queens.queen/2-0 (nondet) (queens.m:30)
5 pred queens.main/2-0 (cc_multi) (queens.m:15)
mdb> stack -d
0 E20 C10 6 pred queens.qperm/2-0 (nondet) (queens.m:36) (empty)
1 E15 C8 5 pred queens.qperm/2-0 (nondet) (queens.m:40) s2-2;c3;
2 E10 C6 4 pred queens.qperm/2-0 (nondet) (queens.m:40) s2-2;c3;
3 E5 C4 3 pred queens.qperm/2-0 (nondet) (queens.m:40) s2-2;c3;
4 E4 C3 2 pred queens.queen/2-0 (nondet) (queens.m:30) c2;
5 E1 C1 1 pred queens.main/2-0 (cc_multi) (queens.m:15) ?;c2;q!;
mdb> stack 3
0 4* pred queens.qperm/2-0 (nondet) (queens.m:36 and others)
4 pred queens.queen/2-0 (nondet) (queens.m:30)
5 pred queens.main/2-0 (cc_multi) (queens.m:15)
mdb> stack -d 3
0 E20 C10 6 pred queens.qperm/2-0 (nondet) (queens.m:36) (empty)
1 E15 C8 5 pred queens.qperm/2-0 (nondet) (queens.m:40) s2-2;c3;
2 E10 C6 4 pred queens.qperm/2-0 (nondet) (queens.m:40) s2-2;c3;
<more stack frames snipped>
mdb> print *
HeadVar__1 [4, 5]
mdb>
E21: C10 SWTC queens.m:37
pred queens.qperm/2-0 (nondet) s2-2;
mdb> retry
E20: C10 CALL queens.m:36 (from queens.m:40)
pred queens.qperm/2-0 (nondet)
mdb> print *
HeadVar__1 [4, 5]
mdb> finish -a
E21: C10 SWTC queens.m:37
pred queens.qperm/2-0 (nondet) s2-2;
E22: C11 CALL queens.m:45 (from queens.m:38)
pred queens.qdelete/3-0 (nondet)
E23: C11 DISJ queens.m:45
pred queens.qdelete/3-0 (nondet) c2;d1;
E24: C11 EXIT queens.m:45 (from queens.m:38)
pred queens.qdelete/3-0 (nondet)
E25: C12 CALL queens.m:36 (from queens.m:40)
pred queens.qperm/2-0 (nondet)
E26: C12 SWTC queens.m:37
pred queens.qperm/2-0 (nondet) s2-2;
E27: C13 CALL queens.m:45 (from queens.m:38)
pred queens.qdelete/3-0 (nondet)
E28: C13 DISJ queens.m:45
pred queens.qdelete/3-0 (nondet) c2;d1;
E29: C13 EXIT queens.m:45 (from queens.m:38)
pred queens.qdelete/3-0 (nondet)
E30: C14 CALL queens.m:36 (from queens.m:40)
pred queens.qperm/2-0 (nondet)
E31: C14 SWTC queens.m:36
pred queens.qperm/2-0 (nondet) s1-2;
E32: C14 EXIT queens.m:36 (from queens.m:40)
pred queens.qperm/2-0 (nondet)
E33: C12 EXIT queens.m:36 (from queens.m:40)
pred queens.qperm/2-0 (nondet)
E34: C10 EXIT queens.m:36 (from queens.m:40)
pred queens.qperm/2-0 (nondet)
mdb> register --quiet
mdb> break print_list
0: + stop interface pred queens.print_list/3-0 (det)
mdb> break qdelete
1: + stop interface pred queens.qdelete/3-0 (nondet)
mdb> break_print HeadVar__2^2
1: + stop interface pred queens.qdelete/3-0 (nondet)
HeadVar__2^2 (flat)
mdb> continue -a
E35: C8 EXIT queens.m:36 (from queens.m:40)
pred queens.qperm/2-0 (nondet)
E36: C6 EXIT queens.m:36 (from queens.m:40)
pred queens.qperm/2-0 (nondet)
E37: C4 EXIT queens.m:36 (from queens.m:30)
pred queens.qperm/2-0 (nondet)
E38: C15 CALL queens.m:52 (from queens.m:31)
pred queens.safe/1-0 (semidet)
E39: C15 SWTC queens.m:53
pred queens.safe/1-0 (semidet) s2-2;
E40: C16 CALL queens.m:60 (from queens.m:54)
pred queens.nodiag/3-0 (semidet)
E41: C16 SWTC queens.m:61
pred queens.nodiag/3-0 (semidet) s2-2;
E42: C17 CALL int.m:NNNN (from queens.m:62)
func int.-/2-0 (det)
E43: C17 EXIT int.m:NNNN (from queens.m:62)
func int.-/2-0 (det)
E44: C18 CALL int.m:NNNN (from queens.m:63)
func int.-/2-0 (det)
E45: C18 EXIT int.m:NNNN (from queens.m:63)
func int.-/2-0 (det)
E46: C16 COND queens.m:64
pred queens.nodiag/3-0 (semidet) s2-2;c4;?;
E47: C16 THEN queens.m:65
pred queens.nodiag/3-0 (semidet) s2-2;c4;t;
E48: C16 FAIL queens.m:60 (from queens.m:54)
pred queens.nodiag/3-0 (semidet)
E49: C15 FAIL queens.m:52 (from queens.m:31)
pred queens.safe/1-0 (semidet)
E50: C4 REDO queens.m:36 (from queens.m:30)
pred queens.qperm/2-0 (nondet)
E51: C6 REDO queens.m:36 (from queens.m:40)
pred queens.qperm/2-0 (nondet)
E52: C8 REDO queens.m:36 (from queens.m:40)
pred queens.qperm/2-0 (nondet)
E53: C10 REDO queens.m:36 (from queens.m:40)
pred queens.qperm/2-0 (nondet)
E54: C12 REDO queens.m:36 (from queens.m:40)
pred queens.qperm/2-0 (nondet)
E55: C14 REDO queens.m:36 (from queens.m:40)
pred queens.qperm/2-0 (nondet)
E56: C14 FAIL queens.m:36 (from queens.m:40)
pred queens.qperm/2-0 (nondet)
E57: C13 REDO queens.m:45 (from queens.m:38)
pred queens.qdelete/3-0 (nondet)
HeadVar__2^2 []
mdb> break info
0: + stop interface pred queens.print_list/3-0 (det)
1: + stop interface pred queens.qdelete/3-0 (nondet)
HeadVar__2^2 (flat)
mdb> enable *
0: + stop interface pred queens.print_list/3-0 (det)
1: + stop interface pred queens.qdelete/3-0 (nondet)
mdb> step -aS 5
E58: C13 DISJ queens.m:46
pred queens.qdelete/3-0 (nondet) c2;d2;
E59: C19 CALL queens.m:45 (from queens.m:47)
pred queens.qdelete/3-0 (nondet)
mdb: the path 2 does not exist in variable HeadVar__2.
E60: C19 FAIL queens.m:45 (from queens.m:47)
pred queens.qdelete/3-0 (nondet)
mdb: the path 2 does not exist in variable HeadVar__2.
E61: C13 FAIL queens.m:45 (from queens.m:38)
pred queens.qdelete/3-0 (nondet)
HeadVar__2^2 []
E62: C12 FAIL queens.m:36 (from queens.m:40)
pred queens.qperm/2-0 (nondet)
mdb> disable 1
1: - stop interface pred queens.qdelete/3-0 (nondet)
mdb> retry 4
E5: C4 CALL queens.m:36 (from queens.m:30)
pred queens.qperm/2-0 (nondet)
mdb> break 40
2: + stop linenumber queens.m:40
mdb> continue -n
E10: C6 CALL queens.m:36 (from queens.m:40)
pred queens.qperm/2-0 (nondet)
mdb> continue -n
E15: C8 CALL queens.m:36 (from queens.m:40)
pred queens.qperm/2-0 (nondet)
mdb> continue -n
E20: C10 CALL queens.m:36 (from queens.m:40)
pred queens.qperm/2-0 (nondet)
mdb> continue -n
E25: C12 CALL queens.m:36 (from queens.m:40)
pred queens.qperm/2-0 (nondet)
mdb> continue -n
E30: C14 CALL queens.m:36 (from queens.m:40)
pred queens.qperm/2-0 (nondet)
mdb> continue -n
E32: C14 EXIT queens.m:36 (from queens.m:40)
pred queens.qperm/2-0 (nondet)
mdb> return
E33: C12 EXIT queens.m:36 (from queens.m:40)
pred queens.qperm/2-0 (nondet)
E34: C10 EXIT queens.m:36 (from queens.m:40)
pred queens.qperm/2-0 (nondet)
E35: C8 EXIT queens.m:36 (from queens.m:40)
pred queens.qperm/2-0 (nondet)
E36: C6 EXIT queens.m:36 (from queens.m:40)
pred queens.qperm/2-0 (nondet)
E38: C15 CALL queens.m:52 (from queens.m:31)
pred queens.safe/1-0 (semidet)
mdb> continue -n
E51: C6 REDO queens.m:36 (from queens.m:40)
pred queens.qperm/2-0 (nondet)
mdb> continue -n
E52: C8 REDO queens.m:36 (from queens.m:40)
pred queens.qperm/2-0 (nondet)
mdb> forward
E53: C10 REDO queens.m:36 (from queens.m:40)
pred queens.qperm/2-0 (nondet)
E54: C12 REDO queens.m:36 (from queens.m:40)
pred queens.qperm/2-0 (nondet)
E55: C14 REDO queens.m:36 (from queens.m:40)
pred queens.qperm/2-0 (nondet)
E56: C14 FAIL queens.m:36 (from queens.m:40)
pred queens.qperm/2-0 (nondet)
E58: C13 DISJ queens.m:46
pred queens.qdelete/3-0 (nondet) c2;d2;
mdb> continue -n
E62: C12 FAIL queens.m:36 (from queens.m:40)
pred queens.qperm/2-0 (nondet)
mdb> continue -n
E63: C20 CALL queens.m:36 (from queens.m:40)
pred queens.qperm/2-0 (nondet)
mdb> delete *
0: E stop interface pred queens.print_list/3-0 (det)
1: D stop interface pred queens.qdelete/3-0 (nondet)
2: E stop linenumber queens.m:40
mdb> break main SWTC
There is no SWTC port in pred queens.main/2-0 (cc_multi).
mdb> break main EXIT
0: + stop specific pred queens.main/2-0 (cc_multi) EXIT
mdb> continue -n
[1, 3, 5, 2, 4]
E64: C1 EXIT queens.m:14
pred queens.main/2-0 (cc_multi)
mdb> retry
Retry across I/O operations is not always safe.
Are you sure you want to do it? yes
E1: C1 CALL queens.m:14
pred queens.main/2-0 (cc_multi)
mdb> delete 0
0: E stop specific pred queens.main/2-0 (cc_multi) EXIT
mdb> break safe
0: + stop interface pred queens.safe/1-0 (semidet)
mdb> condition HeadVar__1 = [
syntax error in term: [
^ unmatched character
mdb> condition HeadVar__1 = [a, c
syntax error in term: [a, c
^ unmatched character
mdb> condition HeadVar__1 = [f(a, b]
syntax error in term: [f(a, b]
^ here
mdb> condition HeadVar__1 = [1,2, 5, 4, 3 ]
0: + stop interface pred queens.safe/1-0 (semidet)
HeadVar__1 = [1, 2, 5, 4, 3]
mdb> continue
E65: C21 CALL queens.m:52 (from queens.m:31)
pred queens.safe/1-0 (semidet)
mdb> print
safe([1, 2, 5, 4, 3])
mdb> retry 2
E1: C1 CALL queens.m:14
pred queens.main/2-0 (cc_multi)
mdb> yes
Unknown command `yes'. Give the command `help' for help.
mdb> disable 0
0: - stop interface pred queens.safe/1-0 (semidet)
HeadVar__1 = [1, 2, 5, 4, 3]
mdb> break nodiag SWTC
Ambiguous port specification. The matches are:
0: SWTC s1-2;
1: SWTC s2-2;
Which do you want to put a breakpoint on (0-1 or *)? 1
1: + stop specific pred queens.nodiag/3-0 (semidet) SWTC s2-2;
mdb> continue
E41: C16 SWTC queens.m:61
pred queens.nodiag/3-0 (semidet) s2-2;
mdb> print *
B (arg 1) 1
D (arg 2) 1
HeadVar__3 [2, 3, 4, 5]
mdb> delete *
0: D stop interface pred queens.safe/1-0 (semidet)
HeadVar__1 = [1, 2, 5, 4, 3]
1: E stop specific pred queens.nodiag/3-0 (semidet) SWTC s2-2;
mdb> continue -n -S
[1, 3, 5, 2, 4]