我正在运行GDB。我不想使用" s"命令并进入下一行。 我直接想跳转到代码流中下一个函数的起始行。 我没有放任何断点(因为我不知道哪个是下一个要击中的功能)。 有没有命令这样做?
对不起。我没有清楚地问我的问题。 我将举一个例子。
line#1 int function(int a)
line#2 {
line#3 int b;
line#4 b = 10;
line#5 b = b + a;
...... ...
...... ...
...... ...
...... ...
...... ...
...... ...
...... ...
...... ...
...... ...
...... ...
...... ...
...... ...
line#1000 if (10 == b)
line#1001 {
line#1002 func1();
line#1003 } else
line#1004 {
line#1005 func2();
line#1006 }
line#1007 } // function(int a);
...... ...
...... ...
...... ...
line#2000 void func1()
line#2001 {
line#2002 printf("hello\n");
line#2003 }
line#2004 void func2()
line#2005 {
line#2006 printf("hi\n");
line#2007 }
现在,我的控制权目前在第4行。 我不知道是否会调用func1,或者会调用func2。 我没有在func1或func2中放置任何断点。 由于function()是一个很大的功能,我不想使用" step"命令到达func1或func2。 在这种情况下,考虑" a"的价值。是0。 因此将调用func1()。 是否有任何命令直接从第4行跳到第#2000行而没有放置任何断点? 那么,任何直接跳转到下一个函数的命令都会在代码流中被命中? 谢谢!
答案 0 :(得分:1)
如果你的程序在输入函数时设置了帧基指针$bp
,你可以简单watch
,然后continue
,执行将在进入另一个函数后停止。 (当函数返回时,这也将停止执行。)
请注意,某些编译器根本不会发出使用帧基指针的代码,有些编译器可能会选择不更新没有任何局部变量的函数中的指针。
$ gdb -q args
(gdb) list
1 main(int argc, char **argv)
2 {
3 for(int i=0; i<argc; i++)
4 printf("arg %d is %s\n", i, argv[i]);
5 }
(gdb) start
Temporary breakpoint 1, main (argc=1, argv=0x7fffffffdfa8) at args.c:3
3 for(int i=0; i<argc; i++)
(gdb) watch $bp
Watchpoint 2: $bp
(gdb) c
Continuing.
Watchpoint 2: $bp
Old value = -8608
New value = -8880
0x0000000000453e24 in vfprintf ()
(gdb) bt
#0 0x0000000000453e24 in vfprintf ()
#1 0x000000000040f3d6 in printf ()
#2 0x00000000004009f1 in main (argc=1, argv=0x7fffffffdfa8) at args.c:4
答案 1 :(得分:0)
在gdb中没有内置命令来执行此操作。
如果你想实现它,你可能在Python中这样做。想法是记录当前帧,然后重复调用step
,直到当前帧发生变化。此时你知道下级要么调用函数要么从当前函数返回。