Может ли "DbgCommand ()" также получить результаты с гиперссылками? - PullRequest
0 голосов
/ 06 сентября 2018

В этом вопросе я пытался заставить работать скрипт Windbg, но, возможно, я мог бы решить мою проблему, используя PYKD в любом случае. Моя проблема заключается в следующем:

Я запускаю команду ~* k, и я получаю следующий ответ (как и в упомянутом вопросе, мне нравится выделять гиперссылки, поэтому изображение вместо простого текста):

Windbg command result, containing hyperlinks

Я хотел бы смоделировать щелчок мышью по строке, содержащей CServiceModule::Run. При наведении курсора на соответствующую гиперссылку 02 я вижу следующую команду Windbg:

dx Debugger.Sessions[0].Processes[4416].Threads[4436].Stack.Frames[2].SwitchTo();dv /t /v

До сих пор я пытался воссоздать эту команду самостоятельно, но теперь я понимаю, что, если я могу просто получить эту команду из самого ответа, моя проблема решена.

Насколько я знаю, PYKD DbgCommand() дает только текстовую часть ответа (а не информацию под гиперссылкой).

Есть ли способ получить эту гиперссылку из команды DbgCommand()?

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

результат КБ

0:000> kb
 # ChildEBP RetAddr  Args to Child              
00 000bf618 76fa0e00 7ffdf000 7ffda000 76ff714c ntdll!LdrpDoDebuggerBreak+0x2c
01 000bf778 76f860a7 000bf7ec 76f20000 76c245cb ntdll!LdrpInitializeProcess+0x11a9
02 000bf7c8 76f83659 000bf7ec 76f20000 00000000 ntdll!_LdrpInitialize+0x78
03 000bf7d8 00000000 000bf7ec 76f20000 00000000 ntdll!LdrInitializeThunk+0x10

когда я нажимаю на ссылку dml 02, я получаю

0:000> dx Debugger.Sessions[0].Processes[2684].Threads[3736].Stack.Frames[2].SwitchTo();dv /t /v
Debugger.Sessions[0].Processes[2684].Threads[3736].Stack.Frames[2].SwitchTo()
Unable to enumerate locals, Win32 error 0n87
Private symbols (symbols.pri) are required for locals.
Type ".hh dbgerr005" for details.

как я подчеркивал в моих предыдущих ответах, того же можно достичь с помощью

dx @ $ curstack.Frames [2] .SwitchTo (); dv / v / t

, набрав это точно эквивалентно нажатию ссылки 02

0:000> dx @$curstack.Frames[2].SwitchTo();dv /v /t
@$curstack.Frames[2].SwitchTo()
Unable to enumerate locals, Win32 error 0n87
Private symbols (symbols.pri) are required for locals.
Type ".hh dbgerr005" for details.

это будет иметь смысл, только если вы отлаживаете с доступным источником Вот пример стека и кадра 2 с источником

я использую kbL, чтобы скрыть информацию о строке src на трассировке стека а затем щелкнул кадр № 2 DML-ссылку и затем введите команду, как вы видите, напечатайте ту же информацию, как вы нажимаете

теперь, если вы говорите, мне нужно, чтобы строка "RUN" не использовала число 2 Вы должны написать скрипт для разбора текста каждой строки, как я показал вам в моем предыдущем ответе на ветку, которую вы связали

0:000> kbL
 # ChildEBP RetAddr  Args to Child              
00 (Inline) -------- -------- -------- -------- mfctest!CThreadLocal<_AFX_THREAD_STATE>::GetData
01 0025fe48 012fbc2f 015bf7a8 012fd4bd ffffffff mfctest!AfxGetThreadState
02 0025fe64 0151979e 00000000 015c6360 7ffdb000 mfctest!CWinThread::Run+0xf
03 0025fe7c 014c17d5 012e0000 00000000 00322d3e mfctest!AfxWinMain+0x93
04 (Inline) -------- -------- -------- -------- mfctest!invoke_main+0x1a
05 0025fec8 76e8ed6c 7ffdb000 0025ff14 76f837eb mfctest!__scrt_common_main_seh+0xf8
06 0025fed4 76f837eb 7ffdb000 76b22d01 00000000 kernel32!BaseThreadInitThunk+0xe
07 0025ff14 76f837be 014c1892 7ffdb000 00000000 ntdll!__RtlUserThreadStart+0x70
08 0025ff2c 00000000 014c1892 7ffdb000 00000000 ntdll!_RtlUserThreadStart+0x1b


clicking link with number 2
0:000> dx Debugger.Sessions[0].Processes[620].Threads[2228].Stack.Frames[2].SwitchTo();dv /t /v
Debugger.Sessions[0].Processes[620].Threads[2228].Stack.Frames[2].SwitchTo()
@ebx              class CWinThread * this = 0x015bf7a8 {h=0xfffffffe proc={...}}
<unavailable>     long lIdleCount = <value unavailable>
@eax              class _AFX_THREAD_STATE * pState = 0x0153b820
<unavailable>     int bIdle = <value unavailable>


using command (NOT CLICKING BUT TYPING THIS )
0:000> dx @$curstack.Frames[2].SwitchTo();dv /v /t
@$curstack.Frames[2].SwitchTo()
@ebx              class CWinThread * this = 0x015bf7a8 {h=0xfffffffe proc={...}}
<unavailable>     long lIdleCount = <value unavailable>
@eax              class _AFX_THREAD_STATE * pState = 0x0153b820
<unavailable>     int bIdle = <value unavailable>
0 голосов
/ 11 сентября 2018

Если вы знаете номер кадра, вы можете переключить его с помощью команды pykd.setFrame. Но вы должны помнить, что pykd не поддерживает встроенный фрейм функции. Таким образом, номер кадра может отличаться от результата windbg. Вы можете отключить встроенную функцию командой 'inline 0'

Скрипт pykd может выглядеть так:

frames = getStack()
for frameNumber in xrange( len(frames) ):
    if "ServiceModule::Run" in findSymbol(frames[frameNumber].ip):
          setFrame(frameNumber)
          dprintln("frame switched")

Дополнительное редактирование для удобства чтения
Как упоминалось в следующем комментарии, проблема была поднята в PYKD с именем " dbgCommand не поддерживает вывод команды DML ": другими словами: в настоящее время DML еще не поддерживается PYKD DbgCommand().

...