Author: Armin Rigo <[email protected]>
Branch: reverse-debugger
Changeset: r85006:9bbdb3034f2d
Date: 2016-06-07 20:08 +0200
http://bitbucket.org/pypy/pypy/changeset/9bbdb3034f2d/
Log: emit stop_point
diff --git a/rpython/rtyper/lltypesystem/lloperation.py
b/rpython/rtyper/lltypesystem/lloperation.py
--- a/rpython/rtyper/lltypesystem/lloperation.py
+++ b/rpython/rtyper/lltypesystem/lloperation.py
@@ -564,6 +564,8 @@
# __________ instrumentation _________
'instrument_count': LLOp(),
+
+ 'revdb_stop_point': LLOp(),
}
# ***** Run test_lloperation after changes. *****
diff --git a/rpython/translator/c/genc.py b/rpython/translator/c/genc.py
--- a/rpython/translator/c/genc.py
+++ b/rpython/translator/c/genc.py
@@ -350,6 +350,9 @@
SetErrorMode(old_mode)
if res.returncode != 0:
if expect_crash:
+ if type(expect_crash) is int and expect_crash !=
res.returncode:
+ raise Exception("Returned %d, but expected %d" % (
+ res.returncode, expect_crash))
return res.out, res.err
print >> sys.stderr, res.err
raise Exception("Returned %d" % (res.returncode,))
diff --git a/rpython/translator/c/src/entrypoint.c
b/rpython/translator/c/src/entrypoint.c
--- a/rpython/translator/c/src/entrypoint.c
+++ b/rpython/translator/c/src/entrypoint.c
@@ -104,7 +104,7 @@
exitcode = STANDALONE_ENTRY_POINT(argc, argv);
#ifdef RPY_REVERSE_DEBUGGER
- rpy_reverse_db_teardown();
+ rpy_reverse_db_teardown(&exitcode);
#endif
pypy_debug_alloc_results();
diff --git a/rpython/translator/revdb/rdb-src/revdb.c
b/rpython/translator/revdb/rdb-src/revdb.c
--- a/rpython/translator/revdb/rdb-src/revdb.c
+++ b/rpython/translator/revdb/rdb-src/revdb.c
@@ -22,7 +22,7 @@
static void setup_record_mode(int argc, char *argv[]);
static void setup_replay_mode(int *argc_p, char **argv_p[]);
-static void check_at_end(void);
+static void check_at_end(int exitcode, int *exitcode_p);
RPY_EXTERN
void rpy_reverse_db_setup(int *argc_p, char **argv_p[])
@@ -48,12 +48,15 @@
}
RPY_EXTERN
-void rpy_reverse_db_teardown(void)
+void rpy_reverse_db_teardown(int *exitcode_p)
{
+ int exitcode;
+ RPY_REVDB_EMIT(exitcode = *exitcode_p; , int _e, exitcode);
+
if (!rpy_rdb_replay)
rpy_reverse_db_flush();
else
- check_at_end();
+ check_at_end(exitcode, exitcode_p);
}
@@ -170,15 +173,21 @@
*argv_p = (char **)x;
}
-static void check_at_end(void)
+static void check_at_end(int exitcode, int *exitcode_p)
{
char dummy[1];
+ if (*exitcode_p != exitcode) {
+ fprintf(stderr, "Bogus exit code\n");
+ exit(1);
+ }
if (rpy_revdb.buf_p != rpy_revdb.buf_limit ||
read(rpy_rev_fileno, dummy, 1) > 0) {
fprintf(stderr, "RevDB file error: corrupted file (too much data?)\n");
exit(1);
}
printf("Replaying finished.\n");
+ rpy_reverse_db_stop_point(0);
+ *exitcode_p = 0;
}
RPY_EXTERN
@@ -209,5 +218,11 @@
return rpy_rev_buffer;
}
+RPY_EXTERN
+void rpy_reverse_db_stop_point(long stop_point)
+{
+ printf("stop_point %ld\n", stop_point);
+}
+
/* ------------------------------------------------------------ */
diff --git a/rpython/translator/revdb/rdb-src/revdb_include.h
b/rpython/translator/revdb/rdb-src/revdb_include.h
--- a/rpython/translator/revdb/rdb-src/revdb_include.h
+++ b/rpython/translator/revdb/rdb-src/revdb_include.h
@@ -1,7 +1,7 @@
#include <string.h>
RPY_EXTERN void rpy_reverse_db_setup(int *argc_p, char **argv_p[]);
-RPY_EXTERN void rpy_reverse_db_teardown(void);
+RPY_EXTERN void rpy_reverse_db_teardown(int *exitcode_p);
typedef struct { char *buf_p, *buf_limit; } rpy_revdb_t;
RPY_EXTERN rpy_revdb_t rpy_revdb;
@@ -47,8 +47,12 @@
#define RPY_REVDB_EMIT_VOID(normal_code) \
if (!rpy_rdb_replay) { normal_code } else { }
+#define OP_REVDB_STOP_POINT(stop_point, r) \
+ if (rpy_rdb_replay) rpy_reverse_db_stop_point(stop_point);
+
RPY_EXTERN void rpy_reverse_db_flush(void);
RPY_EXTERN char *rpy_reverse_db_fetch(int expected_size);
+RPY_EXTERN void rpy_reverse_db_stop_point(long stop_point);
/* ------------------------------------------------------------ */
diff --git a/rpython/translator/revdb/test/test_basic.py
b/rpython/translator/revdb/test/test_basic.py
--- a/rpython/translator/revdb/test/test_basic.py
+++ b/rpython/translator/revdb/test/test_basic.py
@@ -1,9 +1,10 @@
import py
-import os
+import os, sys
import array, struct
from rpython.tool.udir import udir
from rpython.translator.interactive import Translation
from rpython.rlib.rarithmetic import LONG_BIT
+from rpython.rlib import revdb
class RDB(object):
@@ -47,9 +48,16 @@
def run(*argv):
env = os.environ.copy()
env['PYPYREVDB'] = self.rdbname
- stdout = t.driver.cbuilder.cmdexec(' '.join(argv), env=env)
+ stdout, stderr = t.driver.cbuilder.cmdexec(' '.join(argv), env=env,
+ expect_crash=9)
+ print >> sys.stderr, stderr
return stdout
- return run
+
+ def replay():
+ stdout = t.driver.cbuilder.cmdexec("--replay '%s'" % self.rdbname)
+ return stdout
+
+ return run, replay
def fetch_rdb(self):
return RDB(self.rdbname)
@@ -57,8 +65,8 @@
def test_simple(self):
def main(argv):
print argv[1:]
- return 0
- fn = self.getcompiled(main, [], backendopt=False)
+ return 9
+ fn, replay = self.getcompiled(main, [], backendopt=False)
assert fn('abc d') == '[abc, d]\n'
rdb = self.fetch_rdb()
assert rdb.argc == 3
@@ -82,11 +90,27 @@
# write() call
x = rdb.next(); assert x == len('[abc, d]\n')
x = rdb.next('i'); assert x == 0 # errno
+ x = rdb.next('i'); assert x == 9 # exitcode
# that's all that should get from this simple example
assert rdb.done()
#
assert got == [self.exename, 'abc', 'd']
#
# Now try the replay mode (just "doesn't crash" for now)
- stdout = fn("--replay '%s'" % (self.rdbname,))
- assert stdout == "Replaying finished.\n"
+ out = replay()
+ assert out == ("Replaying finished.\n"
+ "stop_point 0\n")
+
+ def test_simple_interpreter(self):
+ def main(argv):
+ for op in argv[1:]:
+ revdb.stop_point(42)
+ print op
+ return 9
+ fn, replay = self.getcompiled(main, [], backendopt=False)
+ assert fn('abc d') == 'abc\nd\n'
+ out = replay()
+ assert out == ("stop_point 42\n"
+ "stop_point 42\n"
+ "Replaying finished.\n"
+ "stop_point 0\n")
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit