首页 > 解决方案 > 单步执行循环时的gdb怪异

问题描述

我有这个简单的 C++ 程序:

#include <string>
#include <iostream>
using namespace std;

int main()
{
    for (int i = 0; i < 5; i++)
    {
        string a = "apple";
        cout << a << endl;
        string b = "banana";
        string c = "cherry";
    }

    return 0;
}

逐行遍历时,每次到达“c”时,它都会返回到“b”,然后是“a”(它会跳过“cout”行)。一旦它到达“for”行,它将通过循环前进,但当它再次到达“c”时,它将再次向后退。

我正在使用 -g -Og -fno-inline 标志进行编译。我尝试将 -Og 更改为 -O0 并将 -g 更改为 -g3 和 -ggdb。这些东西都没有帮助。

但是,如果我将字符串更改为 char*,问题就会消失。

我的操作系统是 Linux Mint。

示例 gdb 输出:

Reading symbols from debug-test...done.
(gdb) b main
Breakpoint 1 at 0xb98: file debug-test.cc, line 6.
(gdb) r
Starting program: /home/brian/workspace/debug-test/debug-test 

Breakpoint 1, main () at debug-test.cc:6
6   {
(gdb) n
7       for (int i = 0; i < 5; i++)
(gdb) n
9           string a = "apple";
(gdb) n
10          cout << a << endl;
(gdb) n
apple
11          string b = "banana";
(gdb) n
12          string c = "cherry";
(gdb) n
11          string b = "banana";
(gdb) n
9           string a = "apple";
(gdb) n
7       for (int i = 0; i < 5; i++)
(gdb) n
9           string a = "apple";
(gdb) n
10          cout << a << endl;
(gdb) n
apple
11          string b = "banana";
(gdb) n
12          string c = "cherry";
(gdb) 

标签: c++gdb

解决方案


这已经在调试信息生成中报告了 gcc 错误:
https ://gcc.gnu.org/bugzilla/show_bug.cgi?id=88742 。

作为一种解决方法,您可以使用 clang 而不是 gcc,clang 会生成正确的调试信息而无需跳转。


推荐阅读