If you will ever have to go through the hell of debugging Qt-applications, you might face the problem of printing the contents of QString objects. If you call print on a QString object in gdb, the output will most probably look like the following:
{static null = {<No data fields>}, static shared_null = {ref = {_q_value = 1}, alloc = 0, size = 0, data = 0x80e6d0a, clean = 0, simpletext = 0, righttoleft = 0, asciiCache = 0, capacity = 0, reserved = 0, array = {0}}, static shared_empty = {ref = {_q_value = 2}, alloc = 0, size = 0, data = 0xb734deb2, clean = 0, simpletext = 0, righttoleft = 0, asciiCache = 0, capacity = 0, reserved = 0, array = {0}}, d = 0x8105138, static codecForCStrings = 0x0} |
This is (in most cases) not quite what we want to know about our QString object. Fortunately, GDB can interpret certain routines, so that we can implement a function that prints QStrings. These routines are stored in GDB’s init-file ~/.gdbinit. Unfortunately, the internal data representation of a string has changed in Qt4, such that we most certainly need two versions of the desired function. I will call the functions qprint3 and qprint4, respectively.
Qt3 Version
The Qt3 version was originally posted by David Faure to the KDE maillist in 2001:
define qprint3 set $i=0 while $i < $arg0.d->len print $arg0.d->unicode[$i++].cl end end |
Qt4 Version
define qprint4 printf "(QString)0x%x (length=%i): \"",&$arg0,$arg0.d->size set $i=0 while $i < $arg0.d->size set $c=$arg0.d->data[$i++] if $c < 32 || $c > 127 printf "\\u0x%04x", $c else printf "%c", (char)$c end end printf "\"\n" end |
Further reading
The KDE source repository has some further pretty neat GDB macros.