From 97b64f6791c7ec005742f55e025663317830f981 Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 16 Sep 2015 16:00:15 +0200 Subject: [PATCH] Debugger: Add watcher handling in pdbbridge for basic types Values are passed through plain str(eval(...)), i.e. no expansion of non-scalars (list, dict, ...) yet. Change-Id: I21ceab29504e2bb43aef516f9beeca5470500fdc Reviewed-by: Christian Stenger --- share/qtcreator/debugger/pdbbridge.py | 31 ++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/share/qtcreator/debugger/pdbbridge.py b/share/qtcreator/debugger/pdbbridge.py index d6098b1f9cc..4c68ffc7fbe 100644 --- a/share/qtcreator/debugger/pdbbridge.py +++ b/share/qtcreator/debugger/pdbbridge.py @@ -203,6 +203,19 @@ class Dumper: self.commands = {} # associates a command list to breakpoint numbers + # Hex decoding operating on str, return str. + def hexdecode(self, s): + if sys.version_info[0] == 2: + return s.decode("hex") + return bytes.fromhex(s).decode("utf8") + + # Hex encoding operating on str or bytes, return str. + def hexencode(self, s): + if sys.version_info[0] == 2: + return s.encode("hex") + if isinstance(s, str): + s = s.encode("utf8") + return base64.b16encode(s).decode("utf8") def canonic(self, filename): if filename == "<" + filename[1:-1] + ">": return filename @@ -1393,7 +1406,6 @@ class Dumper: self.expandedINames = set(args.get("expanded", [])) self.typeformats = args.get("typeformats", {}) self.formats = args.get("formats", {}) - self.watchers = args.get("watchers", {}) self.output = "" frameNr = args.get("frame", 0) @@ -1416,6 +1428,23 @@ class Dumper: if var.startswith('.'): var = "@arg" + var[1:] self.dumpValue(value, var, "local.%s" % var) + + for watcher in args.get("watchers", []): + iname = watcher['iname'] + exp = self.hexdecode(watcher['exp']) + exp = str(exp).strip() + escapedExp = self.hexencode(exp) + self.put("{") + self.putField("iname", iname) + self.putField("wname", escapedExp) + try: + res = eval(exp, {}, frame.f_locals) + self.putValue(res) + except: + self.putValue("") + self.put("}") + #self.dumpValue(eval(value), escapedExp, iname) + self.output += '}' self.output += '{frame="%s"}' % frameNr self.flushOutput()