-
Notifications
You must be signed in to change notification settings - Fork 14.9k
[Dexter] Add DexStepFunction and DexContinue skeletons #152720
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
f20b541
fff1077
4b5d4f8
83608ac
360bb95
f9dbca4
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
# DExTer : Debugging Experience Tester | ||
# ~~~~~~ ~ ~~ ~ ~~ | ||
# | ||
# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
# See https://llvm.org/LICENSE.txt for license information. | ||
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
"""A Command that tells dexter to set a breakpoint which, after hitting, | ||
signals that the debugger should 'continue' until another is hit. Continuing | ||
out of a function being stepped through with DexStepFunction is well defined: | ||
stepping will resume in other functions tracked further down the stacktrace. | ||
|
||
NOTE: Only supported for DAP-based debuggers. | ||
""" | ||
|
||
from dex.command.CommandBase import CommandBase | ||
|
||
|
||
class DexContinue(CommandBase): | ||
def __init__(self, *args, **kwargs): | ||
# DexContinue(*[expr, *values], **from_line[, **to_line, **hit_count]) | ||
|
||
# Optional positional args: expr, values. | ||
if len(args) == 0: | ||
self.expression = None | ||
self.values = [] | ||
elif len(args) == 1: | ||
raise TypeError("expected 0 or at least 2 positional arguments") | ||
else: | ||
self.expression = args[0] | ||
self.values = [str(arg) for arg in args[1:]] | ||
|
||
# Required keyword arg: from_line. | ||
try: | ||
self.from_line = kwargs.pop("from_line") | ||
except: | ||
raise TypeError("Missing from_line argument") | ||
|
||
# Optional conditional args: to_line, hit_count. | ||
self.to_line = kwargs.pop("to_line", None) | ||
self.hit_count = kwargs.pop("hit_count", None) | ||
|
||
if kwargs: | ||
raise TypeError("unexpected named args: {}".format(", ".join(kwargs))) | ||
super(DexContinue, self).__init__() | ||
|
||
def eval(self): | ||
raise NotImplementedError("DexContinue commands cannot be evaled.") | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Nit, I don't know how I feel about this particular adjectivalisation, maybe we could avoid it by changing it to "Cannot eval DexContinue commands" or similar, or maybe you can just ignore this comment as being a matter of taste! There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I agree with you, but I copied this from other existing commands, so I'm inclined to keep it for uniformity. |
||
|
||
@staticmethod | ||
def get_name(): | ||
return __class__.__name__ | ||
|
||
@staticmethod | ||
def get_subcommands() -> dict: | ||
return None |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
# DExTer : Debugging Experience Tester | ||
# ~~~~~~ ~ ~~ ~ ~~ | ||
# | ||
# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
# See https://llvm.org/LICENSE.txt for license information. | ||
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
"""A Command that tells dexter to set a function breakpoint and step through | ||
the function after hitting it. | ||
|
||
NOTE: Only supported for DAP-based debuggers. | ||
""" | ||
|
||
from dex.command.CommandBase import CommandBase | ||
|
||
|
||
class DexStepFunction(CommandBase): | ||
def __init__(self, *args, **kwargs): | ||
if len(args) < 1: | ||
raise TypeError("expected 1 positional argument") | ||
self.function = str(args[0]) | ||
self.hit_count = kwargs.pop("hit_count", None) | ||
if kwargs: | ||
raise TypeError(f"unexpected named args: {', '.join(kwargs)}") | ||
super(DexStepFunction, self).__init__() | ||
|
||
def eval(self): | ||
raise NotImplementedError("DexStepFunction commands cannot be evaled.") | ||
|
||
def get_function(self): | ||
return self.function | ||
|
||
@staticmethod | ||
def get_name(): | ||
return __class__.__name__ | ||
|
||
@staticmethod | ||
def get_subcommands() -> dict: | ||
return None |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'd suggest creating two separate words for it. In debugger parlance, I think "hit_count=n" means after n hits, maybe we could replace the alternative form with "repeat_count"?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
DexFinishTest works in the hit_count sense, but other commands work in the repeat_count sense. Could we land this as-is and separately fix this inconsistency across all the commands?