c++ - 它是一个 gdb 错误吗?

标签 c++ string gdb

 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 step 时,调试顺序是:

第 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 行(这两个字符串变量)移动到第 9 行,就可以了。 gdb 不会显示第 18 行! 似乎字符串 var 导致了这个错误。

大家可以帮帮我吗? 谢谢!

最佳答案

此行为是旧版本 gcc/gdb 的“特性”,之前已在此处报告过:gdb unexpected behavior: in nested if .注意:此问题不能标记为与其他问题重复,因为没有令人满意的解决方案。

语句没有被执行。只是看起来像。

附录
很容易验证语句没有被执行。添加功能

int one() {
   return 1;
}

然后将 return 1; 替换为 return one(); gdb 将打印 return one(); 但它不会调用函数一个()。显然,旧版本的 gdb 在显示 if 语句上的右括号的执行时存在问题。

请注意:这只发生在旧版本的 gdb 上,而且这显然是显示问题,而不是程序执行不正确。

关于c++ - 它是一个 gdb 错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10977900/

相关文章:

c++ - boost::shared_ptr 标准容器

c++ - 按时间范围向 std::map 添加内容,但按时间值查询

c# - 如何将十六进制 "string"转换为 .NET 中的实际十六进制值?

string - 两个替换作为参数

c++ - 当优化从 -O2 减少时,Eclipse 丢失源位置

emacs - 通过emacs运行时设置gdb的环境

linux - 我可以指示 gdb 运行命令以响应 SIGTRAP 吗?

c++ - 使用指向类方法的指针作为函数的参数,但作为函数指针,而不是指向方法的指针

c++ - 为什么cmake的安装文件与实际构建的二进制文件不同?

java - 将字符串替换为我想要的内容时遇到问题