python — gdb PrettyPrinter Плагин подпрограммы Сбой StdStringPrinter при работе с std :: basic_string & lt; wchar_t (,. *)? & gt; $

Я анализировал аварийный дамп, где я реализовал плагин Python pretty-printer («/usr/share/gdb/python/libstdcxx/v6/printers.py») произошел сбой в следующей строке

return self.val['_M_dataplus']['_M_p'].string (encoding, length = len)
LookupError: unknown encoding: UCS-4

как показано ниже

#22 0x00002b25639bb01b in Function(PTR *, const ._210::wstring &, const ._210::wstring &, const ._210::wstring &, bool) (
pPjmDefn=0x2aaab7409e70, pszRepositoryName=
Traceback (most recent call last):
File "/usr/share/gdb/python/libstdcxx/v6/printers.py", line 469, in to_string
return self.val['_M_dataplus']['_M_p'].string (encoding, length = len)
LookupError: unknown encoding: UCS-4

Я начал анализировать Кодекс

class StdStringPrinter:
"Print a std::basic_string of some kind"
def __init__(self, encoding, val):
self.encoding = encoding
self.val = val

def to_string(self):
# Look up the target encoding as late as possible.
encoding = self.encoding
if encoding == 0:
encoding = gdb.parameter('target-charset')
elif encoding == 1:
encoding = gdb.parameter('target-wide-charset')

# Make sure &string works, too.
type = self.val.type
if type.code == gdb.TYPE_CODE_REF:
type = type.target ()

# Calculate the length of the string so that to_string returns
# the string according to length, not according to first null
# encountered.
ptr = self.val ['_M_dataplus']['_M_p']
realtype = type.unqualified ().strip_typedefs ()
reptype = gdb.lookup_type (str (realtype) + '::_Rep').pointer ()
header = ptr.cast(reptype) - 1
len = header.dereference ()['_M_length']
return self.val['_M_dataplus']['_M_p'].string (encoding, length = len)

и понял, что есть вызов gdb.parameter с параметрами ['gdb.parameter', 'gdb.parameter'] который возвращается

(gdb) python print gdb.parameter('target-wide-charset')
UCS-4
(gdb) python print gdb.parameter('target-charset')
ANSI_X3.4-1968

Кодировка передается self.val['_M_dataplus']['_M_p'].string (encoding, length = len) и мое лучшее предположение, это называет str.encode или же unicode.encodeно ни один из них кажется, поддерживает UCS-4,

>>> u'data'.encode('UCS-4')

Traceback (most recent call last):
File "<pyshell#529>", line 1, in <module>
u'data'.encode('UCS-4')
LookupError: unknown encoding: UCS-4

Я сильно чувствую, что это ошибка, какая-то подсказка или идея?

2

Решение

Это зависит от того, как был построен ваш Python. Вы можете сделать это из GDB, чтобы узнать:

python import sys
python print sys.maxunicode

Я не видел этого раньше; Я предполагаю, что большинство дистрибутивов собираются с поддержкой UCS-4.

Стоит также рассмотреть, что такое wchar_t в вашей системе. Возможно, UCS-4 и там не прав. Вы можете использовать «set target-wide-charset», чтобы изменить это в GDB. IIRC обычно GDB не может угадать правильное значение.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]