簡體   English   中英

如何在與Python相關的庫中轉義星號?

[英]How to escape an asterisk in a Python related library?

我正在使用PYKD(一個用於為Windbg編寫Python腳本)的庫。

當處理包含星號的類型名稱時,函數之一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)

我相信這是由星號引起的,被解釋為通配符,因此我想使用轉義字符,以便將星號用作“正常”字符,但這似乎不是那么簡單:

使用反斜杠:

>>> 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

是否有人知道Python中正則表達式的轉義字符(如果它不是反斜杠或加倍的字符)?

提前致謝

哦,在我忘記之前:所提到的類型出現在應用程序的符號中,如您在此處看到的:

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

在第一個評論后回復並編輯

這些是我使用的命令(帶有ru ):

>>> 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

進一步使用最新的PYKD庫后進行編輯

不幸的是,仍然存在一個問題,如以下摘錄所示:

0:000> .load pykd.pyd
0:000> .chain
Extension DLL search Path:
    ...
Extension DLL chain:
    pykd.pyd: image 0.3.4.2, API 1.0.0, built Sat Nov 17 13:06:54 2018
        [path: C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\winext\pykd.pyd]
    ...
0:000> !py

  >>> dprintln("%d" % typedVar('Application!CMap<ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >,wchar_t const *,unsigned int,unsigned int>', 0x064ad440).m_nCount)
  2
  => An asterisk in the type name can sometimes be handled
  >>> dprintln("%d" % typedVar('Application!CMap<unsigned int,unsigned int,_RTL_CRITICAL_SECTION *,_RTL_CRITICAL_SECTION *>', 0x064ad328).m_nCount)
  Traceback (most recent call last):
    File "<console>", line 1, in <module>
  AttributeError: typed var has no field 'm_nCount'
  => But sometimes there still are issues.
     The error message clearly shows that the typename is known.

這里可能是什么問題? 我可以做些什么來添加更詳細的調試信息嗎?

根據ussrhero的新提案進行編輯

typeInfo似乎為空:

>>> print(typeInfo('Application!CMap<unsigned int,unsigned int,_RTL_CRITICAL_SECTION *,_RTL_CRITICAL_SECTION *>'))
class/struct : CMap<unsigned int,unsigned int,_RTL_CRITICAL_SECTION *,_RTL_CRITICAL_SECTION *> Size: 0x0 (0)

這里是另一個與CMap相關的typeInfo,以供參考:

>>> print(typeInfo('Application!CMap<ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >,wchar_t const *,unsigned int,unsigned int>'))
class/struct : CMap<ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >,wchar_t const *,unsigned int,unsigned int> Size: 0x1c (28)
   +0000 __VFN_table             : VTable*
   =0000000000 classCObject      : CRuntimeClass
   +0004 m_pHashTable            : CMap<ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >,wchar_t const *,unsigned int,unsigned int>::CAssoc**
   +0008 m_nHashTableSize        : UInt4B
   +000c m_nCount                : Int4B
   +0010 m_pFreeList             : CMap<ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >,wchar_t const *,unsigned int,unsigned int>::CAssoc*
   +0014 m_pBlocks               : CPlex*
   +0018 m_nBlockSize            : Int4B

這里是不存在的類的typeInfo(也出於參考原因):

>>> print(typeInfo('Application!NonExisting_Class'))
Traceback (most recent call last):
  File "<console>", line 1, in <module>
SymbolException: 'NonExisting_Class' - symbol not found

=>因此,給出問題的類是已知的,但顯然無法處理。

從ussrhero更新后進行編輯:

dtdx似乎提到其他CMap一切正常:

