如何在C ++代码中使用行内的特定函数

时间:2012-08-01 20:14:44

标签: c++ gdb

在以下代码中:

 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内部步进。

4 个答案:

答案 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来设置临时断点,该断点将在首次点击后自行清除。

您还可以使用nextistepi指令一次执行一条汇编指令。通过使用disassemble命令查看反汇编,您可以使用{升级到相应的调用站点(例如x86或x86-64上的call指令或PowerPC上的bl)。 {1}},然后nexti进入它。 stepistepi的工作方式类似于nextistep,除非它们使用汇编指令而不是代码行。

答案 2 :(得分:1)

你走进C,然后走出去,进入B

step
finish
step

答案 3 :(得分:0)

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