NB: This topic is a “wiki page,” which means anyone (not just the author) can edit it. Please add your own tips below.
LLDB
Below are some niceties for using lldb with SMTK. There may be equivalents for gdb; if so, please add them to a new top-level section below this one.
Model entity type bits
If you deal with smtk::model::Entity
objects a lot, you’ll notice that the m_entityFlags
member is always a combination of values from smtk/model/EntityTypeBits.h
. The enum values in the header file are hexadecimal and easier to read in a base that is some power of 2. You can have lldb print them in hexadecimal like so:
ty fo add --format hex smtk::model::BitFlags
Adding the line above to your ~/.lldbinit
file will make it the default behavior.
Inspecting UUIDs
If you use lldb, you can have it print UUIDs out compactly instead of the verbose and unhelpful unsigned char array. To do so,
- Create an
.lldb
directory in your home directory
mkdir ~/.lldb
- Create a text file in
~/.lldb
nameduuid.py
with the following contents:
import lldb
def uuid_summary(value, *rest):
"""valobj: an SBValue which you want to provide a summary for
internal_dict: an LLDB support object not to be used"""
rawd = value.GetChildMemberWithName('data')
s = ''.join('%02x'%i for i in rawd.data.uint8)
return 'UUID(' + s[0:8] +'-' + s[8:12] + '-' + s[12:16] + '-' + s[16:20] + '-' + s[20:32] + ')'
def __lldb_init_module(debugger, *rest):
summary = lldb.SBTypeSummary.CreateWithFunctionName('uuid.uuid_summary')
summary.SetOptions(lldb.eTypeOptionHideChildren)
debugger.GetDefaultCategory().AddTypeSummary(lldb.SBTypeNameSpecifier('boost::uuids::uuid', False), summary)
- Either add the line below to your
~/.lldbinit
file or create a new file named~/.lldbinit
with the line below
command script import ~/.lldb/uuid.py
Qt
If you are working with SMTK’s Qt extensions, you may be interested in these Qt5 formatters that let you inspect QString and some of Qt’s container classes.
Shared Pointers
SMTK provides some lldb python functions in utilities/lldb/shared_ptr.py
that allow you to stop execution when a particular object’s shared-pointer use-count changes. You can import these functions into your lldb function by running
command script import /path/to/smtk/utilities/lldb/shared_ptr.py
Then, at a point where you have a pointer to some class that inherits enable_shared_from_this
(like all smtk::resource::PersistentObject and smtk::operation::Operation classes), you can run the following
useCountWatch <scoped class name> <address of class instance>
# e.g.,
# useCountWatch smtk::resource::Resource 0x142f240f0
to break when that object’s use count changes. Once you have a watchpoint on the use-count, there’s also a function to dump a stack trace to a file whenever the use count changes:
useCountTrace <instance address> <filename> [<size of use-count in bytes>]
# e.g.,
# useCountTrace 0x142f240f0 /tmp/trace.txt 4
If calling the useCountWatch
example above created watchpoint 1, then the following will add a script to the watchpoint to dump a stack trace and continue:
wa co add 1
> useCountTrace 0x142f240f0 /tmp/trace.txt
> c
> DONE