0:000> dt 0x064ad440 CMap<ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >,wchar_t const *,unsigned int,unsigned int>
Application!CMap<ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >,wchar_t const *,unsigned int,unsigned int>
   +0x000 __VFN_table : 0x01503444 
   +0x004 m_pHashTable     : 0x06ab9ad0  -> (null) 
   +0x008 m_nHashTableSize : 0x186ab
   +0x00c m_nCount         : 0n2
   +0x010 m_pFreeList      : 0x063c953c CMap<ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >,wchar_t const *,unsigned int,unsigned int>::CAssoc
   +0x014 m_pBlocks        : 0x063c9518 CPlex
   +0x018 m_nBlockSize     : 0n10
0:000> dt 0x064ad440 CMap<ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >,wchar_t const *,unsigned int,unsigned int> m_nCount
Application!CMap<ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >,wchar_t const *,unsigned int,unsigned int>
   +0x00c m_nCount : 0n2
0:000> dx (CMap<ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >,wchar_t const *,unsigned int,unsigned int>*) 0x064ad440
(CMap<ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >,wchar_t const *,unsigned int,unsigned int>*) 0x064ad440                 : 0x64ad440 [Type: CMap<ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >,wchar_t const *,unsigned int,unsigned int> *]
    [+0x004] m_pHashTable     : 0x6ab9ad0 [Type: CMap<ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >,wchar_t const *,unsigned int,unsigned int>::CAssoc * *]
    [+0x008] m_nHashTableSize : 0x186ab [Type: unsigned int]
    [+0x00c] m_nCount         : 2 [Type: int]
    [+0x010] m_pFreeList      : 0x63c953c [Type: CMap<ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >,wchar_t const *,unsigned int,unsigned int>::CAssoc *]
    [+0x014] m_pBlocks        : 0x63c9518 [Type: CPlex *]
    [+0x018] m_nBlockSize     : 10 [Type: int]

dtdx似乎提到該特定CMap存在問題:

0:000> dt 0x064ad328 CMap<unsigned int,unsigned int,_RTL_CRITICAL_SECTION *,_RTL_CRITICAL_SECTION *>
Application!CMap<unsigned int,unsigned int,_RTL_CRITICAL_SECTION *,_RTL_CRITICAL_SECTION *>
0:000> dt 0x064ad328 CMap<unsigned int,unsigned int,_RTL_CRITICAL_SECTION *,_RTL_CRITICAL_SECTION *> m_nCount
Application!CMap<unsigned int,unsigned int,_RTL_CRITICAL_SECTION *,_RTL_CRITICAL_SECTION *>
0:000> dx (CMap<unsigned int,unsigned int,_RTL_CRITICAL_SECTION *,_RTL_CRITICAL_SECTION *>*) 0x064ad328
Error: Unable to find type 'CMap<unsigned int,unsigned int,_RTL_CRITICAL_SECTION *,_RTL_CRITICAL_SECTION *> *' for cast.

但是,這些符號似乎沒有問題:

0:000> x /2 Application!CMap<*vftable*
...
0152e944          Application!CMap<unsigned int,unsigned int,_RTL_CRITICAL_SECTION *,_RTL_CRITICAL_SECTION *>::`vftable'
...
01503444          Application!CMap<ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >,wchar_t const *,unsigned int,unsigned int>::`vftable'

顯然,我們在這里處理了Windbg問題。 我們如何找出這是已知的Windbg問題還是新的問題? 這些問題在哪里收集? (有關您的信息,我正在使用Windows 10版本1803(操作系統內部版本17134.345)的Windbg 10.0.16299.15 X86,但Windbg Preview似乎也有此錯誤。

這是一個pykd錯誤: https ://githomelab.ru/pykd/pykd/issues/33

下一個版本將修復

嘗試打印出類型信息:

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

無法發表評論,但您可以嘗試在此處說明的“字符串”
“ u”和“ r”字符串標志的作用是什么,什么是原始字符串文字?

或者,如果可以,則將指針交換為任何無符號的64位數據類型。

typedVar不干擾類型名稱。 您必須使用與符號信息中包含的相同的類型名稱。

嘗試使用dt命令找到它:

dt CMap*

或使用pykd:

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

我相信它將看起來像'CMap <int,int,void *,void *>'(沒有任何空格)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM