windbg trouble

Тема в разделе "WASM.SOFTWARE", создана пользователем Igor1024, 20 ноя 2011.

  1. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Всем привет.
    Вот понадобилось кое-что посмотреть-отладить. Ок, уже давно была установлена варька с windbg 6.11.0001.404. Символы берутся с сервера, вроде всё намази (хотя бы раньше так было), но вот незадача: если попробуем ввести dt nt!_peb addr, то получим что-то такое:
    Код (Text):
    1. kd> dt nt!_peb 7ffd7000
    2.    +0x000 InheritedAddressSpace : ??
    3.    +0x001 ReadImageFileExecOptions : ??
    4.    +0x002 BeingDebugged    : ??
    5.    +0x003 SpareBool        : ??
    6.    +0x004 Mutant           : ????
    7.    +0x008 ImageBaseAddress : ????
    8.    +0x00c Ldr              : ????
    9. ...
    10.    +0x200 SystemDefaultActivationContextData : ????
    11.    +0x204 SystemAssemblyStorageMap : ????
    12.    +0x208 MinimumStackCommit : ??
    13. Memory read error 7ffd7208
    Странно. На !peb addr (длл'ка с расширениями присутствует, кстати), выдаёт
    Код (Text):
    1. kd> !peb 7ffd7000
    2. PEB at 7ffd7000
    3. error 1 InitTypeRead( nt!_PEB at 7ffd7000)...
    Также происходит ругань на !object:
    Код (Text):
    1. kd> !object 80559c20
    2. 80559c20: Not a valid object (ObjectType invalid)
    В общем непонятно. Старая версия сегодня себя повела так-же (не помню версию)... Странно, ведь до этого прекрасно пользовался. Гугл и его друзья молчат по этому поводу.
    Может кто-нибудь сталкивался с такой траблой?
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Igor1024
    dt nt!_peb 7ffd7000 -- а контекст процесса учитывается?

    Насчет !object -- можно увидеть дамп памяти по этому адресу?
     
  3. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Данные точные - от !process 0 0
    Потому и спрашиваю, в принципе. А !object выдаёт лишь то, что я написал.
     
  4. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Igor1024
    В смысле? !process 0 0 показывает список всех процессов. Не факт, что останов произошел в целевом процессе.

    Насчет !object я ошибся -- надо -0x18 байт (для 32битной системы) от тела объекта. В общем, хочется посмотреть на заголовок объекта -- может это и правда не объект. Например, для команды '!object 80559c20' надо посмотреть на 'dd 80559c20-18'.
     
  5. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    И еще: это можно проделать самому: если 'dt _object_header objaddr-0x18' (на 32битной системе) показывает что-то "осознанное" (например, корректный указатель POBJECT_TYPE), то да, проблема в WinDbg (он почему-то не узнает в объекте объект), а если там мусор, то это, видимо, все же не объект. И неплохо бы узнать, откуда пришел адрес объекта.
     
  6. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Поэксперементировав, выяснил: все команды дебаггера прекрасно работают, пока не притрагиваешься к оси на виртуалке - в моём случае, мне нужно было запустить одну юзермодную прогу, чтобы лучше разобраться с одной нативной функой.
    Код (Text):
    1. kd> !peb 7ffd5000
    2. PEB at 7ffd5000
    3.     InheritedAddressSpace:    No
    4.     ReadImageFileExecOptions: No
    5.     BeingDebugged:            No
    6.     ImageBaseAddress:         01000000
    7.     Ldr                       00191e90
    8.     Ldr.Initialized:          Yes
    9.     Ldr.InInitializationOrderModuleList: 00191f28 . 00194308
    10.     Ldr.InLoadOrderModuleList:           00191ec0 . 001942f8
    11.     Ldr.InMemoryOrderModuleList:         00191ec8 . 00194300
    12.             Base TimeStamp                     Module
    13.          1000000 498c0dae Feb 06 20:15:10 2009 C:\WINDOWS\system32\wbem\wmiprvse.exe
    14.         7c900000 49900c02 Feb 09 20:57:06 2009 C:\WINDOWS\system32\ntdll.dll
    15.         7c800000 49c4f2fe Mar 22 00:00:30 2009 C:\WINDOWS\system32\kernel32.dll
    16.         77c00000 4803825b Apr 15 03:12:11 2008 C:\WINDOWS\system32\msvcrt.dll
    17.         77dc0000 49900c03 Feb 09 20:57:07 2009 C:\WINDOWS\system32\ADVAPI32.dll
    18.         77e70000 49e5fc7d Apr 16 02:25:49 2009 C:\WINDOWS\system32\RPCRT4.dll
    19.         77fe0000 4a43386e Jun 25 19:42:22 2009 C:\WINDOWS\system32\Secur32.dll
    20.         7e360000 480381e1 Apr 15 03:10:09 2008 C:\WINDOWS\system32\USER32.dll
    21.         77f10000 490071d3 Oct 23 23:45:07 2008 C:\WINDOWS\system32\GDI32.dll
    22.         75250000 480381e7 Apr 15 03:10:15 2008 C:\WINDOWS\system32\wbem\wbemcomn.dll
    23. .........//ну и далее
    Потом волшебная команда:
    Код (Text):
    1. kd> g
    Попробуем посмотреть peb тот же самый снова (процесс wmiprvse.exe (возьмём его, к примеру), так что он живёт ещё и радуется):
    Код (Text):
    1. kd> !peb 7ffd5000
    2. PEB at 7ffd5000
    3. error 1 InitTypeRead( nt!_PEB at 7ffd5000)...
    Однако !object addr и dt _object_header addr-18 работают:
    Код (Text):
    1. kd> !object 8202f650
    2. Object: 8202f650  Type: (823c8e70) Process
    3.     ObjectHeader: 8202f638 (old version)
    4.     HandleCount: 1  PointerCount: 5
    5.  
    6. kd> dt _object_header 8202f650-18
    7. nt!_OBJECT_HEADER
    8.    +0x000 PointerCount     : 5
    9.    +0x004 HandleCount      : 1
    10.    +0x004 NextToFree       : 0x00000001
    11.    +0x008 Type             : 0x823c8e70 _OBJECT_TYPE
    12. ..........//ну и далее
    Не могу понять, где могут быть косяки...
     
  7. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Хотя сейчас убью варькины тулзы, посмотрим, может изменит ситуацию - до этого их не ставил.
     
  8. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Вообще всё это нужно, чтобы понять полностью, как работает NtQueueApcThread. Когда проводил тесты, оказалось, что если шлёшь APC потоку-потомку (тестил с помощью __asm("mov 0,%eax") - фолт самый хороший показатель), то всё происходит как положено - обработчика сеховского нет, кроме дефолтного, выполнение приложения завершается. Однако я пробовал послать APC другой проге, главный и единственный поток которой был в alertable состоянии, и она продолжила работать. Это навело на мысль, что скорее всего, при исполнении APC-routine, устанавливается сеховый обработчик, который просто abort'ит routine, если что-то не так. Я читал код ReactOS, apc.c, если быть точным, и там всё дело в KernelRoutine - там вызывают эту функу чтобы выполнить код APC-routine, как думаю. И я не нашёл определение этой KernelRoutine (и указатель на неё не передаётся в функу KiDeliverApc), потому и взялся за отладчик.
     
  9. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Ок, моя догадка с сехом подтвердилась
    http://www.cnblogs.com/sunkang/archive/2011/05/06/2038787.html (там трудно ориентироваться, ибо это кривой копипейст). В принципе, всё эта статья мне разъяснила.
    Проблема с kd так и не решена. Завтра поставлю другую, более "чистую" версию без тулзов, отпишусь.
     
  10. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Вообщем смотри сюды
    http://analyze-v.com/?p=336
    но помни про
    .pagein
    .cache forcedecodeuser
    Как то так.
     
  11. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Ок, теперь хотя бы стало понятно, что не так - до этого кд не говорил, что не смог загрузить символы для ntdll.dll с сервера; Одни говорят, что проблема у мелкомягких - мол, эту багу никак не пофиксят, другие - мол, преват, ничего удивительного... Странно...
    Ребят, может у кого-нить есть .pdb ntdll.dll для свиньи sp3?

    shchetinin
    Спасибо, а то бы лажанулся, когда начал отлаживать.
     
  12. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Если путь к символам установлен то
    .reload ntdll это не совсем баг, точнее баг но очень сложгы, это связано с тем что отладчик ядра. и подгрузкой памятью.
     
  13. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    shchetinin
    можно поточнее, не совсем понял?

    ntdll.pdb нашёлся в пакете, который я стянул с сайта мелкомягких, осталось заставить дебаггер с ним подружиться... Пока он на него отказывается смотреть.

    Хех, ntdll.pdb в списке загруженных модулей (спасибо локальным символам и symstore), но ничего не поменялось... Печально.
     
  14. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Всё, тему можно закрывать - я разобрался сам с кд. Дело было просто-напросто в том, что nt == ntkrnlpa.pdb
    ntdll==ntdll.pdb; Вот просто из-за невнимательности (как всегда :) ) искал отладочные символы в другом модуле.