Windbg scripting - выводит тип класса переменной - PullRequest
0 голосов
/ 20 ноября 2018

В Windbg у меня есть скрипт, который перебирает фреймы стека и хорошо справляется со сбором интересующих вещей, отображая их в командном окне (он просто выявляет вещи, которые могут потребовать дальнейшего изучения).

В определенных кадрах будет this, который меня интересует некоторыми деталями.Конечно, я могу извлечь подробности, но я бы тоже хотел получить фактический тип класса.Я знаю, что если я тогда сделаю dv /t, я увижу что-то вроде следующего:

0:115> .frame 14
0:115> dv /t
class foo1 * this = 0x00000000e9ed0010

Я бы хотел, чтобы можно было просто передать foo1 команде .printf.

В кадрах, которые имеют больше, чем просто this, я могу ограничить вывод с помощью шаблона dv /t this, очевидно, но есть хороший способ иметь что-то вроде того, что следует в кадре, и я могу извлечьпросто foo1?

0:115> .frame 17
0:115> dv /t
class foo1 * this = 0x00000000f3e2f568
class foo2 * bar2 = 0x0000000000000001
bool _somebool = true

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

0:115> .frame 17
0:115> dv /t this
class foo1 * this = 0x00000000f3e2f568

Следующийпример кода от blabb:

0:000> dv /t
class Time * this = 0x001efb24
int h = 0n23
int m = 0n59
int s = 0n59
0:000> dv /t this
class Time * this = 0x001efb24
0:000> some command
Time

Третья команда - это то, что я ищу.

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Я не уверен, что понимаю, что вам нужно
, но вы дали новой оценке выражения dx попытку

, например

0:000> dv /t
class Time * this = 0x001efb24
int h = 0n23
int m = 0n59
int s = 0n59
0:000> dv /t this
class Time * this = 0x001efb24
0:000> dx @$curstack.Frames[0].LocalVariables
@$curstack.Frames[0].LocalVariables                
    this             : 0x1efb24 [Type: Time *]
0:000> dx @$curstack.Frames[0].LocalVariables.this
@$curstack.Frames[0].LocalVariables.this                 : 0x1efb24 [Type: Time *]
    [+0x000] hour             : 23 [Type: int]
    [+0x004] minute           : 59 [Type: int]
    [+0x008] second           : 59 [Type: int]

, вы можете улучшить это с помощью javascript для

, вот как вы можете улучшить это с помощью javascript

, создать файл whateverfoo.js с содержанием ниже

function log(logstr) {
    return host.diagnostics.debugLog(logstr + "\n")
}
function locvartgttyp(frameno)
{
    log( host.currentThread.Stack.Frames[frameno].LocalVariables.this.targetType.name)
}

и использовать его как

:\>echo %wdbg%
"c:\Program Files\Windows Kits\10\Debuggers\x86\cdb.exe"

:\>%wdbg% time.exe

Microsoft (R) Windows Debugger Version 10.0.17763.132 X86

0:000> g time!main

time!main:
01237a80 55              push    ebp
0:000> tc;t

time!Time::Time:
01231140 55              push    ebp

0:000> dv /t
class Time * this = 0x00000002
int h = 0n23
int m = 0n59
int s = 0n59

0:000> .load jsprovider

0:000> .scriptload c:\wdscr\locvar.js

JavaScript script successfully loaded from 'c:\wdscr\locvar.js'

0:000> dx @$scriptContents.locvartgttyp(0)
Time *

@$scriptContents.locvartgttyp(0)
0:000>
0 голосов
/ 20 ноября 2018

Что я понял: вам нужна команда, которая принимает foo1 в качестве параметра и выдает вывод типа dv /t, но только для всех foo1.

ИМХО, это вряд ли возможно с помощью встроенного WinDbgфункциональность.Вы можете возиться с .foreach, включая $spat и т. П.

Одна возможность - .shell вместе с инструментом командной строки findstr или Cygwin grep.Но это не удобно, потому что он всегда выводит Process started и т. Д. Вы можете снова обойти это, используя .foreach и пропуская некоторые токены, но это утомительно.

Существуют grep реализации для WinDbg, такие как long123king плагин grep и, если я правильно помню, есть также реализация grep в PDE .

Тогда есть , который имеет полномочияPython, и давайте сделаем что угодно.

...