Почему я получаю «символ не найден» для найденного символа в Pykd? - PullRequest
0 голосов
/ 11 июня 2018

Я работаю над дампом, который пытаюсь исследовать, используя технологию PYKD.
Результат x /2 *!*``vtable' (только один обратный удар) содержит следующий результат:

745293b8          mfc110u!CPtrList::`vftable'

Однако, когда я пытаюсь получить больше информации об этом классе, я получаю исключение «символ не найден»:
Исходный код Python:

dprintln("name=[%s]" % type_stats.name)
if not type_stats.name in typesize_by_type:
  try:
    type_info = typeInfo(type_stats.name)
  except Exception, e:
    dprintln("text=[%s]" % (str(e)))

Вывод:

name=[mfc110u!CPtrList]
text=['CPtrList' - symbol not found]

Результат команды lm возвращает символы mfc110u, как вы можете видеть здесь:

0:000> lm
start     end        module name
...
744f0000  74930000   mfc110u    (pdb symbols) C:\ProgramData\dbg\sym\mfc110u.i386.pdb\...\mfc110u.i386.pdb
...

Для вашего сведения, я сейчас работаю с последней версией PYKD:

0:000> .chain
Extension DLL search Path:
    ...
Extension DLL chain:
    pykd.pyd: image 0.3.3.4, API 1.0.0, built Mon May 14 11:14:43 2018
        [path: C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\winext\pykd.pyd]

Между тем я нашел очень простой способ воспроизвести проблему без необходимости запуска всего скрипта (используя приглашение Windbg):

0:000> !py
Python 2.7.10 (default, May 23 2015, 09:40:32) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> typeInfo("mfc110u!CPtrList")
Traceback (most recent call last):
  File "<console>", line 1, in <module>
SymbolException: 'CPtrList' - symbol not found

В дополнение к ответу ussrhero, есть следующиедополнительная информация:
Результат x /2 *!CPtrList* содержит (среди многих других) следующие результаты:

009530c4   <application>!CPtrList::~CPtrList
009530be   <application>!CPtrList::CPtrList
...        <application>!CPtrList::...
009abc5c   <application>!CPtrList::`RTTI Base Class Array'
009abc4c   <application>!CPtrList::`RTTI Class Hierarchy Descriptor'
009bcd18   <application>!CPtrList `RTTI Type Descriptor'
009abc30   <application>!CPtrList::`RTTI Base Class Descriptor at (0,-1,0,64)'
7464e9cb   mfc110u!CPtrList::~CPtrList
74544a04   mfc110u!CPtrList::CPtrList
...        mfc110u!CPtrList::...
745293b8   mfc110u!CPtrList::`vftable'
747510da   mfc110u!CPtrList::`vector deleting destructor'
745293cc   mfc110u!CPtrList::`RTTI Complete Object Locator'
7452940c   mfc110u!CPtrList::`RTTI Base Class Array'
745293fc   mfc110u!CPtrList::`RTTI Class Hierarchy Descriptor'
74795778   mfc110u!CPtrList `RTTI Type Descriptor'
745293e0   mfc110u!CPtrList::`RTTI Base Class Descriptor at (0,-1,0,64)'
746fdc68   mfc110u!CPtrList::classCPtrList

Используемый мной скрипт (heap_stat.py) просматривает результаты !heap -h 0и ищет запись, соответствующую mfc110u!CPtrList::``vtable'.

Результат dt CPtrList начинается со следующего:

0:000> dt CPtrList
<application>!CPtrList => in other words, no 'mfcu110' entry
   +0x000 __VFN_table : Ptr32 

Мне уже давно интересно, в чем разница между записями mfc110u!CPtrList и <application>!CPtrList иКакова точная роль записи vtable в x /2 результате?

Есть идеи?
Спасибо

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Попробуйте посмотреть, как WinDBG находит этот тип:

dt CPtrList

Возможно, mfc110u не содержит информацию о типе для CPtrList

0 голосов
/ 12 июня 2018

Пока что я нашел решение:
Видимо для некоторых объектов префикс модуля нужно удалить:

>>> typeInfo("mdf110u!CPtrList")
-> SymbolException

>>> typeInfo("CPtrList")
-> this is working!!!
...