1

在以下代码中:

 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 行时,如果我们next在 gdb 上命令光标会转到第 26 行,如果我们命令stepgdb 将从 funcC 单步执行到 funcA,但是如何在不设置断点或步入 funcC 的情况下直接单步执行 funcB 或 funcA。

4

4 回答 4

3

没有任何直接的方法可以做到这一点。通常的方法是在感兴趣的函数中设置断点。

于 2012-08-01T20:17:29.713 回答
2

C 和 C++ 中函数的参数的求值顺序是未指定的。在某些约束下,编译器可以自由地重新排序/交错它们,但它认为合适。因此,您不能依赖funcC()before 被调用funcA()

如果您想确保参数将按特定顺序进行评估,请将它们分解为单独的语句,如下所示:

int a = funcA();
int b = funcB();
int c = funcC();
cout << funcAll(a, b, c,) << endl;

这也将使调试更容易。

如果你不想重写你的代码,你还有一些选择。最简单的方法就是在您感兴趣的函数中设置一个断点,例如:

break funcB

或者,如果您只需要这样做一次,请使用 atbreak而不是break设置一个临时断点,该断点将在第一次被击中后自行清除。

您还可以使用nextistepi指令一次执行一个汇编指令。通过使用disassemble命令查看反汇编,您可以使用 进入适当的调用站点(例如callx86 或 x86-64 或blPowerPC 上的指令)nexti,然后stepi进入它。 stepi和 和nexti一样工作stepnext除了它们在汇编指令而不是代码行上运行。

于 2012-08-01T20:20:31.897 回答
1

你踏入C,然后走出并踏入B

step
finish
step
于 2012-08-01T20:22:03.880 回答
0

您可以使用该until命令运行,直到到达特定行。它没有设置断点,它只停在那里一次。请参阅此处的文档。(具体来说,请参阅 上的文档until *location*。)

于 2012-08-01T20:19:36.173 回答