<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div>On Oct 7, 2013, at 5:19 PM, Jean-Yves Avenard <<a href="mailto:jyavenard@gmail.com">jyavenard@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">Hello<br><br>Thanks for answering!... very much appreciated<br><br>Thanks for the heads up... I'll have a look.<br><br>I already got QString to be displayed properly by changing the summary<br>format with:<br>{(const char *)$VAR.toUtf8().constData()}:s<br><br>not sure if you're familiar with xcode summary format, but that may be<br>an easier approach than messing with python scripts. Is there a way to<br>do loops in there (so I could display the content of loop and map<br>container)..<br><br></blockquote><div apple-content-edited="true"><div style="orphans: auto; text-align: start; text-indent: 0px; widows: auto; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div style="orphans: auto; text-align: start; text-indent: 0px; widows: auto; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div style="color: rgb(0, 0, 0); letter-spacing: normal; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; orphans: 2; widows: 2; border-collapse: separate; border-spacing: 0px;"><span style="font-size: 12px; orphans: auto; widows: auto;"><br></span></div><div style="color: rgb(0, 0, 0); letter-spacing: normal; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; orphans: auto; widows: auto; border-collapse: separate; border-spacing: 0px;">Python is not all that complicated :)</div><div style="color: rgb(0, 0, 0); letter-spacing: normal; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; orphans: auto; widows: auto; border-collapse: separate; border-spacing: 0px;">Here’s an example script that does formatting for arbitrary (pointer,length) pairs.</div><div style="color: rgb(0, 0, 0); letter-spacing: normal; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; orphans: auto; widows: auto; border-collapse: separate; border-spacing: 0px;"><br></div><div style="color: rgb(0, 0, 0); letter-spacing: normal; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; orphans: auto; widows: auto; border-collapse: separate; border-spacing: 0px;">Since I was lazy I just decided my string type was going to be a std::pair<CharType*,LengthType> as in:</div><div style="orphans: auto; widows: auto; border-collapse: separate; border-spacing: 0px;"><div style="border-collapse: separate; border-spacing: 0px;"><br></div><div style="border-collapse: separate; border-spacing: 0px;"><span class="Apple-tab-span" style="white-space: pre;">  </span>std::pair<const char *,unsigned long> Sutf8 {utf8_buf,utf8_size};</div><div style="border-collapse: separate; border-spacing: 0px;"><span class="Apple-tab-span" style="white-space:pre">    </span>std::pair<const char16_t *,unsigned long> Sutf16 {utf16_buf,utf16_size};</div><div style="border-collapse: separate; border-spacing: 0px;"><span class="Apple-tab-span" style="white-space:pre">     </span>std::pair<const char32_t *,unsigned long> Sutf32 {utf32_buf,utf32_size};</div><div style="color: rgb(0, 0, 0); letter-spacing: normal; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;">It should be easy to adjust the scripts to any type that exposes the same information through different member variable names.</div><div style="color: rgb(0, 0, 0); letter-spacing: normal; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><br></div><div><div><font face="Courier New">import lldb</font></div><div><font face="Courier New">def utf8_summary(value,unused):</font></div><div><font face="Courier New"><span class="Apple-tab-span" style="white-space:pre">       </span>pointer = value.GetChildMemberWithName("first").GetValueAsUnsigned(0)</font></div><div><font face="Courier New"><span class="Apple-tab-span" style="white-space:pre">        </span>length = value.GetChildMemberWithName("second").GetValueAsUnsigned(0)</font></div><div><font face="Courier New"><span class="Apple-tab-span" style="white-space:pre">        </span>if pointer == 0:</font></div><div><font face="Courier New"><span class="Apple-tab-span" style="white-space:pre">               </span>return False</font></div><div><font face="Courier New"><span class="Apple-tab-span" style="white-space:pre">   </span>if length == 0:</font></div><div><font face="Courier New"><span class="Apple-tab-span" style="white-space:pre">                </span>return '""'</font></div><div><font face="Courier New"><span class="Apple-tab-span" style="white-space:pre">  </span>error = lldb.SBError()</font></div><div><font face="Courier New"><span class="Apple-tab-span" style="white-space:pre"> </span>string_data = value.process.ReadMemory(pointer, length, error)</font></div><div><font face="Courier New"><span class="Apple-tab-span" style="white-space:pre"> </span>return '"%s"' % (string_data) # utf8 is safe to emit as-is on OSX</font></div><div><font face="Courier New"><br></font></div><div><font face="Courier New">def utf16_summary(value,unused):</font></div><div><font face="Courier New"><span class="Apple-tab-span" style="white-space:pre">        </span>pointer = value.GetChildMemberWithName("first").GetValueAsUnsigned(0)</font></div><div><font face="Courier New"><span class="Apple-tab-span" style="white-space:pre">        </span>length = value.GetChildMemberWithName("second").GetValueAsUnsigned(0)</font></div><div><font face="Courier New"><span class="Apple-tab-span" style="white-space:pre">        </span># assume length is in bytes - if in UTF16 chars, just multiply by 2</font></div><div><font face="Courier New"><span class="Apple-tab-span" style="white-space:pre">    </span>if pointer == 0:</font></div><div><font face="Courier New"><span class="Apple-tab-span" style="white-space:pre">               </span>return False</font></div><div><font face="Courier New"><span class="Apple-tab-span" style="white-space:pre">   </span>if length == 0:</font></div><div><font face="Courier New"><span class="Apple-tab-span" style="white-space:pre">                </span>return '""'</font></div><div><font face="Courier New"><span class="Apple-tab-span" style="white-space:pre">  </span>error = lldb.SBError()</font></div><div><font face="Courier New"><span class="Apple-tab-span" style="white-space:pre"> </span>string_data = value.process.ReadMemory(pointer, length, error)</font></div><div><font face="Courier New"><span class="Apple-tab-span" style="white-space:pre"> </span>return '"%s"' % (string_data.decode('utf-16').encode('utf-8')) # utf8 is safe to emit as-is on OSX</font></div><div><font face="Courier New"><br></font></div><div><font face="Courier New">def utf32_summary(value,unused):</font></div><div><font face="Courier New"><span class="Apple-tab-span" style="white-space:pre">       </span>pointer = value.GetChildMemberWithName("first").GetValueAsUnsigned(0)</font></div><div><font face="Courier New"><span class="Apple-tab-span" style="white-space:pre">        </span>length = value.GetChildMemberWithName("second").GetValueAsUnsigned(0)</font></div><div><font face="Courier New"><span class="Apple-tab-span" style="white-space:pre">        </span># assume length is in bytes - if in UTF32 chars, just multiply by 4</font></div><div><font face="Courier New"><span class="Apple-tab-span" style="white-space:pre">    </span>if pointer == 0:</font></div><div><font face="Courier New"><span class="Apple-tab-span" style="white-space:pre">               </span>return False</font></div><div><font face="Courier New"><span class="Apple-tab-span" style="white-space:pre">   </span>if length == 0:</font></div><div><font face="Courier New"><span class="Apple-tab-span" style="white-space:pre">                </span>return '""'</font></div><div><font face="Courier New"><span class="Apple-tab-span" style="white-space:pre">  </span>error = lldb.SBError()</font></div><div><font face="Courier New"><span class="Apple-tab-span" style="white-space:pre"> </span>string_data = value.process.ReadMemory(pointer, length, error)</font></div><div><font face="Courier New"><span class="Apple-tab-span" style="white-space:pre"> </span>return '"%s"' % (string_data.decode('utf-32').encode('utf-8')) # utf8 is safe to emit as-is on OSX</font></div><div><font face="Courier New"><br></font></div><div><font face="Courier New">def __lldb_init_module(debugger,*args):</font></div><div><font face="Courier New"><span class="Apple-tab-span" style="white-space:pre">        </span>debugger.HandleCommand('type summary add --python-function utf81632.utf8_summary "std::__1::pair<const char *, unsigned long>"')</font></div><div><font face="Courier New"><span class="Apple-tab-span" style="white-space:pre">       </span>debugger.HandleCommand('type summary add --python-function utf81632.utf16_summary "std::__1::pair<const char16_t *, unsigned long>"')</font></div><div><font face="Courier New"><span class="Apple-tab-span" style="white-space:pre">  </span>debugger.HandleCommand('type summary add --python-function utf81632.utf32_summary "std::__1::pair<const char32_t *, unsigned long>"')</font></div><div style="color: rgb(0, 0, 0); letter-spacing: normal; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><br></div></div></div><div style="color: rgb(0, 0, 0); letter-spacing: normal; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; orphans: 2; widows: 2; border-collapse: separate; border-spacing: 0px;"><span style="font-size: 12px; orphans: auto; widows: auto;"><br></span></div><div style="orphans: 2; widows: 2; border-collapse: separate; border-spacing: 0px;"><span style="orphans: auto; widows: auto;">In the “type summary add” part, you will bind the functions to the type name depending on the string encoding in use (8, 16 or 32)</span></div><div style="orphans: 2; widows: 2; border-collapse: separate; border-spacing: 0px;"><span style="orphans: auto; widows: auto;">The functions itself know to use a pointer,length pair to read the correct number of bytes, and do the encoding/decoding that is necessary (on OSX, outputting UTF8 is just safe and will do the right thing, so we are porting any other encoding to UTF8 for display)</span></div><div style="orphans: 2; widows: 2; border-collapse: separate; border-spacing: 0px;"><span style="orphans: auto; widows: auto;">This is what the output looks like:</span></div><div style="orphans: 2; widows: 2; border-collapse: separate; border-spacing: 0px;"><span style="orphans: auto; widows: auto;"><br></span></div><div style="orphans: 2; widows: 2; border-collapse: separate; border-spacing: 0px;"><div style="margin: 0px; font-family: 'Andale Mono'; color: rgb(41, 249, 20); background-color: rgb(0, 0, 0);">(std::__1::pair<const char *, unsigned long>) Sutf8 = "blah blah blah けほ"</div><div style="margin: 0px; font-family: 'Andale Mono'; color: rgb(41, 249, 20); background-color: rgb(0, 0, 0);">(std::__1::pair<const char16_t *, unsigned long>) Sutf16 = "blah blah blah けほ"</div><div style="margin: 0px; font-family: 'Andale Mono'; color: rgb(41, 249, 20); background-color: rgb(0, 0, 0);">(std::__1::pair<const char32_t *, unsigned long>) Sutf32 = "blah blah blah けほ"</div><div><br></div><div>In case you do not know the “bytes per character” for your type, you should simply be asking the pointer’s type for its bye size, and switch on that to pick the right encoding. Or maybe your string type will have a flag telling you the encoding to use. Either way, it all boils down to one of these three functions.</div><div>Feel free to ping back if you have any further questions!</div></div><div style="color: rgb(0, 0, 0); letter-spacing: normal; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; orphans: 2; widows: 2; border-collapse: separate; border-spacing: 0px;"><span style="font-size: 12px; orphans: auto; widows: auto;"><br></span></div><div style="color: rgb(0, 0, 0); letter-spacing: normal; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; orphans: 2; widows: 2; border-collapse: separate; border-spacing: 0px;"><span style="font-size: 12px; orphans: auto; widows: auto;">Enrico Granata</span><br style="font-size: 12px; orphans: auto; widows: auto;"><span style="font-size: 12px; orphans: auto; widows: auto;">📩 egranata@</span><font color="#ff2600" style="font-size: 12px; orphans: auto; widows: auto;"></font><span style="font-size: 12px; orphans: auto; widows: auto;">.com</span><br style="font-size: 12px; orphans: auto; widows: auto;"><span style="font-size: 12px; orphans: auto; widows: auto;">☎️ 27683</span></div></div></div>
</div>
<br><div><div><br></div></div></body></html>