Files
mercury/tests/debugger/mutrec.exp
Zoltan Somogyi c733b0359b Give the Mercury debugger the ability to detect cliques of mutually recursive
Estimated hours taken: 30
Branches: main

Give the Mercury debugger the ability to detect cliques of mutually recursive
predicates on the stack. Exploit this ability to enhance the debugger's
level, retry, finish and stack commands.

runtime/mercury_stack_trace.[ch]:
	Add a function, MR_find_clique_entry, that detects the clique
	that contains the top stack frame. This is used to implement the new
	arguments "clentry" and "clparent" (short for clique entry and parent)
	options of the level, retry and finish commands. "clique" is a synonym
	for "clentry" in these commands.

	Add a function, MR_dump_stack_layout_clique, that implements the
	new capabilities of the stack command. It can detect more than one
	clique, anywhere on the stack.

	To make this possible, modify the existing functions for printing
	the lines of stack traces. These used to keep some information around
	between calls in global variables. Now that information is stored in
	two structures that the caller passes them. One contains the parameters
	that govern what is to be printed, the other contains information about
	what has been buffered up to be printed, but has not been flushed yet.
	(The old code was confused in its handling of parameters. Some parts
	of it looked up the global variables storing them, while other parts
	were given the parameter values by their callers, values that could
	have been -but weren't- inconsistent.)

	Change the buffer flushing code to be idempotent, since in the new
	code, sometimes it is hard to avoid flushing the buffer more than once,
	and we want only the first to print its contents.

	Make some type names conform to our standard style.

runtime/mercury_stack_layout.h:
	Add a new flag in MR_ProcLayouts: a flag that indicates that the
	procedure has one or more higher order arguments. The new code in
	mercury_stack_trace.c handles procedures with this flag specially:
	it does not consider two non-consecutive occurrences of such procedures
	on the stack to be necessarily part of the same clique. This is to
	avoid having two calls to e.g. list.map in different part of the
	program pulling all the procedures between those parts on the stack
	into a single clique. (The deep profiler has a very similar tweak.)

	Add a pointer to the corresponding part of the compiler.

compiler/hlds_pred.m:
	Add a predicate to test whether a predicate has any higher order args.

compiler/stack_layout.m:
	When computing the flag in proc layouts, call the new procedure in
	hlds_pred.m to help figure it out.

trace/mercury_trace_cmd_backward.c:
	Implement the new options of the "retry" command.

trace/mercury_trace_cmd_forward.c:
	Implement the new options of the "finish" command.

trace/mercury_trace_cmd_browsing.c:
	Implement the "new options of the "level" command.

	Implement the new functionality of the "stack" command.

trace/mercury_trace_util.[ch]:
	Add some code common to the implementations of the level, retry and
	finish commands.

trace/mercury_trace_external.c:
	Conform to the changes to the runtime.

doc/user_guide.texi:
	Document the debugger's new capabilities.

NEWS:
	Announce the debugger's new capabilities.

tests/debugger/mutrec.{m,inp,exp}:
	A new test case to test the handling of the stack command
	in the presence of cliques.

tests/debugger/mutrec_higher_order.{m,inp,exp}:
	A new test case to test the handling of the stack command
	in the presence of cliques and higher order predicates.

tests/debugger/Mmakefile:
	Enable both new test cases.
2012-06-05 18:19:33 +00:00

257 lines
12 KiB
Plaintext

1: 1 1 CALL pred mutrec.main/2-0 (det) mutrec.m:25
mdb> echo on
Command echo enabled.
mdb> register --quiet
mdb> break p2
0: + stop interface pred mutrec.p2/3-0 (det)
mdb> continue
16: 6 6 CALL pred mutrec.p2/3-0 (det) mutrec.m:91 (mutrec.m:122)
mdb> stack
0 pred mutrec.p2/3-0 (det) (mutrec.m:91)
1 pred mutrec.p3/3-0 (det) (mutrec.m:122)
2 2* pred mutrec.p1/3-0 (det) (mutrec.m:82 and others)
4 pred mutrec.test/2-0 (det) (mutrec.m:42)
5 pred mutrec.main/2-0 (det) (mutrec.m:33)
mdb> delete *
0: E stop interface pred mutrec.p2/3-0 (det)
mdb> break p3
0: + stop interface pred mutrec.p3/3-0 (det)
mdb> continue
24: 8 8 CALL pred mutrec.p3/3-0 (det) mutrec.m:111 (mutrec.m:102)
mdb> stack
<mutually recursive set of stack frames start>
0 pred mutrec.p3/3-0 (det) (mutrec.m:111)
1 2* pred mutrec.p2/3-0 (det) (mutrec.m:102 and others)
3 pred mutrec.p3/3-0 (det) (mutrec.m:122)
<mutually recursive set of stack frames end>
4 2* pred mutrec.p1/3-0 (det) (mutrec.m:82 and others)
6 pred mutrec.test/2-0 (det) (mutrec.m:42)
7 pred mutrec.main/2-0 (det) (mutrec.m:33)
mdb> stack -a
0 pred mutrec.p3/3-0 (det) (mutrec.m:111)
1 2* pred mutrec.p2/3-0 (det) (mutrec.m:102 and others)
3 pred mutrec.p3/3-0 (det) (mutrec.m:122)
4 2* pred mutrec.p1/3-0 (det) (mutrec.m:82 and others)
6 pred mutrec.test/2-0 (det) (mutrec.m:42)
7 pred mutrec.main/2-0 (det) (mutrec.m:33)
mdb> delete *
0: E stop interface pred mutrec.p3/3-0 (det)
mdb> break q1
0: + stop interface pred mutrec.q1/3-0 (det)
mdb> continue
35: 11 11 CALL pred mutrec.q1/3-0 (det) mutrec.m:133 (mutrec.m:106)
mdb> stack
0 pred mutrec.q1/3-0 (det) (mutrec.m:133)
<mutually recursive set of stack frames start>
1 2* pred mutrec.p2/3-0 (det) (mutrec.m:106 and others)
3 pred mutrec.p3/3-0 (det) (mutrec.m:122)
4 2* pred mutrec.p2/3-0 (det) (mutrec.m:102 and others)
6 pred mutrec.p3/3-0 (det) (mutrec.m:122)
<mutually recursive set of stack frames end>
7 2* pred mutrec.p1/3-0 (det) (mutrec.m:82 and others)
9 pred mutrec.test/2-0 (det) (mutrec.m:42)
10 pred mutrec.main/2-0 (det) (mutrec.m:33)
mdb> delete *
0: E stop interface pred mutrec.q1/3-0 (det)
mdb> break q3
0: + stop interface pred mutrec.q3/3-0 (det)
mdb> continue
40: 12 12 CALL pred mutrec.q3/3-0 (det) mutrec.m:173 (mutrec.m:144)
mdb> stack
0 pred mutrec.q3/3-0 (det) (mutrec.m:173)
1 pred mutrec.q1/3-0 (det) (mutrec.m:144)
<mutually recursive set of stack frames start>
2 2* pred mutrec.p2/3-0 (det) (mutrec.m:106 and others)
4 pred mutrec.p3/3-0 (det) (mutrec.m:122)
5 2* pred mutrec.p2/3-0 (det) (mutrec.m:102 and others)
7 pred mutrec.p3/3-0 (det) (mutrec.m:122)
<mutually recursive set of stack frames end>
8 2* pred mutrec.p1/3-0 (det) (mutrec.m:82 and others)
10 pred mutrec.test/2-0 (det) (mutrec.m:42)
11 pred mutrec.main/2-0 (det) (mutrec.m:33)
mdb> delete *
0: E stop interface pred mutrec.q3/3-0 (det)
mdb> break q2
0: + stop interface pred mutrec.q2/3-0 (det)
mdb> continue
45: 13 13 CALL pred mutrec.q2/3-0 (det) mutrec.m:153 (mutrec.m:184)
mdb> stack
0 pred mutrec.q2/3-0 (det) (mutrec.m:153)
1 pred mutrec.q3/3-0 (det) (mutrec.m:184)
2 pred mutrec.q1/3-0 (det) (mutrec.m:144)
<mutually recursive set of stack frames start>
3 2* pred mutrec.p2/3-0 (det) (mutrec.m:106 and others)
5 pred mutrec.p3/3-0 (det) (mutrec.m:122)
6 2* pred mutrec.p2/3-0 (det) (mutrec.m:102 and others)
8 pred mutrec.p3/3-0 (det) (mutrec.m:122)
<mutually recursive set of stack frames end>
9 2* pred mutrec.p1/3-0 (det) (mutrec.m:82 and others)
11 pred mutrec.test/2-0 (det) (mutrec.m:42)
12 pred mutrec.main/2-0 (det) (mutrec.m:33)
mdb> delete *
0: E stop interface pred mutrec.q2/3-0 (det)
mdb> break r0c
0: + stop interface pred mutrec.r0c/3-0 (det)
mdb> continue
69: 19 19 CALL pred mutrec.r0c/3-0 (det) mutrec.m:207 (mutrec.m:188)
mdb> stack
0 pred mutrec.r0c/3-0 (det) (mutrec.m:207)
<mutually recursive set of stack frames start>
1 3* pred mutrec.q3/3-0 (det) (mutrec.m:188 and others)
4 pred mutrec.q2/3-0 (det) (mutrec.m:164)
5 pred mutrec.q3/3-0 (det) (mutrec.m:184)
6 pred mutrec.q2/3-0 (det) (mutrec.m:164)
7 pred mutrec.q3/3-0 (det) (mutrec.m:184)
<mutually recursive set of stack frames end>
8 pred mutrec.q1/3-0 (det) (mutrec.m:144)
<mutually recursive set of stack frames start>
9 2* pred mutrec.p2/3-0 (det) (mutrec.m:106 and others)
11 pred mutrec.p3/3-0 (det) (mutrec.m:122)
12 2* pred mutrec.p2/3-0 (det) (mutrec.m:102 and others)
14 pred mutrec.p3/3-0 (det) (mutrec.m:122)
<mutually recursive set of stack frames end>
15 2* pred mutrec.p1/3-0 (det) (mutrec.m:82 and others)
17 pred mutrec.test/2-0 (det) (mutrec.m:42)
18 pred mutrec.main/2-0 (det) (mutrec.m:33)
mdb> stack -c 3
0 pred mutrec.r0c/3-0 (det) (mutrec.m:207)
<mutually recursive set of stack frames start>
1 3* pred mutrec.q3/3-0 (det) (mutrec.m:188 and others)
4 pred mutrec.q2/3-0 (det) (mutrec.m:164)
5 pred mutrec.q3/3-0 (det) (mutrec.m:184)
<more stack frames in clique snipped>
<mutually recursive set of stack frames end>
8 pred mutrec.q1/3-0 (det) (mutrec.m:144)
<mutually recursive set of stack frames start>
9 2* pred mutrec.p2/3-0 (det) (mutrec.m:106 and others)
11 pred mutrec.p3/3-0 (det) (mutrec.m:122)
12 pred mutrec.p2/3-0 (det) (mutrec.m:102)
<more stack frames in clique snipped>
<mutually recursive set of stack frames end>
15 2* pred mutrec.p1/3-0 (det) (mutrec.m:82 and others)
17 pred mutrec.test/2-0 (det) (mutrec.m:42)
18 pred mutrec.main/2-0 (det) (mutrec.m:33)
mdb> delete *
0: E stop interface pred mutrec.r0c/3-0 (det)
mdb> break r2
0: + stop interface pred mutrec.r2/3-0 (det)
mdb> continue
78: 22 22 CALL pred mutrec.r2/3-0 (det) mutrec.m:233 (mutrec.m:222)
mdb> stack
0 pred mutrec.r2/3-0 (det) (mutrec.m:233)
1 2* pred mutrec.r1/3-0 (det) (mutrec.m:222 and others)
3 pred mutrec.r0c/3-0 (det) (mutrec.m:209)
<mutually recursive set of stack frames start>
4 3* pred mutrec.q3/3-0 (det) (mutrec.m:188 and others)
7 pred mutrec.q2/3-0 (det) (mutrec.m:164)
8 pred mutrec.q3/3-0 (det) (mutrec.m:184)
9 pred mutrec.q2/3-0 (det) (mutrec.m:164)
10 pred mutrec.q3/3-0 (det) (mutrec.m:184)
<mutually recursive set of stack frames end>
11 pred mutrec.q1/3-0 (det) (mutrec.m:144)
<mutually recursive set of stack frames start>
12 2* pred mutrec.p2/3-0 (det) (mutrec.m:106 and others)
14 pred mutrec.p3/3-0 (det) (mutrec.m:122)
15 2* pred mutrec.p2/3-0 (det) (mutrec.m:102 and others)
17 pred mutrec.p3/3-0 (det) (mutrec.m:122)
<mutually recursive set of stack frames end>
18 2* pred mutrec.p1/3-0 (det) (mutrec.m:82 and others)
20 pred mutrec.test/2-0 (det) (mutrec.m:42)
21 pred mutrec.main/2-0 (det) (mutrec.m:33)
mdb> delete *
0: E stop interface pred mutrec.r2/3-0 (det)
mdb> break r3
0: + stop interface pred mutrec.r3/3-0 (det)
mdb> continue
83: 23 23 CALL pred mutrec.r3/3-0 (det) mutrec.m:253 (mutrec.m:244)
mdb> stack
0 pred mutrec.r3/3-0 (det) (mutrec.m:253)
1 pred mutrec.r2/3-0 (det) (mutrec.m:244)
2 2* pred mutrec.r1/3-0 (det) (mutrec.m:222 and others)
4 pred mutrec.r0c/3-0 (det) (mutrec.m:209)
<mutually recursive set of stack frames start>
5 3* pred mutrec.q3/3-0 (det) (mutrec.m:188 and others)
8 pred mutrec.q2/3-0 (det) (mutrec.m:164)
9 pred mutrec.q3/3-0 (det) (mutrec.m:184)
10 pred mutrec.q2/3-0 (det) (mutrec.m:164)
11 pred mutrec.q3/3-0 (det) (mutrec.m:184)
<mutually recursive set of stack frames end>
12 pred mutrec.q1/3-0 (det) (mutrec.m:144)
<mutually recursive set of stack frames start>
13 2* pred mutrec.p2/3-0 (det) (mutrec.m:106 and others)
15 pred mutrec.p3/3-0 (det) (mutrec.m:122)
16 2* pred mutrec.p2/3-0 (det) (mutrec.m:102 and others)
18 pred mutrec.p3/3-0 (det) (mutrec.m:122)
<mutually recursive set of stack frames end>
19 2* pred mutrec.p1/3-0 (det) (mutrec.m:82 and others)
21 pred mutrec.test/2-0 (det) (mutrec.m:42)
22 pred mutrec.main/2-0 (det) (mutrec.m:33)
mdb> delete *
0: E stop interface pred mutrec.r3/3-0 (det)
mdb> break r2
0: + stop interface pred mutrec.r2/3-0 (det)
mdb> continue
91: 25 25 CALL pred mutrec.r2/3-0 (det) mutrec.m:233 (mutrec.m:264)
mdb> stack
<mutually recursive set of stack frames start>
0 pred mutrec.r2/3-0 (det) (mutrec.m:233)
1 2* pred mutrec.r3/3-0 (det) (mutrec.m:264 and others)
3 pred mutrec.r2/3-0 (det) (mutrec.m:244)
<mutually recursive set of stack frames end>
4 2* pred mutrec.r1/3-0 (det) (mutrec.m:222 and others)
6 pred mutrec.r0c/3-0 (det) (mutrec.m:209)
<mutually recursive set of stack frames start>
7 3* pred mutrec.q3/3-0 (det) (mutrec.m:188 and others)
10 pred mutrec.q2/3-0 (det) (mutrec.m:164)
11 pred mutrec.q3/3-0 (det) (mutrec.m:184)
12 pred mutrec.q2/3-0 (det) (mutrec.m:164)
13 pred mutrec.q3/3-0 (det) (mutrec.m:184)
<mutually recursive set of stack frames end>
14 pred mutrec.q1/3-0 (det) (mutrec.m:144)
<mutually recursive set of stack frames start>
15 2* pred mutrec.p2/3-0 (det) (mutrec.m:106 and others)
17 pred mutrec.p3/3-0 (det) (mutrec.m:122)
18 2* pred mutrec.p2/3-0 (det) (mutrec.m:102 and others)
20 pred mutrec.p3/3-0 (det) (mutrec.m:122)
<mutually recursive set of stack frames end>
21 2* pred mutrec.p1/3-0 (det) (mutrec.m:82 and others)
23 pred mutrec.test/2-0 (det) (mutrec.m:42)
24 pred mutrec.main/2-0 (det) (mutrec.m:33)
mdb> delete *
0: E stop interface pred mutrec.r2/3-0 (det)
mdb> break s
0: + stop interface pred mutrec.s/3-0 (det)
mdb> continue
97: 27 27 CALL pred mutrec.s/3-0 (det) mutrec.m:275 (mutrec.m:248)
mdb> stack
0 pred mutrec.s/3-0 (det) (mutrec.m:275)
<mutually recursive set of stack frames start>
1 2* pred mutrec.r2/3-0 (det) (mutrec.m:248 and others)
3 2* pred mutrec.r3/3-0 (det) (mutrec.m:264 and others)
5 pred mutrec.r2/3-0 (det) (mutrec.m:244)
<mutually recursive set of stack frames end>
6 2* pred mutrec.r1/3-0 (det) (mutrec.m:222 and others)
8 pred mutrec.r0c/3-0 (det) (mutrec.m:209)
<mutually recursive set of stack frames start>
9 3* pred mutrec.q3/3-0 (det) (mutrec.m:188 and others)
12 pred mutrec.q2/3-0 (det) (mutrec.m:164)
13 pred mutrec.q3/3-0 (det) (mutrec.m:184)
14 pred mutrec.q2/3-0 (det) (mutrec.m:164)
15 pred mutrec.q3/3-0 (det) (mutrec.m:184)
<mutually recursive set of stack frames end>
16 pred mutrec.q1/3-0 (det) (mutrec.m:144)
<mutually recursive set of stack frames start>
17 2* pred mutrec.p2/3-0 (det) (mutrec.m:106 and others)
19 pred mutrec.p3/3-0 (det) (mutrec.m:122)
20 2* pred mutrec.p2/3-0 (det) (mutrec.m:102 and others)
22 pred mutrec.p3/3-0 (det) (mutrec.m:122)
<mutually recursive set of stack frames end>
23 2* pred mutrec.p1/3-0 (det) (mutrec.m:82 and others)
25 pred mutrec.test/2-0 (det) (mutrec.m:42)
26 pred mutrec.main/2-0 (det) (mutrec.m:33)
mdb> delete *
0: E stop interface pred mutrec.s/3-0 (det)
mdb> continue
[p1, p1, p3, p2, p2, p3, p2, p2, q1, q3, q2, q3, q2, q3, q3, q3, r0c, r1, r1, r2, r3, r3, r2, r2, s, s]
[p1, p1, p3, p2, p2, p3, p2, p2, q1, q3, q2, q3, q2, q3, q3, q3, r0c, r1, r1, r1, r1, r1, r3, r3, s, s, s, s]