Skip to content

Commit

Permalink
Add GDB pretty printers for evmc_address, evmc_bytes32, evmc_bytes
Browse files Browse the repository at this point in the history
  • Loading branch information
gumb0 committed Sep 20, 2024
1 parent bae4933 commit 7ac92f6
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 0 deletions.
1 change: 1 addition & 0 deletions .gdbinit
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
source -v gdb_pretty_printers.py
56 changes: 56 additions & 0 deletions gdb_pretty_printers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import gdb

class EvmcBytesPrinter:
def __init__(self, val):
self.val = val

def to_string(self):
start = self.val['bytes']
bytes_int = [int(start[i]) for i in range(start.type.range()[1] + 1)]
return "0x" + (''.join(f'{byte:02x}' for byte in bytes_int))

class StdBasicStringUint8Printer:
def __init__(self, val):
self.val = val

def to_string(self):
start = self.val['_M_dataplus']['_M_p']
length = self.val['_M_string_length']
content = [int(start[i]) for i in range(length)]
return '{%s}' % (', '.join(hex(byte) for byte in content))

def register_printers(obj):
if obj == None:
obj = gdb
obj.pretty_printers.insert(0, lookup_function)

def lookup_function(val):
type_str = str(val.type.strip_typedefs())
# print("lookup " + type_str) # uncomment to see exact type requested

address_target_types = [
"evmc::address",
"const evmc::address",
"evmc_address",
"const evmc_address",
"evmc::bytes32",
"const evmc::bytes32",
"evmc_bytes32",
"const evmc_bytes32",
]
if type_str in address_target_types:
return EvmcBytesPrinter(val)

# In CLion these are automatically overwritten by std::* pretty printers.
# Reload this script manually (`source -v ../../gdb_pretty_printers.py`) to activate them again.
bytes_target_types = [
"std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char> >",
"const std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char> >",
]
if type_str in bytes_target_types:
return StdBasicStringUint8Printer(val)

return None

register_printers(gdb.current_objfile())

0 comments on commit 7ac92f6

Please sign in to comment.