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版本都有这个问题。
BTW:如果将第14行,第15行(这2个字符串var)移动到第9行,它就可以了。 gdb不会显示第18行! 似乎字符串var导致了这个错误。
每个人都可以帮助我吗? 谢谢!
答案 0 :(得分:4)
此行为是旧版gcc / gdb的“功能”,之前已在此处报告过:gdb unexpected behavior: in nested if。注意:由于没有令人满意的解决方案,因此不能将此问题标记为其他问题的副本。
该声明未被执行。它只是看起来像。
<强>附录强>
很容易验证语句没有被执行。添加功能
int one() {
return 1;
}
然后将return 1;
替换为return one();
gdb将打印return one();
,但不会调用函数one()
。显然在旧版本的gdb中存在一个问题,它在if语句中显示了close括号的执行。
请注意:这只发生在旧版本的gdb中,显然是显示问题,而不是程序执行错误。