Добрый день,
У меня есть скрипт Windbg, который перебирает кадры стека, используя цикл .do
.Для каждого кадра он использует !for_each_local
и $spat ("@#Local","foo")
, чтобы соответствовать вещам, которые меня интересуют, чтобы получить начальный взгляд.Затем я использую dx @$t2 =
, чтобы назначить и, наконец, распечатать то, что мне интересно, то есть dx @$t2 = ((foobase*) this)->m_current->m_name
- в основном это работает нормально.
Время от времени будет this
вкадр, который не может быть успешно отлит с помощью dx
, так что он выглядит как barbase
, а не foobase
... dx
выглядит нормально, потому что я завернул его в .foreach (output { dx @$t2 = ((foobase*) this)->m_current->m_name }) {}
, поэтомув конечном итоге содержит что-то , что приводит к завершению сценария (несмотря на попытку .catch
).
Сначала я не совсем понял, что происходит, но делал .printf "%ma\n", @$t2
помог мне убедиться, что содержимое <HRESULT 0x80004002>
, которое, как мне кажется, , подразумевает недопустимое приведение - что, если так, имеет смысл.Моя строка сценария использует foobase
, когда потребуется barbase
.
Если Я прав, то я ищу способ проверить это, прежде чем углубитьсядалее в сценарий и попытаемся получить доступ к деталям, которые, как я знаю, приведут к его завершению.
Я кажется придумал запутанный способ сделать это ... но я хотелспросите, было ли что-нибудь лучше ...
.frame 0a $$ a frame with barbase, not foobase
dx @$t2 = ((foobase*) this)->m_name
.printf "%ma\n", @$t2 $$ prints <HRESULT 0x80004002>
as /c CastCheck .printf "%ma", @$t2
.if ($spat(@"${CastCheck}","<HRESULT 0x80004002>") = 1) { .printf "yes" } .else { .printf "no" } $$ prints yes
Есть ли способ проверить, содержит ли $t2
индикатор неверного приведения без использования псевдонима?
Я спрашиваю это, потому что с помощьюпсевдоним вызвал у меня большую путаницу ... в моем скрипте (чтобы он работал, и он, кажется, работает довольно хорошо), мне пришлось использовать aS
вместо as
(я могу использовать as
отличноиз окна командной строки, и я не совсем понимаю , почему мне нужно перейти на aS
после прочтения документации), а также мне нужно завершить строку точкой с запятой (в отличие от любой другой строкив моем скрипте) и мне нужно использовать ad /q CastCheck;
непосредственно перед aS
, а затем быстро кормитьнаоборот, в противном случае псевдоним, кажется, теряется, так или иначе ... так что вы можете сказать, что использование этого псевдонима доставило мне немного хлопот.
Итак, есть ли a) anпростой способ предварительно проверить, является ли то, на что я смотрю, foobase
или barbase
, или b) после проверки после попытки приведения, содержит ли $t2
это <HRESULT 0x80004002>
?Если я сделаю .printf "%d", @$t2
, он покажет 5
... 5
тоже что-то представляет?
Или, действительно, любые другие идеи (или вопросы).
РЕДАКТИРОВАТЬ:
Я собираюсь попробовать и проиллюстрировать, что я имею в виду с 2 короткими прогонами кода, выполненного в командном окне ... где кадр 00 содержит this
что можно привести к foobase
, а затем. printf
работает хорошо, и где кадр 0a содержит this
, то есть barbase
(но мой сценарий все еще не ожидает этого, и яхочу быть в состоянии обслужить это) ... dx
все еще помещает что-то в $t10
... Я хочу быть в состоянии обнаружить, что это мусор (или предварительно обнаружить, я не должен 'даже попробуйте dx
, если this
равно barbase
, так как это бессмысленно, и я все равно не заинтересован в этом).
0:038> .frame 00
00 00000006`3e2bc930 00007ffe`926293a8 BlahBlahBlah
0:038> dx @$t10 = ((foobase *) this)->m_name
@$t10 = ((foobase *) this)->m_name : 0x869c7b8 : "nice string" [Type: char *]
0:038> .printf "%ma\n", @$t10
nice string
Здесь this
является barbase
, и даже не имеет m_name
:
0:038> .frame 0a
0a 00000006`3e2bd220 00007ffe`91ec7780 BlahBlahBlah
0:038> dx @$t10 = ((foobase *) this)->m_name
@$t10 = ((foobase *) this)->m_name : 0x2265646f00000005 : "--- memory read error at address 0x2265646f`00000005 ---" [Type: char *]
0:038> .printf "%ma\n", @$t10
<HRESULT 0x80004002>
При помещении в цикл я обнаружил, что сценарий завершится с Memory access error
в кадре 0a, когда я попытаюсь проверитьдлина струны I believe должна быть возвращена dx
.
По существу, во втором блоке я хочу либо проверить $t10
на то, что не хорошая строка (вероятно, это <HRESULT 0x80004002>
?) или, что еще лучше, вообще не делал dx
и .printf
, потому что я мог до этого проверить, что this
был barbase
, а не foobase
.
Это имеет больше смысла, или я должен начать снова?