Как избежать звездочки в библиотеке, связанной с Python?

Я работаю с PYKD, библиотекой, используемой для написания скриптов Python для Windbg.

Одна из функций, typedVar, кажется, не работает при обработке имен типов, которые содержат звездочку:

(В сеансе Windbg):

.load pykd.pyd // Load PYKD library
!py            // enter an interactive Python session

>>> print typedVar('CMap<unsigned long,unsigned long,int,int>', 0x02d729dc).m_nCount
Int4B at 0x2d729e8 Value: 0x4 (4)
=> ok!
>>> print typedVar('CMap<int,int,ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >,ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > > >', 0x02ca2568).m_nCount
Int4B at 0x2ca2574 Value: 0x7 (7)
=> ok!

>>> print typedVar('CMap<int,int,void *,void *>', 0x0054ac10).m_nCount
Traceback (most recent call last):
  File "<console>", line 1, in <module>
TypeException: CMap<int,int,void *,void *> : invalid type name
=> NOK (most probably because of the asterisk)

Я полагаю, что это вызвано звездочкой, интерпретируемой как подстановочный знак, поэтому я хотел бы использовать escape-символ, чтобы использовать звездочку как "нормальный" символ, но это не так просто:

Использование обратной косой черты:

>>> print typedVar('CMap<int,int,void \*,void \*>', 0x0054ac10).m_nCount
Traceback (most recent call last):
  File "<console>", line 1, in <module>
TypeException: CMap<int,int,void \*,void \*> : invalid type name

Удвоение звездочки:

>>> print typedVar('CMap<int,int,void **,void **>', 0x0054ac10).m_nCount
Traceback (most recent call last):
  File "<console>", line 1, in <module>
TypeException: CMap<int,int,void **,void **> : invalid type name

Кто-нибудь знает escape-символ для регулярных выражений в Python (в случае, если это не обратный слеш или удвоение символа)?

заранее спасибо

О, прежде чем я забуду: упомянутый тип присутствует в символах приложения, как вы можете видеть здесь:

for tp in app.enumTypes("*CMap<*"):
  print tp
...
CMap<int,int,void *,void *>
...

** Редактировать после первого комментария и ответа **

Это команды, которые я использовал (с r и u):

>>> print typedVar(r'CMap<int,int,void *,void *>', 0x0054ac10).m_nCount
>>> print typedVar(u'CMap<int,int,void *,void *>', 0x0054ac10).m_nCount
>>> print typedVar(rr'CMap<int,int,void *,void *>', 0x0054ac10).m_nCount
>>> print typedVar(r'''CMap<int,int,void *,void *>''', 0x0054ac10).m_nCount
>>> print typedVar(r''CMap<int,int,void *,void *>'', 0x0054ac10).m_nCount
>>> print typedVar(ru'CMap<int,int,void *,void *>', 0x0054ac10).m_nCount
>>> print typedVar(ru'CMap<int,int,void *,void *>', 0x0054ac10).m_nCount

3 ответа

Решение

Это ошибка pykd: https://githomelab.ru/pykd/pykd/issues/33

Это будет исправлено в следующем выпуске

typedVar не прерывает имя типа. Вы должны использовать то же имя типа, которое содержится в информации о символах.

Попробуйте найти его с помощью команды dt:

dt CMap*

Или с pykd:

print( "\n".join( module('ModuleName').enumTypes('CMap*') )

Я считаю, что это будет выглядеть как "CMap" (без пробела)

Попробуйте распечатать информацию о типе:

>>>print( typeInfo('Application!CMap<unsigned int,unsigned int,_RTL_CRITICAL_SECTION,_RTL_CRITICAL_SECTION *>') )

Невозможно прокомментировать, но вы можете попробовать r'string', что объясняется здесь
Что именно делают строковые флаги "u" и "r" и что такое необработанные строковые литералы?

Или, если вы можете, поменяйте указатель на любой беззнаковый 64-битный тип данных.

Другие вопросы по тегам