Интерфейс класса точек останова Python GDB и условные точки останова - PullRequest
0 голосов
/ 03 июля 2019

Я использую интерфейс GDB Python для обработки точек останова

import gdb
class MyBP(gdb.Breakpoint):
    def stop(self):
        print("stop called "+str(self.hit_count))
        return True
bp = MyBP("test.c:22")

Это работает как ожидалось. Hit_count увеличивается после возвращения метода "stop".

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

bp.condition="some_value==2"

это не работает, как ожидалось. Метод stop всегда выполняется независимо от того, является ли условие истинным или ложным. Если метод stop возвращает «True», точка останова остановит программу, только если условие также истинно. Число hit_count увеличивается после возврата метода Stop и выполнения условия.

Таким образом, создается впечатление, что GDB применяет проверку условия только после вызова метода Stop.

Как я могу гарантировать, что метод Stop вызывается только при выполнении условия?

1 Ответ

1 голос
/ 03 июля 2019

Как я могу гарантировать, что метод Stop вызывается только при выполнении условия?

В настоящее время вы не можете.См. bpstat_check_breakpoint_conditions () в gdb/breakpoint.c

Соответствующие части:

  /* Evaluate extension language breakpoints that have a "stop" method
     implemented.  */
  bs->stop = breakpoint_ext_lang_cond_says_stop (b);

  ...
          condition_result = breakpoint_cond_eval (cond);
  ...
  if (cond && !condition_result)
    {
      bs->stop = 0;
    }
  else if (b->ignore_count > 0)
    {
      ...
      ++(b->hit_count);
      ...
    }

Таким образом, метод python stop всегда вызывается до оценки условия.Вы можете реализовать свое условие в Python, например, используя gdb.parse_and_eval, если вы хотите писать выражения на исходном языке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...