Как вступить в набор цепочечных методов с gdb? [Дубликат]

display не является одним из свойств, с которыми работает переход.

См. http://www.w3.org/TR/css3-transitions/#animatable-properties- для списка свойств, которые могут иметь к ним переход.

25
задан phuclv 23 November 2015 в 11:33
поделиться

6 ответов

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

Возможно, вы, возможно, сценарием всего этого взаимодействия с использованием новой встроенной поддержки Python в GDB из соединительной линии CVS.

Без Python вы ограничены тем, что можете сделать, но обычный способ состоит в том, чтобы отключить ] на a() и включить его из команды, прикрепленной к точке останова на b().

Вот пример:

int a(int x)
{
  return x + 1;
}

int b()
{
  return a(1);
}

int call_a_lots()
{
  int i, sum = 0;
  for (i = 0; i < 100; i++)
    sum += a(i);
}

int main()
{
  call_a_lots();
  return b();
}

gcc -g t.c
gdb -q ./a.out
Reading symbols from /tmp/a.out...done.
(gdb) break a
Breakpoint 1 at 0x4004cb: file t.c, line 3.
(gdb) disable 1
(gdb) break b
Breakpoint 2 at 0x4004d7: file t.c, line 8.
(gdb) command 2
>silent
>enable 1
>continue
>end
(gdb) run

Breakpoint 1, a (x=1) at t.c:3
3     return x + 1;
(gdb) bt
#0  a (x=1) at t.c:3
#1  0x00000000004004e1 in b () at t.c:8
#2  0x000000000040052c in main () at t.c:21
(gdb) q

Voila: мы остановлен на a(), вызванном из b(), игнорируя предыдущие 100 вызовов a().

21
ответ дан Employed Russian 28 August 2018 в 05:34
поделиться

Легким для руки является:

Установите точку останова в интересующей вас функции.

break a

Прикрепите команду gdb к этой точке останова.

command 1
 up 1
 if $lr == 0x12345678
  echo match \n
  down 1
 else
  echo no match \n
  echo $lr \n
  down 1
  cont 
 end 
end 

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

Наслаждайтесь.

0
ответ дан AppSpec 28 August 2018 в 05:34
поделиться

не уверен, как это сделать с помощью gdb. Но вы можете объявить глобальную переменную типа:

bool call_a = false;

и когда b вызывать

call_a = true;   
a();

и установить для call_a значение false, когда другая функция вызывает a () или после вашей точки останова

, затем используйте условие break

break [line-number] if call_a == true
4
ответ дан Ciro Santilli 新疆改造中心 六四事件 法轮功 28 August 2018 в 05:34
поделиться

gdb может обрабатывать это прямо сейчас, без необходимости в Python. Просто сделайте следующее:

b a if $_caller_is("b")
0
ответ дан Jeff Trull 28 August 2018 в 05:34
поделиться

Более простое решение, чем скрипты Python, использует временную точку останова .

Это выглядит так:

b ParentFunction
command 1
  tb FunctionImInterestedIn
  c
end

Каждый раз, когда вы входите в ParentFunction, вы установите единовременную точку останова на интересующую вас функцию, а затем продолжите работу (предположительно, пока вы не нажмете эту точку останова).

Так как вы разломаете ровно один раз на FunctionImInterestedIn, это не сработает, если FunctionImInterestedIn вызывается несколько раз в контексте ParentFunction и вы хотите разбить каждый вызов.

4
ответ дан rix0rrr 28 August 2018 в 05:34
поделиться

Я тестировал это на gdb 7.6, который уже доступен, но он не работает на gdb 7.2 и, вероятно, на gdb 7.1:

Итак, это main.cpp:

int a()
{
  int p = 0;
  p = p +1;
  return  p;
}

int b()
{
  return a();
}

int c()
{
  return a();
}

int main()
{
  c();
  b();
  a();
  return 0;
}

Тогда g ++ -g main.cpp

Это my_check.py:

class MyBreakpoint (gdb.Breakpoint):
    def stop (self):
        if gdb.selected_frame().older().name()=="b":
          gdb.execute("bt")
          return True
        else:
          return False

MyBreakpoint("a")

И вот как это работает:

4>gdb -q -x my_check.py ./a.out
Reading symbols from /home/a.out...done.
Breakpoint 1 at 0x400540: file main.cpp, line 3.
(gdb) r
Starting program: /home/a.out
#0  a () at main.cpp:3
#1  0x0000000000400559 in b () at main.cpp:10
#2  0x0000000000400574 in main () at main.cpp:21

Breakpoint 1, a () at main.cpp:3
3         int p = 0;
(gdb) c
Continuing.
[Inferior 1 (process 16739) exited normally]
(gdb) quit
7
ответ дан Sergei Kurenkov 28 August 2018 в 05:34
поделиться
Другие вопросы по тегам:

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