def get_variables(self, *varnames, **kwargs): """Fetches the specified variables from the frame specified by frame_id, or from the topmost frame in the last "stackTrace" response if frame_id is not specified. If varnames is empty, then all variables in the frame are returned. The result is an OrderedDict, in which every entry has variable name as the key, and a DAP Variable object as the value. The original order of variables as reported by the debugger is preserved. If varnames is not empty, then only the specified variables are returned. The result is a tuple, in which every entry is a DAP Variable object; those entries are in the same order as varnames. """ assert self.timeline.is_frozen frame_id = kwargs.pop("frame_id", None) if frame_id is None: stackTrace_responses = self.all_occurrences_of( timeline.Response(timeline.Request("stackTrace"))) assert stackTrace_responses, ( "get_variables() without frame_id requires at least one response " 'to a "stackTrace" request in the timeline.') stack_trace = stackTrace_responses[-1] frame_id = stack_trace.body.get("stackFrames", json.array())[0]("id", int) scopes = self.request("scopes", {"frameId": frame_id})("scopes", json.array()) assert len(scopes) > 0 variables = self.request( "variables", {"variablesReference": scopes[0]("variablesReference", int)})( "variables", json.array()) variables = collections.OrderedDict( ((v("name", unicode), v) for v in variables)) if varnames: assert set(varnames) <= set(variables.keys()) return tuple((variables[name] for name in varnames)) else: return variables
def test_sudo(pyfile, tmpdir, run, target): # Since the test can't rely on sudo being allowed for the user, create a dummy # sudo script that doesn't actually elevate, but sets an environment variable # that can be checked in the debuggee. sudo = tmpdir / "sudo" sudo.write( """#!/bin/sh if [ "$1" = "-E" ]; then shift; fi exec env DEBUGPY_SUDO=1 "$@" """ ) os.chmod(sudo.strpath, 0o777) @pyfile def code_to_debug(): import os import debuggee from debuggee import backchannel debuggee.setup() backchannel.send(os.getenv("DEBUGPY_SUDO", "0")) with debug.Session() as session: session.config["sudo"] = True session.spawn_adapter.env["PATH"] = session.spawn_debuggee.env["PATH"] = ( tmpdir.strpath + ":" + os.environ["PATH"] ) backchannel = session.open_backchannel() with run(session, target(code_to_debug)): pass # The "runInTerminal" request sent by the adapter to spawn the launcher, # if any, shouldn't be using sudo. assert all( "sudo" not in req.arguments["args"] for req in session.all_occurrences_of(timeline.Request("runInTerminal")) ) # The launcher, however, should use our dummy sudo to spawn the debuggee, # and the debuggee should report the environment variable accordingly. assert backchannel.receive() == "1"