Как вы устанавливаете точки останова с помощью windbg.? [Дубликат]

этот метод сравнивает два целых числа с нулевой проверкой, см. тесты

public static boolean compare(Integer int1, Integer int2) {
    if(int1!=null) {
        return int1.equals(int2);
    } else {
        return int2==null;
    }
    //inline version:
    //return (int1!=null) ? int1.equals(int2) : int2==null;
}

//results:
System.out.println(compare(1,1));           //true
System.out.println(compare(0,1));           //false
System.out.println(compare(1,0));           //false
System.out.println(compare(null,0));        //false
System.out.println(compare(0,null));        //false
System.out.println(compare(null,null));     //true
0
задан IFacer 22 December 2009 в 05:40
поделиться

2 ответа

вы можете разработать, чтобы использовать другие псевдорежимы общего назначения: t0..t19

bp your-address "r$t1=your-other-address; ba w4 @$t1 /1 \"dd @$t1;gc\""
1
ответ дан deemok 28 August 2018 в 03:31
поделиться
  • 1
    Если точка останова «ваш-адрес» будет удалена дважды (до того, как будет удален «ваш-другой-адрес»), изменит ли значение значение $ t1 и приведет к тому, что обе однократные точки останова будут dd @ $ t1 на одном и том же адрес? Спасибо!!! – IFacer 22 December 2009 в 16:45
  • 2
    В этом случае сохраните точки останова до минимума. Зная, что у вас есть «ваш-адрес», он также может сбросить все остальные бит. Используйте что-то вроде «bc1-10» в своем состоянии (если «ваш-адрес» находится на bp0!), Чтобы избавиться от последних 10 точек останова, которые еще не попали. – deemok 23 December 2009 в 10:28
  • 3
    В качестве альтернативы вы можете установить $ t1 в 0 (чтобы убедиться, o) и сбросить его до 0 в однократном bp. Затем просто проверьте значение 0 (или для другого значения) и создайте новый одноразовый бит, если выполнено определенное условие (например, 0). – deemok 23 December 2009 в 10:30

Если вы знаете, что никогда не будет больше определенной «контрольной точки» ba «ребенка», вы можете фактически использовать псевдореестр @$bpN, установив команду «control» breakpoint:

ba1 w4 /1 @esp+4 "dd @$bp1"

То есть укажите номер точки останова, который должен назначить эта новая точка останова, и псевдоопределение для этой точки останова все еще определено в команде точки останова.

Однако, если вы считаете контрольную точку останова будет ударяться несколько раз и хочет определить несколько контрольных точек ba, которые, очевидно, не будут работать, потому что тогда «точка останова 1» будет просто переопределяться каждый раз. Но вы все равно можете это сделать!

Фокус в том, чтобы заставить контрольную точку контрольной точки фактически содержать литеральный адресный текст, а не пытаться пройти псевдореестр. И вы можете сделать это с помощью текстовых псевдонимов.

Попробуйте это для вашей контрольной точки останова:

bu @WHATEVER "aS /x ${/v:baaddy} @esp+4; .block{ ba w4 /1 baaddy \"dd baaddy\"; ad ${/v:baaddy} }"

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

  • Алиас настроен для текста «baaddy» с значением для оценки выражения @esp+4.
  • .block гарантирует, что расширение псевдонима произойдет для чего Далее.
  • Затем интерпретатор псевдонимов расширит все вхождения «baaddy» внутри блока, за исключением команды ad (из-за переключателя / v).
  • So если значение @esp+4 равно 0x1234, команда точки прерывания доступа буквально становится: ba w4 /1 0x1234 \"dd 0x1234\" с фактическим адресом, встроенным в нее.
  • Затем текстовый псевдоним удаляется.

Важно удалить псевдоним текста в конце или в следующий раз, когда эта контрольная точка останова будет удалена, расширение псевдонима произойдет до того, как команда aS и «baaddy» будет расширена используя значение previous . Это также означает, что важно, чтобы этот псевдоним текста не существовал при первом установлении команды контрольной точки останова.

0
ответ дан Kurt Hutchinson 28 August 2018 в 03:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: