mirror of
https://github.com/pytorch/pytorch.git
synced 2025-10-20 12:54:11 +08:00
# Summary Add support for pretty printing of tensors when using lldb similiar to what is currently available for gdb <img width="772" alt="Screenshot 2023-03-18 at 6 20 34 PM" src="https://user-images.githubusercontent.com/32754868/226148687-b4e6cfe1-8be1-4657-9ebc-d134f697dd37.png"> <img width="254" alt="Screenshot 2023-03-18 at 6 20 43 PM" src="https://user-images.githubusercontent.com/32754868/226148690-caca6f76-d873-419e-b5e4-6bb403b3d179.png"> I changed it so to override the variable formatting instead of having to call a seperate command you can just do `print <tensor>` I also add one for sizes <img width="309" alt="Screenshot 2023-03-19 at 1 05 49 PM" src="https://user-images.githubusercontent.com/32754868/226206458-e3f0111b-6a97-4d75-8125-48455aa2cf43.png"> Last one: <img width="815" alt="Screenshot 2023-03-19 at 1 39 23 PM" src="https://user-images.githubusercontent.com/32754868/226207687-20bd014f-9e0e-4c01-b2c8-190b7365aa70.png"> If you use the codelldb extension be sure to add: `"lldb.launch.initCommands": ["command source ${env:HOME}/.lldbinit"]` To your setttings .json Pull Request resolved: https://github.com/pytorch/pytorch/pull/97101 Approved by: https://github.com/ngimel
98 lines
3.4 KiB
Python
98 lines
3.4 KiB
Python
from typing import Any
|
|
|
|
import lldb # type: ignore[import]
|
|
|
|
|
|
def get_target() -> Any:
|
|
target = lldb.debugger.GetSelectedTarget()
|
|
if not target:
|
|
print("[-] error: no target available. please add a target to lldb.")
|
|
return None
|
|
return target
|
|
|
|
|
|
class DisableBreakpoints:
|
|
"""
|
|
Context-manager to temporarily disable all lldb breakpoints, useful if
|
|
there is a risk to hit one during the evaluation of one of our custom
|
|
commands
|
|
"""
|
|
|
|
def __enter__(self) -> None:
|
|
target = get_target()
|
|
|
|
if target.DisableAllBreakpoints() is False:
|
|
print("[-] error: failed to disable all breakpoints.")
|
|
|
|
def __exit__(self, etype: Any, evalue: Any, tb: Any) -> None:
|
|
target = get_target()
|
|
|
|
if target.EnableAllBreakpoints() is False:
|
|
print("[-] error: failed to enable all breakpoints.")
|
|
|
|
|
|
def IntArrayRef_summary(valobj: Any, internal_dict: Any, options: Any) -> str:
|
|
"""Print human readable representation of c10::IntArrayRef"""
|
|
with DisableBreakpoints():
|
|
target = get_target()
|
|
tensor = valobj.GetName()
|
|
result = target.EvaluateExpression(
|
|
f"torch::gdb::int_array_ref_string({tensor})"
|
|
)
|
|
str_result = str(result)
|
|
str_result = str_result[str_result.find('"') + 1 : -1]
|
|
return str_result
|
|
|
|
|
|
def DispatchKeyset_summary(valobj: Any, internal_dict: Any, options: Any) -> str:
|
|
"""Print human readable representation of c10::DispatchKeyset"""
|
|
with DisableBreakpoints():
|
|
target = get_target()
|
|
keyset = valobj.GetName()
|
|
result = target.EvaluateExpression(
|
|
f"torch::gdb::dispatch_keyset_string({keyset})"
|
|
)
|
|
str_result = str(result)
|
|
str_result = str_result[str_result.find('"') + 1 : -1]
|
|
return str_result
|
|
|
|
|
|
def Tensor_summary(valobj: Any, internal_dict: Any, options: Any) -> str:
|
|
"""Print a human readable representation of the given at::Tensor.
|
|
|
|
at::Tensor instances do not have a C++ implementation of a repr method: in
|
|
pytorch, this is done by pure-Python code. As such, print <tensor>
|
|
internally creates a Python wrapper for the given tensor and call repr()
|
|
on it.
|
|
Usage:
|
|
print self
|
|
"""
|
|
with DisableBreakpoints():
|
|
target = get_target()
|
|
tensor = valobj.GetName()
|
|
result = target.EvaluateExpression(f"torch::gdb::tensor_repr({tensor})")
|
|
str_result = str(result)
|
|
target.EvaluateExpression(f"(void)free({result.GetValue()})")
|
|
str_result = "\n" + str_result[str_result.find("tensor") : -1]
|
|
return str_result
|
|
|
|
|
|
# And the initialization code to add your commands
|
|
def __lldb_init_module(debugger: Any, internal_dict: Any) -> Any:
|
|
debugger.HandleCommand(
|
|
"type summary add c10::IntArrayRef -F pytorch_lldb.IntArrayRef_summary -w torch"
|
|
)
|
|
debugger.HandleCommand(
|
|
"type summary add c10::DispatchKeySet -F pytorch_lldb.DispatchKeyset_summary -w torch"
|
|
)
|
|
debugger.HandleCommand(
|
|
"type summary add at::Tensor -F pytorch_lldb.Tensor_summary -w torch"
|
|
)
|
|
print(
|
|
"Pretty Printing lldb summary for PyTorch AT types has been installed and is ready for use. "
|
|
"This category is enabled by default. To disable run: `type category disable torch`"
|
|
)
|
|
print(
|
|
"Usage:\n\tprint <at::tensor>\n\tprint <c10::IntArrayRef>\n\tprint <c10::DispatchKeySet>"
|
|
)
|