mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00

`lldb_cruby.py` manages lldb custom commands using functions. The file is a large list of Python functions, and an init handler to map some of the Python functions into the debugger, to enable execution of custom logic during a debugging session. Since LLDB 3.7 (September 2015) there has also been support for using python classes rather than bare functions, as long as those classes implement a specific interface. This PR Introduces some more defined structure to the LLDB helper functions by switching from the function based implementation to the class based one, and providing an auto-loading mechanism by which new functions can be loaded. The intention behind this change is to make working with the LLDB helpers easier, by reducing code duplication, providing a consistent structure and a clearer API for developers. The current function based approach has some advantages and disadvantages Advantages: - Adding new code is easy. - All the code is self contained and searchable. Disadvantages: - No visible organisation of the file contents. This means - Hard to tell which functions are utility functions and which are available to you in a debugging session - Lots of code duplication within lldb functions - Large files quickly become intimidating to work with - for example, `lldb_disasm.py` was implemented as a seperate Python module because it was easier to start with a clean slate than add significant amounts of code to `lldb_cruby.py` This PR attempts, to fix the disadvantages of the current approach and maintain, or enhance, the benefits. The new structure of a command looks like this; ``` class TestCommand(RbBaseCommand): # program is the keyword the user will type in lldb to execute this command program = "test" # help_string will be displayed in lldb when the user uses the help functions help_string = "This is a test command to show how to implement lldb commands" # call is where our command logic will be implemented def call(self, debugger, command, exe_ctx, result): pass ``` If the command fulfils the following criteria it will then be auto-loaded when an lldb session is started: - The package file must exist inside the `commands` directory and the filename must end in `_command.py` - The package must implement a class whose name ends in `Command` - The class inherits from `RbBaseCommand` or at minimum a class that shares the same interface as `RbBaseCommand` (at minimum this means defining `__init__` and `__call__`, and using `__call__` to call `call` which is defined in the subclasses). - The class must have a class variable `package` that is a String. This is the name of the command you'll call in the `lldb` debugger.
25 lines
1.2 KiB
Python
25 lines
1.2 KiB
Python
# This is a command template for implementing a helper function inside LLDB. To
|
|
# use this file
|
|
# 1. Copy it and rename the copy so it ends with `_command.py`.
|
|
# 2. Rename the class to something descriptive that ends with Command.
|
|
# 3. Change the program variable to be a descriptive command name
|
|
# 4. Ensure you are inheriting from RbBaseCommand or another command that
|
|
# implements the same interfact
|
|
|
|
# This test command inherits from RbBaseCommand which provides access to Ruby
|
|
# globals and utility helpers
|
|
class TestCommand(RbBaseCommand):
|
|
# program is the keyword the user will type in lldb to execute this command
|
|
program = "test"
|
|
|
|
# help_string will be displayed in lldb when the user uses the help functions
|
|
help_string = "This is a test command to show how to implement lldb commands"
|
|
|
|
# call is where our command logic will be implemented
|
|
def call(self, debugger, command, exe_ctx, result):
|
|
# This method will be called once the LLDB environment has been setup.
|
|
# You will have access to self.target, self.process, self.frame, and
|
|
# self.thread
|
|
#
|
|
# This is where we should implement our command logic
|
|
pass
|