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

There isn't any direct way to do this; the usual method is to set a breakpoint in the function of interest.

于 2012-08-01T20:17:29.713 に答える
2

C および C++ の関数の引数の評価順序は規定されていません。コンパイラは、特定の制約の範囲内で、それらを自由に並べ替えたりインターリーブしたりできます。funcC()したがって、前に呼び出されることに依存することはできませんfuncA()

引数が特定の順序で評価されるようにしたい場合は、次のように別々のステートメントに分割します。

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

これにより、デバッグも容易になります。

コードを書き直したくない場合でも、いくつかの代替手段があります。最も簡単な方法は、目的の関数内にブレークポイントを設定することです。たとえば、次のようになります。

break funcB

または、これを一度だけ行う必要がある場合は、最初にヒットした後に自動的にクリアされる一時的なブレークポイントを設定するtbreak代わりにa を使用します。break

nextiおよび命令を使用してstepi、一度に 1 つのアセンブリ命令をステップ実行することもできます。コマンドで逆アセンブルを見ると、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 に答える