【发布时间】: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”的符号是“array.1”(这让我感到困惑) .我可以使用 gdb 命令“info locals”找到相同的信息。无论如何,如果我在 gdb 中使用单引号,它就可以工作: (gdb) p 'array.1' 打印“array”的地址
-
有趣。使用
-std=c99编译时会发生什么?
标签: gcc