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 test

为什么 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 行(这两个字符串 var)移动到第 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 回答