GDB中的命令是什么才能进入流程中的下一个功能?

时间:2017-01-30 11:11:29

标签: gdb

我正在运行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行而没有放置任何断点? 那么,任何直接跳转到下一个函数的命令都会在代码流中被命中? 谢谢!

2 个答案:

答案 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,直到当前帧发生变化。此时你知道下级要么调用函数要么从当前函数返回。