【问题标题】:gcc does not produce debugging symbols for local variable-length arrays (or gdb doesn't find them)gcc 不会为局部可变长度数组生成调试符号(或 gdb 找不到它们)
【发布时间】:2014-08-06 13:01:18
【问题描述】:

显然 gdb 找不到与局部变长数组相关的符号。
是gcc问题还是gdb问题? (或者也许这只是我的问题......)。
取以下程序“main.c”

#include <stdio.h>
#include <stdlib.h>

int main( int argc, char **argv ) {
    int n;
    n = random() & 0xf;
    int array[n];
    int *array_pt = array;
    int i;
    for (i=0; i<n; i++) {
        array[i] = random()&0xffff;
    }
    return(0);
}

编译为:
gcc -c -O0 -g -ggdb -Wall main.c -o main.o
gcc main.o -o main

如果我现在在 gdb 下运行它,我发现符号“array_pt”是已知的,但“array”不是。

(gdb) p array
No symbol "array" in current context.
(gdb) p array_pt 
$1 = (int *) 0x7fff5fbff6f0

我通过使用指针来规避问题,如示例所示,但是……这正常吗?


根据@Michael 的建议,我将包含 dwarfdump 的相关输出

0x000000d5:         TAG_variable [5]  
         AT_name( "array.1" )
         AT_decl_file( "/.../main.c" )
         AT_decl_line( 7 )
         AT_type( {0x00000152} ( int[]* ) )
         AT_location( fbreg -56 )

0x00000104:             TAG_variable [5]  
             AT_name( "array_pt" )
             AT_decl_file( "/.../main.c" )
             AT_decl_line( 8 )
             AT_type( {0x0000015a} ( int* ) )
             AT_location( fbreg -72 )

【问题讨论】:

  • 您很可能在array 初始化之前发出p array。在 for 循环中设置断点,并验证它是否仍在发生。
  • 另外,您可以并且应该使用dwarfdump 来验证目标文件/dSYM 包中是否存在符号信息。
  • “p array”命令是在循环内部发出的,经过几次循环迭代......
  • 我找到了一个相当令人满意的解决方法,但不知何故我仍然感到困惑:dwarfdump 输出显示“array”的符号是“ar​​ray.1”(这让我感到困惑) .我可以使用 gdb 命令“info locals”找到相同的信息。无论如何,如果我在 gdb 中使用单引号,它就可以工作: (gdb) p 'array.1' 打印“array”的地址
  • 有趣。使用-std=c99 编译时会发生什么?

标签: gcc


【解决方案1】:

噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢! 我刚刚发现在我的机器(os x 10.7.5)上 gcc 不是 gcc!
这只是一个链接 /usr/bin/gcc@ -> llvm-gcc-4.2

我在一台装有正版 gcc 的机器上做了同样的实验,一切正常! “数组”的符号是……你瞧……“数组”。

所以这是一个 llvm 的事情。对不起大家。 就 gcc 而言,案件已结案。 如果我用clang编译,那就更糟了。根本不为“数组”生成任何符号。

我应该用不同的标题在 llvm-ggc 标签下重新发布问题。

【讨论】:

    【解决方案2】:

    gdb 7.8 现在应​​该支持这个:

    2014 年 7 月 29 日,星期二

    GDB 7.8 带来了新的目标、特性和改进,包括:

    ...

    • ISO C99 可变长度自动数组支持。

    http://lwn.net/Articles/607108/

    确实在 ubuntu 14.10 utopic 上它对我有用:

    # gcc -g3 test.c -O0
    # gdb ./a.out
    GNU gdb (Ubuntu 7.8-0ubuntu1) 7.8
    (gdb) break main
    Breakpoint 1 at 0x4005be: file test.c, line 4.
    (gdb) r
    Starting program: /a.out 
    
    Breakpoint 1, main (argc=1, argv=0x7fffffffe2d8) at test.c:4
    4   int main( int argc, char **argv ) { 
    (gdb) n
    6       n = random() & 0xf;
    (gdb) 
    7       int array[n];
    (gdb) 
    8       int *array_pt = array;
    (gdb) p array
    $1 = {-136403536, 32767, -134225464, 1804289383, 3, 0, 4195800}
    (gdb) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多