Windbg - возможно ли подавить вывод для .outmask 1 или .outmask / d? - PullRequest
0 голосов
/ 24 сентября 2018

Я использую цикл .do в скрипте Windbg, и вся логика работает нормально.

В этом цикле .do я делаю .f+, и я использовал .outmask- 1 для подавления болтливости .f+, когда он возвращает вам фрейм, например 23 00000002a9a2f7b0 0000000000000000 ntdll!RtlUserThreadStart+0x1d,Теперь он может перебирать кадры стека, не возвращая каждый кадр обратно в командное окно.

Однако при сброс .outmask с либо .outmask 1или .outmask /d следующая строка всегда выводится Client 00000000002873A0 mask is 3F7 в командное окно.

Поскольку я нахожусь в цикле, моя цель - подавить подробный вывод из .f+, последнее, что яхочу, чтобы .outmask был таким же болтливым внутри этого цикла.Есть ли способ подавить это тоже?

Мой цикл выглядит так:

  .frame 0n0
  r $t0 = 0

  .do
  {
    !for_each_local .if ($spat ("@#Local","foo") == 1) { ?? foo->bar }

    .outmask- 1
    .f+
    .outmask 1
    r $t0 = @$t0+1
  }
  (@$t0 < @$t1)
}

1 Ответ

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

Внутренние возможности сценариев WinDbg несколько беспорядочные.ИМХО WinDbg на самом деле не предназначен для таких задач.Если вам нужны более сложные сценарии, попробуйте , или JavaScript сценарии отладчика (Microsoft)

Общий способ предотвращения вывода чего-либоis

.foreach (output {<put your command here>}) {}

т.е. в вашем случае

.foreach (output {.outmask 1}) {}

Он передает каждое слово вывода как переменную output в цикл, и цикл ничего с этим не делает.

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

Следующий скрипт работает для меня при запуске с $>a<:

.echo "Before"
.frame 0n0
r $t0 = 0
.do { 
    !for_each_local .if ($spat ("@#Local","foo") == 1) { ?? foo->bar } 
    .outmask- 1
    .f+
    .foreach (output {.outmask 1}) {}
    r $t0 = @$t0+1 
}
(@$t0 < @$t1)
.echo "After"
...