NB: This topic is a “wiki page,” which means anyone (not just the author) can edit it. Please add your own tips below.
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.
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
.lldbdirectory in your home directory
- Create a text file in
uuid.pywith 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
~/.lldbinitfile or create a new file named
~/.lldbinitwith the line below
command script import ~/.lldb/uuid.py
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.
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