Gitweb links:

...log 
http://git.netsurf-browser.org/netsurf.git/shortlog/d63de35033014b56ef1b2e23f6de35739c3e7c86
...commit 
http://git.netsurf-browser.org/netsurf.git/commit/d63de35033014b56ef1b2e23f6de35739c3e7c86
...tree 
http://git.netsurf-browser.org/netsurf.git/tree/d63de35033014b56ef1b2e23f6de35739c3e7c86

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=d63de35033014b56ef1b2e23f6de35739c3e7c86
commit d63de35033014b56ef1b2e23f6de35739c3e7c86
Author: Daniel Silverstone <[email protected]>
Commit: Daniel Silverstone <[email protected]>

    monkey-see-monkey-do: Decode backtraces
    
    To improve debugging, decode backtraces discovered during
    runs with monkey-see-monkey-do
    
    Signed-off-by: Daniel Silverstone <[email protected]>

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=a29ed7c0832bd0c210885d5ec3730bcbc4469259
commit a29ed7c0832bd0c210885d5ec3730bcbc4469259
Author: Daniel Silverstone <[email protected]>
Commit: Daniel Silverstone <[email protected]>

    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 <[email protected]>

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=ccffb95f03f1710ecfa2d1b9a20a28ba94d08290
commit ccffb95f03f1710ecfa2d1b9a20a28ba94d08290
Author: Daniel Silverstone <[email protected]>
Commit: Daniel Silverstone <[email protected]>

    monkey: On assert failure, print a backtrace
    
    Signed-off-by: Daniel Silverstone <[email protected]>

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

_______________________________________________
netsurf-commits mailing list
[email protected]
http://listmaster.pepperfish.net/cgi-bin/mailman/listinfo/netsurf-commits-netsurf-browser.org

Reply via email to