display
не является одним из свойств, с которыми работает переход.
См. http://www.w3.org/TR/css3-transitions/#animatable-properties- для списка свойств, которые могут иметь к ним переход.
Описанная вами проблема возникает довольно часто, обычно в контексте 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()
.
Легким для руки является:
Установите точку останова в интересующей вас функции.
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 (), команда временно выдает один стек стека, тем самым обновляя регистр ссылок. Затем значение регистра номера вызывающего абонента может быть использовано, если вызывающий абонент не является нужным вам способом.
Наслаждайтесь.
не уверен, как это сделать с помощью gdb. Но вы можете объявить глобальную переменную типа:
bool call_a = false;
и когда b вызывать
call_a = true;
a();
и установить для call_a значение false, когда другая функция вызывает a () или после вашей точки останова
, затем используйте условие break
break [line-number] if call_a == true
gdb может обрабатывать это прямо сейчас, без необходимости в Python. Просто сделайте следующее:
b a if $_caller_is("b")
Более простое решение, чем скрипты Python, использует временную точку останова .
Это выглядит так:
b ParentFunction
command 1
tb FunctionImInterestedIn
c
end
Каждый раз, когда вы входите в ParentFunction
, вы установите единовременную точку останова на интересующую вас функцию, а затем продолжите работу (предположительно, пока вы не нажмете эту точку останова).
Так как вы разломаете ровно один раз на FunctionImInterestedIn
, это не сработает, если FunctionImInterestedIn
вызывается несколько раз в контексте ParentFunction
и вы хотите разбить каждый вызов.
Я тестировал это на 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