Gitweb links:
...log
http://git.netsurf-browser.org/netsurf.git/shortlog/d63de35033014b56ef1b2...
...commit
http://git.netsurf-browser.org/netsurf.git/commit/d63de35033014b56ef1b2e2...
...tree
http://git.netsurf-browser.org/netsurf.git/tree/d63de35033014b56ef1b2e23f...
The branch, master has been updated
via d63de35033014b56ef1b2e23f6de35739c3e7c86 (commit)
via a29ed7c0832bd0c210885d5ec3730bcbc4469259 (commit)
via ccffb95f03f1710ecfa2d1b9a20a28ba94d08290 (commit)
from 5632c9c8c0e8ddf3b5945fd36b19dff7367851c5 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff
http://git.netsurf-browser.org/netsurf.git/commit/?id=d63de35033014b56ef1...
commit d63de35033014b56ef1b2e23f6de35739c3e7c86
Author: Daniel Silverstone <dsilvers(a)digital-scurf.org>
Commit: Daniel Silverstone <dsilvers(a)digital-scurf.org>
monkey-see-monkey-do: Decode backtraces
To improve debugging, decode backtraces discovered during
runs with monkey-see-monkey-do
Signed-off-by: Daniel Silverstone <dsilvers(a)digital-scurf.org>
diff --git a/test/monkey-see-monkey-do b/test/monkey-see-monkey-do
index 1d6bb52..584a70c 100755
--- a/test/monkey-see-monkey-do
+++ b/test/monkey-see-monkey-do
@@ -24,6 +24,20 @@ MONKEY_PATH = "./nsmonkey"
mp.set_start_method('fork')
+def decode_trace(s):
+ import re
+ from subprocess import getoutput
+ addr_re = re.compile(r"./nsmonkey\(\+(0x[0-9a-f]+)\)")
+ def decode_line(l):
+ caps = addr_re.findall(l);
+ if caps:
+ return getoutput(
+ "addar2line -e {} {} 2>/dev/null || echo
'./nsmonkey(+{})'".format(
+ MONKEY_PATH, caps[0], caps[0]))
+ else:
+ return l
+ return "\n".join(decode_line(l) for l in s.split("\n"))
+
def child_run_test(verbose, parts):
outcapture = StringIO()
errcapture = StringIO()
@@ -38,7 +52,7 @@ def child_run_test(verbose, parts):
sys.stderr = olderr
print("FAIL:")
print("STDOUT:\n{}\n".format(outcapture.getvalue()))
- print("STDERR:\n{}\n".format(errcapture.getvalue()))
+ print("STDERR:\n{}\n".format(decode_trace(errcapture.getvalue())))
print("RERAISE:")
raise
else:
commitdiff
http://git.netsurf-browser.org/netsurf.git/commit/?id=a29ed7c0832bd0c2108...
commit a29ed7c0832bd0c210885d5ec3730bcbc4469259
Author: Daniel Silverstone <dsilvers(a)digital-scurf.org>
Commit: Daniel Silverstone <dsilvers(a)digital-scurf.org>
monkeyfarmer.py: Ensure that we capture and repeat stderr
In order that we can process stderr in monkey-see-monkey-do
we need to capture it in the farmer and re-echo it through
Python's stderr object
Signed-off-by: Daniel Silverstone <dsilvers(a)digital-scurf.org>
diff --git a/test/monkeyfarmer.py b/test/monkeyfarmer.py
index 4dfc41a..e5e6397 100644
--- a/test/monkeyfarmer.py
+++ b/test/monkeyfarmer.py
@@ -32,6 +32,44 @@ import socket
import subprocess
import time
import errno
+import sys
+
+class StderrEcho(asyncore.dispatcher):
+ def __init__(self, sockend):
+ asyncore.dispatcher.__init__(self, sock=sockend)
+ self.incoming = b""
+
+ def handle_connect(self):
+ pass
+
+ def handle_close(self):
+ # the pipe to the monkey process has closed
+ self.close()
+
+ def handle_read(self):
+ try:
+ got = self.recv(8192)
+ if not got:
+ return
+ except socket.error as error:
+ if error.errno == errno.EAGAIN or error.errno == errno.EWOULDBLOCK:
+ return
+ else:
+ raise
+
+ self.incoming += got
+ if b"\n" in self.incoming:
+ lines = self.incoming.split(b"\n")
+ self.incoming = lines.pop()
+ for line in lines:
+ try:
+ line = line.decode('utf-8')
+ except UnicodeDecodeError:
+ print("WARNING: Unicode decode error")
+ line = line.decode('utf-8', 'replace')
+
+ sys.stderr.write("{}\n".format(line))
+
class MonkeyFarmer(asyncore.dispatcher):
@@ -42,6 +80,10 @@ class MonkeyFarmer(asyncore.dispatcher):
asyncore.dispatcher.__init__(self, sock=mine)
+ (mine2, monkeyserr) = socket.socketpair()
+
+ self._errwrapper = StderrEcho(mine2)
+
if wrapper is not None:
new_cmd = list(wrapper)
new_cmd.extend(monkey_cmd)
@@ -51,9 +93,11 @@ class MonkeyFarmer(asyncore.dispatcher):
monkey_cmd,
stdin=monkeys,
stdout=monkeys,
- close_fds=[mine])
+ stderr=monkeyserr,
+ close_fds=[mine, mine2])
monkeys.close()
+ monkeyserr.close()
self.buffer = b""
self.incoming = b""
commitdiff
http://git.netsurf-browser.org/netsurf.git/commit/?id=ccffb95f03f1710ecfa...
commit ccffb95f03f1710ecfa2d1b9a20a28ba94d08290
Author: Daniel Silverstone <dsilvers(a)digital-scurf.org>
Commit: Daniel Silverstone <dsilvers(a)digital-scurf.org>
monkey: On assert failure, print a backtrace
Signed-off-by: Daniel Silverstone <dsilvers(a)digital-scurf.org>
diff --git a/frontends/monkey/main.c b/frontends/monkey/main.c
index e1c2a38..a893144 100644
--- a/frontends/monkey/main.c
+++ b/frontends/monkey/main.c
@@ -316,6 +316,29 @@ static void monkey_run(void)
}
}
+#ifndef NDEBUG
+#include <execinfo.h>
+static void *backtrace_buffer[4096];
+
+void
+__assert_fail(const char *__assertion, const char *__file,
+ unsigned int __line, const char *__function)
+{
+ int frames;
+ fprintf(stderr, "MONKEY: Assertion failure!\n%s:%d: %s: Assertion `%s`
failed.\n",
+ __file, __line, __function, __assertion);
+
+ frames = backtrace(&backtrace_buffer[0], 4096);
+ if (frames > 0 && frames < 4096) {
+ fprintf(stderr, "Backtrace:\n");
+ fflush(stderr);
+ backtrace_symbols_fd(&backtrace_buffer[0], frames, 2);
+ }
+
+ abort();
+}
+#endif
+
int
main(int argc, char **argv)
{
-----------------------------------------------------------------------
Summary of changes:
frontends/monkey/main.c | 23 +++++++++++++++++++++++
test/monkey-see-monkey-do | 16 +++++++++++++++-
test/monkeyfarmer.py | 46 ++++++++++++++++++++++++++++++++++++++++++++-
3 files changed, 83 insertions(+), 2 deletions(-)
diff --git a/frontends/monkey/main.c b/frontends/monkey/main.c
index e1c2a38..a893144 100644
--- a/frontends/monkey/main.c
+++ b/frontends/monkey/main.c
@@ -316,6 +316,29 @@ static void monkey_run(void)
}
}
+#ifndef NDEBUG
+#include <execinfo.h>
+static void *backtrace_buffer[4096];
+
+void
+__assert_fail(const char *__assertion, const char *__file,
+ unsigned int __line, const char *__function)
+{
+ int frames;
+ fprintf(stderr, "MONKEY: Assertion failure!\n%s:%d: %s: Assertion `%s`
failed.\n",
+ __file, __line, __function, __assertion);
+
+ frames = backtrace(&backtrace_buffer[0], 4096);
+ if (frames > 0 && frames < 4096) {
+ fprintf(stderr, "Backtrace:\n");
+ fflush(stderr);
+ backtrace_symbols_fd(&backtrace_buffer[0], frames, 2);
+ }
+
+ abort();
+}
+#endif
+
int
main(int argc, char **argv)
{
diff --git a/test/monkey-see-monkey-do b/test/monkey-see-monkey-do
index 1d6bb52..584a70c 100755
--- a/test/monkey-see-monkey-do
+++ b/test/monkey-see-monkey-do
@@ -24,6 +24,20 @@ MONKEY_PATH = "./nsmonkey"
mp.set_start_method('fork')
+def decode_trace(s):
+ import re
+ from subprocess import getoutput
+ addr_re = re.compile(r"./nsmonkey\(\+(0x[0-9a-f]+)\)")
+ def decode_line(l):
+ caps = addr_re.findall(l);
+ if caps:
+ return getoutput(
+ "addar2line -e {} {} 2>/dev/null || echo
'./nsmonkey(+{})'".format(
+ MONKEY_PATH, caps[0], caps[0]))
+ else:
+ return l
+ return "\n".join(decode_line(l) for l in s.split("\n"))
+
def child_run_test(verbose, parts):
outcapture = StringIO()
errcapture = StringIO()
@@ -38,7 +52,7 @@ def child_run_test(verbose, parts):
sys.stderr = olderr
print("FAIL:")
print("STDOUT:\n{}\n".format(outcapture.getvalue()))
- print("STDERR:\n{}\n".format(errcapture.getvalue()))
+ print("STDERR:\n{}\n".format(decode_trace(errcapture.getvalue())))
print("RERAISE:")
raise
else:
diff --git a/test/monkeyfarmer.py b/test/monkeyfarmer.py
index 4dfc41a..e5e6397 100644
--- a/test/monkeyfarmer.py
+++ b/test/monkeyfarmer.py
@@ -32,6 +32,44 @@ import socket
import subprocess
import time
import errno
+import sys
+
+class StderrEcho(asyncore.dispatcher):
+ def __init__(self, sockend):
+ asyncore.dispatcher.__init__(self, sock=sockend)
+ self.incoming = b""
+
+ def handle_connect(self):
+ pass
+
+ def handle_close(self):
+ # the pipe to the monkey process has closed
+ self.close()
+
+ def handle_read(self):
+ try:
+ got = self.recv(8192)
+ if not got:
+ return
+ except socket.error as error:
+ if error.errno == errno.EAGAIN or error.errno == errno.EWOULDBLOCK:
+ return
+ else:
+ raise
+
+ self.incoming += got
+ if b"\n" in self.incoming:
+ lines = self.incoming.split(b"\n")
+ self.incoming = lines.pop()
+ for line in lines:
+ try:
+ line = line.decode('utf-8')
+ except UnicodeDecodeError:
+ print("WARNING: Unicode decode error")
+ line = line.decode('utf-8', 'replace')
+
+ sys.stderr.write("{}\n".format(line))
+
class MonkeyFarmer(asyncore.dispatcher):
@@ -42,6 +80,10 @@ class MonkeyFarmer(asyncore.dispatcher):
asyncore.dispatcher.__init__(self, sock=mine)
+ (mine2, monkeyserr) = socket.socketpair()
+
+ self._errwrapper = StderrEcho(mine2)
+
if wrapper is not None:
new_cmd = list(wrapper)
new_cmd.extend(monkey_cmd)
@@ -51,9 +93,11 @@ class MonkeyFarmer(asyncore.dispatcher):
monkey_cmd,
stdin=monkeys,
stdout=monkeys,
- close_fds=[mine])
+ stderr=monkeyserr,
+ close_fds=[mine, mine2])
monkeys.close()
+ monkeyserr.close()
self.buffer = b""
self.incoming = b""
--
NetSurf Browser