Resending without attachments…. > On Jul 14, 2021, at 10:15 PM, Andrew Fish <af...@apple.com> wrote: > > I’ve been watching the Le Tour replays and playing around with gdb scripts. I > was trying to figure out how to do stuff I know how to do in lldb. > > For lldb I have Pretty Printer and for CHAR16 things like this: > > CHAR16 gChar = L'X'; > CHAR16 gStr[] = L"1234567890\x23f3"; > CHAR16 *gStrPtr = gStr; > > For lldb I get: > L’X’ > L”1234567890⏳” > (CHAR16 *)L”1234567890⏳” > > The default for gdb is: > (gdb) p /r gChar > $8 = 88 > (gdb) p /r gStr > $9 = {49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 9203, 0} > (gdb) p /r gStrPtr > $10 = (CHAR16 *) 0x100008030 <gStr> > > I’ve figured out how to teach GDB to pretty print CHAR16, but I can’t figure > out how to hook CHAR16 * or CHAR16 {}? > > This is what I’ve got (vs what gdb does for char): > $1 = 88 'X' > $2 = L'X' > > $3 = "1234567890" > $4 = {L'1', L'2', L'3', L'4', L'5', L'6', L'7', L'8', L'9', L'0', L'⏳', > L'\x00'} > > $5 = 0x100008058 <Str> "1234567890" > $6 = (CHAR16 *) 0x100008030 <gStr> > > This is the script... > $ cat CHAR16.py > import gdb > > from gdb.printing import register_pretty_printer > from gdb.printing import RegexpCollectionPrettyPrinter > > > class CHAR16_PrettyPrinter(object): > > def __init__(self, val): > self.val = val > > def to_string(self): > if int(self.val) < 0x20: > return f"L'\\x{int(self.val):02x}'" > else: > return f"L'{chr(self.val):s}'" > > > def build_pretty_printer(): > pp = RegexpCollectionPrettyPrinter("EFI") > pp.add_printer('CHAR16', '^CHAR16$', CHAR16_PrettyPrinter) > return pp > > > register_pretty_printer(None, build_pretty_printer(), replace=True) > > $ cat CHAR16.c > #include <stdio.h> > > /// > /// 2-byte Character. Unless otherwise specified all strings are stored in > the > /// UTF-16 encoding format as defined by Unicode 2.1 and ISO/IEC 10646 > standards. > /// > typedef unsigned short CHAR16; > > CHAR16 gChar = L'X'; > CHAR16 gChar2 = L'\x23f3'; > CHAR16 gStr[] = L"1234567890\x23f3"; > CHAR16 *gStrPtr = gStr; > > char Char = 'X'; > char Str[] = "1234567890"; > char *StrPtr = Str; > > int > main(int argc, char **argv) > { > printf ("hello world!\n"); > return 0; > } > > $ cat CHAR16.sh > gcc -fshort-wchar -g CHAR16.c > gdb -ex "source CHAR16.py" -ex "p Char" -ex "p gChar" -ex "shell echo ' '" > -ex "p Str" -ex "p gStr" -ex "shell echo ' '" -ex "p StrPtr" -ex "p gStrPtr” > > Given the above example you should be able to experiment with just the code > in this email to figure out how to get CHAR16 working. No edk2 or EFI > knowledge required, in case you have a friend who is good with gdb pretty > print? > > If you have CHAR16.sh, CHAR16.c, and CHAR16.py you can just run ./CHAR16.sh > and it will print out the results for char and CHAR16 if you modify the > CHAR16.py gdb Python script it will show you the results. > > Thanks, > > Andrew Fish > > > <CHAR16.py> > <CHAR16.c> > <CHAR16.sh> >
-=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#77817): https://edk2.groups.io/g/devel/message/77817 Mute This Topic: https://groups.io/mt/84219086/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-