4
 1 #include "string"
 2 using namespace std;
 3 
 4 bool m_bInited = true;
 5 int  m_imaxsize = 100;
 6 
 7 int test()
 8 {
 9     if (!m_bInited)
10     {
11         return -1;
12     }
13 
14     std::string gbkInput = "";
15     std::string utf8Input = "";
16     if (gbkInput.size() > m_imaxsize)
17     {
18         return 1;
19     }
20     return 0;
21 }
22 
23 int main()
24 {
25     test();
26     return 0;
27 }

16 行目から gdb ステップを使用する場合、デバッグ シーケンスは次のようになります。

16行目→20行目→18行目→21行目。

    (gdb) b 16
    (gdb) r
    Breakpoint 1, test () at main.cpp:16
    16          if (gbkInput.size() > m_imaxsize)
    (gdb) n
    20          return 0;
    (gdb) n
    18              return 1;
    (gdb) n
    21      }

コンパイル: g++ -g main.cpp -o テスト

なぜgdbは18行目を表示するのですか? test() の戻り値は 0 です。

私の gcc バージョンは 4.1.2 です。GNU gdb Fedora (6.8-37.el5) または GNU gdb (GDB) Red Hat Enterprise Linux (7.0.1-37.el5) 。両方の gdb バージョンにこの問題があります。

ところで: 行 14、行 15 (これら 2 つの文字列変数) を行 9 に移動すると、問題ありません。gdb は 18 行目を表示しません! 文字列 var がこのバグを引き起こしているようです。

誰もが私を助けることができますか?ありがとうございました!

4

1 に答える 1

4

この動作は gcc/gdb の古いバージョンの「機能」であり、以前にここで報告されています: gdb の予期しない動作: ネストされた if 内。注: 満足のいく解決策がなかったため、この質問を他の質問の重複としてマークすることはできません。

ステートメントは実行されていません。それはちょうどそれのように見えます。

補遺
ステートメントが実行されていないことを確認するのは簡単です。関数を追加する

int one() {
   return 1;
}

return 1;次に、それをreturn one();gdb に置き換えますreturn one();が、関数は呼び出されませんone()。古いバージョンの gdb には、if ステートメントで右中括弧の実行を表示する際に問題があるようです。

注意: これは古いバージョンの gdb でのみ発生し、プログラムの実行が正しくないというよりは、明らかに表示の問題です。

于 2012-06-11T12:51:32.427 に答える