Может ли "DbgCommand()" также получить результаты с гиперссылками?

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

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

Результат команды Windbg, содержащий гиперссылки

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

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

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

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

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

2 ответа

Решение

Если вы знаете номер кадра, вы можете переключить его с помощью команды pykd.setFrame. Но вы должны помнить, что pykd не поддерживает встроенную функцию frame. Таким образом, номер кадра может отличаться от результата windbg. Вы можете отключить встроенную функцию с помощью команды "встроенный 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(),

Результат кб

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>
Другие вопросы по тегам