Skip to content

LLDB script for dumping C++ structs/classes and variables layout in memory

Notifications You must be signed in to change notification settings

spiiin/lldb_dump_class_layout

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 

Repository files navigation

lldb_dump_class_layout

LLDB script for dumping C++ structs/classes and variables layout in memory

Works with Xcode/Android Studio, Visual Studio Code (For Visual Studio Code, use binary from https://github.com/vadimcn/vscode-lldb)

After start lldb, use command: command script import ~/PATH_TO_SCRIPT/dump_class_laouyt.py to install commands layout and layoutvar

Example of usage:

(lldb) layoutvar aaa
std::__1::map<int, int, std::__1::less<int>, SimpleAllocator<std::__1::pair<const int, int> > >
 +0 < 24> std::__1::map<int, int, std::__1::less<int>, SimpleAllocator<std::__1::pair<const int, int> > >
 +0 < 24>   std::__1::map<int, int, std::__1::less<int>, SimpleAllocator<std::__1::pair<const int, int> > >::__base __tree_
 +0 < 8>    std::__1::__tree<std::__1::__value_type<int, int>, std::__1::__map_value_compare<int, std::__1::__value_type<int, int>, std::__1::less<int>, true>, SimpleAllocator<std::__1::__value_type<int, int> > >::__iter_pointer __begin_node_
 +8 < 8>     std::__1::__compressed_pair<std::__1::__tree_end_node<std::__1::__tree_node_base<void *> *>, SimpleAllocator<std::__1::__tree_node<std::__1::__value_type<int, int>, void *> > > __pair1_
 +8 < 8>       std::__1::__compressed_pair_elem<std::__1::__tree_end_node<std::__1::__tree_node_base<void *> *>, 0, false> std::__1::__compressed_pair_elem<std::__1::__tree_end_node<std::__1::__tree_node_base<void *> *>, 0, false>
 +8 < 8>         std::__1::__tree_end_node<std::__1::__tree_node_base<void *> *> __value_
 +8 < 8>          std::__1::__tree_end_node<std::__1::__tree_node_base<void *> *>::pointer __left_
 +8 < 1>       std::__1::__compressed_pair_elem<SimpleAllocator<std::__1::__tree_node<std::__1::__value_type<int, int>, void *> >, 1, true> std::__1::__compressed_pair_elem<SimpleAllocator<std::__1::__tree_node<std::__1::__value_type<int, int>, void *> >, 1, true>
 +8 < 1>         SimpleAllocator<std::__1::__tree_node<std::__1::__value_type<int, int>, void *> > SimpleAllocator<std::__1::__tree_node<std::__1::__value_type<int, int>, void *> >
 +8 < 1>           std::__1::allocator<std::__1::__tree_node<std::__1::__value_type<int, int>, void *> > std::__1::allocator<std::__1::__tree_node<std::__1::__value_type<int, int>, void *> >
 +16 < 8>     std::__1::__compressed_pair<unsigned long, std::__1::__map_value_compare<int, std::__1::__value_type<int, int>, std::__1::less<int>, true> > __pair3_
 +16 < 8>       std::__1::__compressed_pair_elem<unsigned long, 0, false> std::__1::__compressed_pair_elem<unsigned long, 0, false>
 +16 < 8>        unsigned long __value_
 +16 < 1>       std::__1::__compressed_pair_elem<std::__1::__map_value_compare<int, std::__1::__value_type<int, int>, std::__1::less<int>, true>, 1, true> std::__1::__compressed_pair_elem<std::__1::__map_value_compare<int, std::__1::__value_type<int, int>, std::__1::less<int>, true>, 1, true>
 +16 < 1>         std::__1::__map_value_compare<int, std::__1::__value_type<int, int>, std::__1::less<int>, true> std::__1::__map_value_compare<int, std::__1::__value_type<int, int>, std::__1::less<int>, true>
 +16 < 1>           std::__1::less<int> std::__1::less<int>
 +16 < 1>             std::__1::binary_function<int, int, bool> std::__1::binary_function<int, int, bool>
Total byte size: 24
Total pad bytes: 0
(lldb) layout "std::__1::__tree_node<std::__1::__value_type<int, int>, void *>"
 +0 < 40> std::__1::__tree_node<std::__1::__value_type<int, int>, void *>
 +0 < 32>   std::__1::__tree_node_base<void *> std::__1::__tree_node_base<void *>
 +0 < 8>     std::__1::__tree_node_base_types<void *>::__end_node_type std::__1::__tree_node_base_types<void *>::__end_node_type
 +0 < 8>      std::__1::__tree_end_node<std::__1::__tree_node_base<void *> *>::pointer __left_
 +8 < 8>    std::__1::__tree_node_base<void *>::pointer __right_
 +16 < 8>    std::__1::__tree_node_base<void *>::__parent_pointer __parent_
 +24 < 1>    bool __is_black_
 +25 < 3>  <PADDING: 3 bytes>
 +28 < 8>   std::__1::__tree_node<std::__1::__value_type<int, int>, void *>::__node_value_type __value_
 +28 < 8>     std::__1::__value_type<int, int>::value_type __cc
 +28 < 4>      const int first
 +32 < 4>      int second
 +36 < 4>  <PADDING: 4 bytes>
Total byte size: 40
Total pad bytes: 7
Padding percentage: 17.50 %

Issues: Script shows incorrect paddings between virtual ancestors of the object

Additional info (in russian) - https://spiiin.github.io/blog/1170009669/

About

LLDB script for dumping C++ structs/classes and variables layout in memory

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages