I'm trying to convert Python's gdbinit file to Python 3. One of the things it does is print filenames and function names when displaying stack frames. This worked fine in Python 2 because the type of such objects is PyStringObject which uses NUL-terminated strings under the covers. For example:
set $__fn = (char *)((PyStringObject *)co->co_filename)->ob_sval In Python 3 co->co_filename is a PyUnicodeObject pointer with the raw data encoded as either UCS2 or UCS4. This presents problems when displaying strings: (gdb) set $__f = (PyUnicodeObject *)(co->co_filename) (gdb) p *$__f->s...@$__f->length $14 = {47, 85, 115, 101, 114, 115, 47, 115, 107, 105, 112, 47, 115, 114, 99, 47, 112, 121, 116, 104, 111, 110, 47, 112, 121, 51, 107, 45, 116, 47, 76, 105, 98, 47, 95, 119, 101, 97, 107, 114, 101, 102, 115, 101, 116, 46, 112, 121} (gdb) p *(char *)($__f->str)@$__f->length $15 = "/\000U\000s\000e\000r\000s\000/\000s\000k\000i\000p\000/\000s\000r\000c\000/\000p\000y\000t\000h\000o\000n\000/\000p" (gdb) p *(char *)($__f->str)@($__f->length*2) $16 = "/\000U\000s\000e\000r\000s\000/\000s\000k\000i\000p\000/\000s\000r\000c\000/\000p\000y\000t\000h\000o\000n\000/\000p\000y\0003\000k\000-\000t\000/\000L\000i\000b\000/\000_\000w\000e\000a\000k\000r\000e\000f\000s\000e\000t\000.\000p\000y" I'd like to get rid of those NULs when displaying names. Making it more difficult, I'd like to do it without calling any C API functions. If at all possible the user-defined commands should work even if there is no process available. (e.g., when working with core files). Any suggestions? -- Skip Montanaro - s...@pobox.com - http://smontanaro.dyndns.org/ -- http://mail.python.org/mailman/listinfo/python-list