327 lines
7.8 KiB
Python
327 lines
7.8 KiB
Python
|
#!/usr/bin/python
|
||
|
|
||
|
# Copyright 2016 Steven Watanabe
|
||
|
# Distributed under the Boost Software License, Version 1.0.
|
||
|
# (See accompanying file LICENSE.txt or https://www.bfgroup.xyz/b2/LICENSE.txt)
|
||
|
|
||
|
# Test the mi interface for the debugger
|
||
|
|
||
|
import BoostBuild
|
||
|
import TestCmd
|
||
|
import re
|
||
|
|
||
|
def split_stdin_stdout(text):
|
||
|
"""stdin is all text after the prompt up to and including
|
||
|
the next newline. Everything else is stdout. stdout
|
||
|
may contain regular expressions enclosed in {{}}."""
|
||
|
prompt = re.escape('(gdb) \n')
|
||
|
pattern = re.compile('(?<=%s)((?:\d*-.*)\n)' % prompt)
|
||
|
stdin = ''.join(re.findall(pattern, text))
|
||
|
stdout = re.sub(pattern, '', text)
|
||
|
outside_pattern = re.compile(r'(?:\A|(?<=\}\}))(?:[^\{]|(?:\{(?!\{)))*(?:(?=\{\{)|\Z)')
|
||
|
|
||
|
def escape_line(line):
|
||
|
line = re.sub(outside_pattern, lambda m: re.escape(m.group(0)), line)
|
||
|
return re.sub(r'\{\{|\}\}', '', line)
|
||
|
|
||
|
stdout = '\n'.join([escape_line(line) for line in stdout.split('\n')])
|
||
|
return (stdin,stdout)
|
||
|
|
||
|
def run(tester, io):
|
||
|
(input,output) = split_stdin_stdout(io)
|
||
|
tester.run_build_system(stdin=input, stdout=output, match=TestCmd.match_re)
|
||
|
|
||
|
def make_tester():
|
||
|
return BoostBuild.Tester(["-dmi"], pass_toolset=False, pass_d0=False,
|
||
|
use_test_config=False, ignore_toolset_requirements=False, match=TestCmd.match_re)
|
||
|
|
||
|
def test_exec_run():
|
||
|
t = make_tester()
|
||
|
t.write("test.jam", """\
|
||
|
UPDATE ;
|
||
|
""")
|
||
|
|
||
|
run(t, """\
|
||
|
=thread-group-added,id="i1"
|
||
|
(gdb)
|
||
|
72-exec-run -ftest.jam
|
||
|
=thread-created,id="1",group-id="i1"
|
||
|
72^running
|
||
|
(gdb)
|
||
|
*stopped,reason="exited-normally"
|
||
|
(gdb)
|
||
|
73-gdb-exit
|
||
|
73^exit
|
||
|
""")
|
||
|
|
||
|
t.cleanup()
|
||
|
|
||
|
def test_exit_status():
|
||
|
t = make_tester()
|
||
|
t.write("test.jam", """\
|
||
|
EXIT : 1 ;
|
||
|
""")
|
||
|
run(t, """\
|
||
|
=thread-group-added,id="i1"
|
||
|
(gdb)
|
||
|
72-exec-run -ftest.jam
|
||
|
=thread-created,id="1",group-id="i1"
|
||
|
72^running
|
||
|
(gdb)
|
||
|
|
||
|
*stopped,reason="exited",exit-code="1"
|
||
|
(gdb)
|
||
|
73-gdb-exit
|
||
|
73^exit
|
||
|
""")
|
||
|
t.cleanup()
|
||
|
|
||
|
def test_exec_step():
|
||
|
t = make_tester()
|
||
|
t.write("test.jam", """\
|
||
|
rule g ( )
|
||
|
{
|
||
|
a = 1 ;
|
||
|
b = 2 ;
|
||
|
}
|
||
|
rule f ( )
|
||
|
{
|
||
|
g ;
|
||
|
c = 3 ;
|
||
|
}
|
||
|
f ;
|
||
|
""")
|
||
|
run(t, """\
|
||
|
=thread-group-added,id="i1"
|
||
|
(gdb)
|
||
|
-break-insert f
|
||
|
^done,bkpt={number="1",type="breakpoint",disp="keep",enabled="y",func="f"}
|
||
|
(gdb)
|
||
|
72-exec-run -ftest.jam
|
||
|
=thread-created,id="1",group-id="i1"
|
||
|
72^running
|
||
|
(gdb)
|
||
|
*stopped,reason="breakpoint-hit",bkptno="1",disp="keep",frame={func="f",args=[],file="test.jam",fullname="{{.*}}test.jam",line="8"},thread-id="1",stopped-threads="all"
|
||
|
(gdb)
|
||
|
1-exec-step
|
||
|
1^running
|
||
|
(gdb)
|
||
|
*stopped,reason="end-stepping-range",frame={func="g",args=[],file="test.jam",fullname="{{.*}}test.jam",line="3"},thread-id="1"
|
||
|
(gdb)
|
||
|
2-exec-step
|
||
|
2^running
|
||
|
(gdb)
|
||
|
*stopped,reason="end-stepping-range",frame={func="g",args=[],file="test.jam",fullname="{{.*}}test.jam",line="4"},thread-id="1"
|
||
|
(gdb)
|
||
|
3-exec-step
|
||
|
3^running
|
||
|
(gdb)
|
||
|
*stopped,reason="end-stepping-range",frame={func="f",args=[],file="test.jam",fullname="{{.*}}test.jam",line="9"},thread-id="1"
|
||
|
(gdb)
|
||
|
73-gdb-exit
|
||
|
73^exit
|
||
|
""")
|
||
|
t.cleanup()
|
||
|
|
||
|
def test_exec_next():
|
||
|
t = make_tester()
|
||
|
t.write("test.jam", """\
|
||
|
rule g ( )
|
||
|
{
|
||
|
a = 1 ;
|
||
|
}
|
||
|
rule f ( )
|
||
|
{
|
||
|
g ;
|
||
|
b = 2 ;
|
||
|
c = 3 ;
|
||
|
}
|
||
|
rule h ( )
|
||
|
{
|
||
|
f ;
|
||
|
g ;
|
||
|
}
|
||
|
h ;
|
||
|
d = 4 ;
|
||
|
""")
|
||
|
run(t, """\
|
||
|
=thread-group-added,id="i1"
|
||
|
(gdb)
|
||
|
-break-insert f
|
||
|
^done,bkpt={number="1",type="breakpoint",disp="keep",enabled="y",func="f"}
|
||
|
(gdb)
|
||
|
72-exec-run -ftest.jam
|
||
|
=thread-created,id="1",group-id="i1"
|
||
|
72^running
|
||
|
(gdb)
|
||
|
*stopped,reason="breakpoint-hit",bkptno="1",disp="keep",frame={func="f",args=[],file="test.jam",fullname="{{.*}}test.jam",line="7"},thread-id="1",stopped-threads="all"
|
||
|
(gdb)
|
||
|
1-exec-next
|
||
|
1^running
|
||
|
(gdb)
|
||
|
*stopped,reason="end-stepping-range",frame={func="f",args=[],file="test.jam",fullname="{{.*}}test.jam",line="8"},thread-id="1"
|
||
|
(gdb)
|
||
|
2-exec-next
|
||
|
2^running
|
||
|
(gdb)
|
||
|
*stopped,reason="end-stepping-range",frame={func="f",args=[],file="test.jam",fullname="{{.*}}test.jam",line="9"},thread-id="1"
|
||
|
(gdb)
|
||
|
3-exec-next
|
||
|
3^running
|
||
|
(gdb)
|
||
|
*stopped,reason="end-stepping-range",frame={func="h",args=[],file="test.jam",fullname="{{.*}}test.jam",line="14"},thread-id="1"
|
||
|
(gdb)
|
||
|
4-exec-next
|
||
|
4^running
|
||
|
(gdb)
|
||
|
*stopped,reason="end-stepping-range",frame={func="module scope",args=[],file="test.jam",fullname="{{.*}}test.jam",line="17"},thread-id="1"
|
||
|
(gdb)
|
||
|
73-gdb-exit
|
||
|
73^exit
|
||
|
""")
|
||
|
t.cleanup()
|
||
|
|
||
|
def test_exec_finish():
|
||
|
t = make_tester()
|
||
|
t.write("test.jam", """\
|
||
|
rule f ( )
|
||
|
{
|
||
|
a = 1 ;
|
||
|
}
|
||
|
rule g ( )
|
||
|
{
|
||
|
f ;
|
||
|
b = 2 ;
|
||
|
i ;
|
||
|
}
|
||
|
rule h ( )
|
||
|
{
|
||
|
g ;
|
||
|
i ;
|
||
|
}
|
||
|
rule i ( )
|
||
|
{
|
||
|
c = 3 ;
|
||
|
}
|
||
|
h ;
|
||
|
d = 4 ;
|
||
|
""")
|
||
|
run(t, """\
|
||
|
=thread-group-added,id="i1"
|
||
|
(gdb)
|
||
|
-break-insert f
|
||
|
^done,bkpt={number="1",type="breakpoint",disp="keep",enabled="y",func="f"}
|
||
|
(gdb)
|
||
|
72-exec-run -ftest.jam
|
||
|
=thread-created,id="1",group-id="i1"
|
||
|
72^running
|
||
|
(gdb)
|
||
|
*stopped,reason="breakpoint-hit",bkptno="1",disp="keep",frame={func="f",args=[],file="test.jam",fullname="{{.*}}test.jam",line="3"},thread-id="1",stopped-threads="all"
|
||
|
(gdb)
|
||
|
1-exec-finish
|
||
|
1^running
|
||
|
(gdb)
|
||
|
*stopped,reason="end-stepping-range",frame={func="g",args=[],file="test.jam",fullname="{{.*}}test.jam",line="8"},thread-id="1"
|
||
|
(gdb)
|
||
|
2-exec-finish
|
||
|
2^running
|
||
|
(gdb)
|
||
|
*stopped,reason="end-stepping-range",frame={func="h",args=[],file="test.jam",fullname="{{.*}}test.jam",line="14"},thread-id="1"
|
||
|
(gdb)
|
||
|
3-exec-finish
|
||
|
3^running
|
||
|
(gdb)
|
||
|
*stopped,reason="end-stepping-range",frame={func="module scope",args=[],file="test.jam",fullname="{{.*}}test.jam",line="21"},thread-id="1"
|
||
|
(gdb)
|
||
|
73-gdb-exit
|
||
|
73^exit
|
||
|
""")
|
||
|
t.cleanup()
|
||
|
|
||
|
|
||
|
def test_breakpoints():
|
||
|
"""Tests the interaction between the following commands:
|
||
|
break, clear, delete, disable, enable"""
|
||
|
t = make_tester()
|
||
|
t.write("test.jam", """\
|
||
|
rule f ( )
|
||
|
{
|
||
|
a = 1 ;
|
||
|
}
|
||
|
rule g ( )
|
||
|
{
|
||
|
b = 2 ;
|
||
|
}
|
||
|
rule h ( )
|
||
|
{
|
||
|
c = 3 ;
|
||
|
d = 4 ;
|
||
|
}
|
||
|
f ;
|
||
|
g ;
|
||
|
h ;
|
||
|
UPDATE ;
|
||
|
""")
|
||
|
run(t, """\
|
||
|
=thread-group-added,id="i1"
|
||
|
(gdb)
|
||
|
-break-insert f
|
||
|
^done,bkpt={number="1",type="breakpoint",disp="keep",enabled="y",func="f"}
|
||
|
(gdb)
|
||
|
72-exec-run -ftest.jam
|
||
|
=thread-created,id="1",group-id="i1"
|
||
|
72^running
|
||
|
(gdb)
|
||
|
*stopped,reason="breakpoint-hit",bkptno="1",disp="keep",frame={func="f",args=[],file="test.jam",fullname="{{.*}}test.jam",line="3"},thread-id="1",stopped-threads="all"
|
||
|
(gdb)
|
||
|
-interpreter-exec console kill
|
||
|
^done
|
||
|
(gdb)
|
||
|
-break-insert g
|
||
|
^done,bkpt={number="2",type="breakpoint",disp="keep",enabled="y",func="g"}
|
||
|
(gdb)
|
||
|
-break-disable 1
|
||
|
^done
|
||
|
(gdb)
|
||
|
73-exec-run -ftest.jam
|
||
|
=thread-created,id="1",group-id="i1"
|
||
|
73^running
|
||
|
(gdb)
|
||
|
*stopped,reason="breakpoint-hit",bkptno="2",disp="keep",frame={func="g",args=[],file="test.jam",fullname="{{.*}}test.jam",line="7"},thread-id="1",stopped-threads="all"
|
||
|
(gdb)
|
||
|
-interpreter-exec console kill
|
||
|
^done
|
||
|
(gdb)
|
||
|
-break-enable 1
|
||
|
^done
|
||
|
(gdb)
|
||
|
74-exec-run -ftest.jam
|
||
|
=thread-created,id="1",group-id="i1"
|
||
|
74^running
|
||
|
(gdb)
|
||
|
*stopped,reason="breakpoint-hit",bkptno="1",disp="keep",frame={func="f",args=[],file="test.jam",fullname="{{.*}}test.jam",line="3"},thread-id="1",stopped-threads="all"
|
||
|
(gdb)
|
||
|
-interpreter-exec console kill
|
||
|
^done
|
||
|
(gdb)
|
||
|
-break-delete 1
|
||
|
^done
|
||
|
(gdb)
|
||
|
75-exec-run -ftest.jam
|
||
|
=thread-created,id="1",group-id="i1"
|
||
|
75^running
|
||
|
(gdb)
|
||
|
*stopped,reason="breakpoint-hit",bkptno="2",disp="keep",frame={func="g",args=[],file="test.jam",fullname="{{.*}}test.jam",line="7"},thread-id="1",stopped-threads="all"
|
||
|
(gdb)
|
||
|
76-gdb-exit
|
||
|
76^exit
|
||
|
""")
|
||
|
t.cleanup()
|
||
|
|
||
|
test_exec_run()
|
||
|
test_exit_status()
|
||
|
test_exec_step()
|
||
|
test_exec_next()
|
||
|
test_exec_finish()
|
||
|
test_breakpoints()
|