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/