Как избежать звездочки в библиотеке, связанной с 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-битный тип данных.