代码之家  ›  专栏  ›  技术社区  ›  Ben2209

gdb:当前上下文中没有符号“i”

  •  21
  • Ben2209  · 技术社区  · 15 年前

    循环如下:

    for (i=0; i < datasize; i++){  
        if ( feature_mask[i] > 0 ){  
            k = feature_mask[i] - 1;  
            if (neighbors[k][nmax-1] != 0){
                neighbors[k][nmax-1] = bvalue;  
                feature_mask[i] = -feature_mask[i];
            }
        }
    }
    
    5 回复  |  直到 7 年前
        1
  •  24
  •   a'r    15 年前

    它可能已经优化了您编译的代码,因为您只使用 feature_mask[i] 在循环中。

    调用编译器时是否指定了优化级别?如果您使用的是gcc,那么只需省略任何 -O 选项,然后重试。

        2
  •  25
  •   Yuan Wen bayda    9 年前

    我最近遇到了这个问题。我编译了GCC 5.1,然后用它编译C++ 11代码库。而且,尽管我可以在gdb中单步遍历程序的代码,但我无法打印任何变量的值,例如,我不断地得到“No symbol”xyz“in current context”错误 每一个 变量。

    我猜GCC5.1的调试信息与GDB7.4不兼容。

        3
  •  5
  •   unwind    15 年前

        4
  •  3
  •   pmg    15 年前

    你可以试着宣布我是 volatile . 这将阻止一些编译器优化(并希望使 i

        5
  •  2
  •   Aaron Digulla    15 年前

    检查优化选项。GCC有可能用一个指向 feature_mask

        6
  •  0
  •   Gabriel Staples    5 年前

    以防其他人使用谷歌的 Bazel build system 任何 gdb 适当地 添加 -ggdb -O0 ( 更新: use -Og instead of -O0 使用 结束 -奥格 --copt= --per_file_copt= 技术允许我充分使用gdb和print变量,而 --每个文件\u copt= 其中一个还允许我使用gdb,但不允许我打印变量。

    注意:在下面的示例中,只需替换 test 具有 build 如果不需要运行单元测试。

    乌德帕特:事实证明,你应该更喜欢 -奥格 结束 在进行调试时,我会相应地更新这些示例。 What's the difference between a compiler's `-O0` option and `-Og` option? .

    所以,这样做:

    time bazel test --copt=-ggdb --copt=-O0 \
    //my/build/folder1/... //my/build/folder2/...
    

    而不是这样:

    time bazel test --per_file_copt=//my/build/folder1/...,//my/build/folder2/...@-ggdb,-O0 \
    //my/build/folder1/... //my/build/folder2/...
    

    …以便能够从gdb中打印变量。

    再一次, 二者都 只有第一个 gdb公司 最大限度地

    最后,如果上面的第一个命令仍然不起作用,请尝试添加 --strip=never described here 以防止Bazel剥离调试信息。现在命令将如下所示:

    time bazel test --copt=-ggdb --copt=-O0 --strip=never \
    //my/build/folder1/... //my/build/folder2/...
    

    参考文件:

    1. :
      1. https://docs.bazel.build/versions/master/command-line-reference.html#flag--copt
      2. https://docs.bazel.build/versions/master/user-manual.html#flag--copt
    2. --per_file_copt
      1. https://docs.bazel.build/versions/master/command-line-reference.html#flag--per_file_copt
      2. [更好,举例说明] https://docs.bazel.build/versions/master/user-manual.html#flag--per_file_copt
    3. --剥离=从不
      1. https://docs.bazel.build/versions/master/user-manual.html#flag--strip
    4. [我自己的问答]更喜欢 -奥格 -O0公司 结束 -奥格 用于调试: 编译器的“-O0”选项和“-Og”选项有什么区别?