在以下代码中:
1 #include <iostream>
2
3 using namespace std;
4
5 int funcA(){
6 cout << "A" << endl;
7 return 1;
8 }
9
10 int funcB(){
11 cout << "B" << endl;
12 return 1;
13 }
14
15 int funcC(){
16 cout << "C" << endl;
17 return 1;
18 }
19
20 int funcAll( int a, int b, int c ){
21 return 1;
22 }
23
24 int main(){
25 cout << funcAll( funcA(), funcB(), funcC() ) << endl;
26 return 0;
27 }
28
将打印C,B,然后打印A.
但是当调试并停留在第25行时,如果我们在gdb上命令next
,则光标转到第26行,如果我们命令step
gdb将从funcC步进到funcA,但是如何直接执行在funcB OR funcA上没有设置断点或在funcC内部步进。
答案 0 :(得分:3)
没有任何直接的方法可以做到这一点;通常的方法是在感兴趣的函数中设置断点。
答案 1 :(得分:2)
未指定C和C ++中函数参数的评估顺序。在某些约束条件下,编译器可以自由地对它们进行重新排序/交错,但它认为合适。因此,您不能依赖于funcC()
之前调用funcA()
。
如果您想确保以特定顺序评估参数,请将它们分解为单独的语句,如下所示:
int a = funcA();
int b = funcB();
int c = funcC();
cout << funcAll(a, b, c,) << endl;
这也可以使调试更容易。
如果您不想重写代码,您仍然可以选择其他代码。最简单的方法是在你感兴趣的函数中设置一个断点,例如:
break funcB
或者,如果您只需要执行此操作一次,请使用tbreak
代替break
来设置临时断点,该断点将在首次点击后自行清除。
您还可以使用nexti
和stepi
指令一次执行一条汇编指令。通过使用disassemble
命令查看反汇编,您可以使用{升级到相应的调用站点(例如x86或x86-64上的call
指令或PowerPC上的bl
)。 {1}},然后nexti
进入它。 stepi
和stepi
的工作方式类似于nexti
和step
,除非它们使用汇编指令而不是代码行。
答案 2 :(得分:1)
你走进C,然后走出去,进入B
step
finish
step
答案 3 :(得分:0)
您可以使用until
命令运行,直到到达特定行。它没有设置断点,只停在那里一次。请参阅docs here。 (具体来说,请参阅until *location*
上的文档。)