Formatter for std::shared_ptr<std::wstring>

Hello,

I am looking to write data formatter for std::shared_ptrstd::wstring.

I found the following old article but this doesn’t seem to work.
I have ver 159 installed.
http://lists.cs.uiuc.edu/pipermail/lldb-dev/2012-February/000825.html

Any idea?

Thank you much,
PA

Hi Alexander,

I've written the wstring printer and it works for me when printing the pointer and not the shared_ptr.

boost::shared_ptr<std::wstring> pString;

print pString <-- prints informations about the shared_ptr
print pString.px <-- prints the string pointet at

Cheers,
Nino

Oh,

I've seen, that the script attached to the mail is not on the server, so I attached it again, although it would be better to have it in the lldb svn.

Yust copy the script to your hom directory and ad the folowing line to your .lldbinit

script sys.path[:0] = [os.path.expanduser('~')]
command alias pwd script print os.getcwd()
script import wstring
type summary add --python-function wstring.wstring_summary "std::wstring"
type summary add --python-function wstring.wstring_summary "std::basic_string<int, class std::char_traits<int>, class std::allocator<int> >"
type summary add --python-function wstring.wstring_summary "std::basic_string<unsigned short, class std::char_traits<unsigned

, class std::allocator<unsigned short> >"

type summary add --python-function wstring.wstring_summary "std::basic_string<wchar_t, class std::char_traits<wchar_t>, class std::allocator<wchar_t> >"

Cheers, Nino

wstring.py (881 Bytes)

I am using Mac OS X Version 10.7.4
The following is the lldb output:

(lldb) frame variable x

(std::__1::wstring) x = {

_r = {

std::__1::__libcpp_compressed_pair_imp<std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__rep, std::__1::allocator<wchar_t> > = {

_first = {

= {

__l = {

_cap = 17

_size = 12

_data = 0x00000001001009c0

}

__s = {

= {

_size = ‘\x11’

_ = \x11\0\0\0

}

_data = {

[0] = \0\0\0\0

[1] = \f\0\0\0

[2] = \0\0\0\0

[3] = \xc0\t\x10\0

[4] = \x01\0\0\0

}

}

__r = {

__words = {

[0] = 17

[1] = 12

[2] = 4296018368

}

}

}

}

}

}

}

(lldb)

Thanks,
PA

Hi Alexander,

your string implementation looks very complicated.

Also the type of the string looks strange. I would expect that "std::wstring" is a typedef
for "std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>"

You are using "std::__1::wstring" and the real type also contains this "__1" stuff
"std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t>>"
and it is additionally wrapped by a std::pair or sth similar.

I've never seen this before. Maybe somebody else in the mailing list did?!

So the wstring.py data formater works only for std::wstring with a "_M_dataplus" and a "_M_p" member

Cheers,
Nino

Alexander is using libcpp, part of the LLVM project, whereas you are using libstdcpp (a GNU project).
They both implement the C++ Standard Library but with different internals!
Luckily they are easy to differentiate because libcpp classes lived in a std::__1 namespace

Enrico Granata
:email: egranata@.com
✆ (408) 972-7683

Hi,

I got it working.
I follow example from the following to navigate and Nino’s script to read the char.
http://llvm.org/svn/llvm-project/lldb/trunk/examples/synthetic/libcxx.py

I can post the script if needed.

thanks,
PA

Alexander,
feel free to share your script if you desire.
I can work on integrating it into mainline LLDB.

Thanks!

Enrico Granata
:email: egranata@.com
✆ (408) 972-7683

Attached.
But this doesn’t work with global variables and I haven’t had chance to look at it.

formatter.bin (3.46 KB)

If you are using GetPointeeData() it is a known bug in LLDB, which was resolved in r 161384

If that does not fix the issue, please do let us know with a reproduction case :slight_smile:

Enrico Granata
:email: egranata@.com
✆ (408) 972-7683