请教一个问题
问题描述如下:
在linux环境下,我作了一个小程序,makefile文件是使用工具自动生成的,编译选项用了-g 但是当调试的时候却出了问题,gdb -> file filename-> p variable2
结果出现No symbol "variable2" in current context。的错误。
可是在添加variable2之前,曾经定义过另外一个变量variable1
当调试时却没有出现上面的问题!
请赐教
如言不达意 希望提出我没表述明白的地方。
谢谢
21 个解决方案
#1
呵呵,你不run,变量怎么有值
#2
哈哈 我没那么糊涂
:)
当然r 了
还有参数呢。
谢谢仁兄
:)
当然r 了
还有参数呢。
谢谢仁兄
#3
好像是因为可执行程序和源码不一致造成的。
确认最新的程序已经编译。
手工编译程序试试,不用make。
确认最新的程序已经编译。
手工编译程序试试,不用make。
#4
我试试看 不过应该不可能 我是clean后make的
#5
不成
#6
你的编译器可能出问题。重起计算机。
#7
1。 你没有定义改变量
2。没有加-g选项
3。你没有重新编译和链接你的程序
最有可能是3
2。没有加-g选项
3。你没有重新编译和链接你的程序
最有可能是3
#8
gggzzz :)
#9
我也碰到过。这个问题,当时移动 定义的 位置就
可以了。
可以了。
#10
我真希望是如各位所猜测
:((
可惜
:( 55
死马当活马医 重启 没有用
:((
可惜
:( 55
死马当活马医 重启 没有用
#11
局部变量在超出作用范围之后,symbol是不存在的。
可以试着定义成全局变量。
就我理解,能在symbol表中存在的变量都应该是全局的/静态的。
可以试着定义成全局变量。
就我理解,能在symbol表中存在的变量都应该是全局的/静态的。
#12
都是在作用范围可见
我是在main定义的 在没有调用其他函数前 r后就p察看 没有
r 一段 也没有
还未解决
我是在main定义的 在没有调用其他函数前 r后就p察看 没有
r 一段 也没有
还未解决
#13
大虾 们帮忙啊。
#14
被gcc优化掉了?
看一看对应的汇编代码在干什么?
看一看对应的汇编代码在干什么?
#15
看不懂啊。谁帮忙啊?!!!
谢谢了
汇编 源码 部分列在下面
0x8049fa8 <main>: push %ebp
0x8049fa9 <main+1>: mov %esp,%ebp
0x8049fab <main+3>: push %edi
0x8049fac <main+4>: push %esi
0x8049fad <main+5>: push %ebx
0x8049fae <main+6>: sub $0x3c,%esp
0x8049fb1 <main+9>: and $0xfffffff0,%esp
0x8049fb4 <main+12>: sub $0x8,%esp
0x8049fb7 <main+15>: push $0x62
0x8049fb9 <main+17>: push $0x805a7f1
0x8049fbe <main+22>: mov 0x8(%ebp),%esi
0x8049fc1 <main+25>: mov 0xc(%ebp),%ebx
0x8049fc4 <main+28>: movl $0x0,0xffffffd0(%ebp)
0x8049fcb <main+35>: movl $0x0,0xffffffcc(%ebp)
0x8049fd2 <main+42>: movl $0x0,0xffffffc8(%ebp)
0x8049fd9 <main+49>: movl $0x0,0xffffffc4(%ebp)
0x8049fe0 <main+56>: movl $0x0,0xffffffc0(%ebp)
0x8049fe7 <main+63>: movl $0x0,0xffffffbc(%ebp)
0x8049fee <main+70>: movl $0x14,0x806a904
0x8049ff8 <main+80>: movl $0x35303235,0xffffffd8(%ebp)
0x8049fff <main+87>: movw $0x32,0xffffffdc(%ebp)
0x804a005 <main+93>: xor %edi,%edi
0x804a007 <main+95>: call 0x8049b90 <printf>
0x804a00c <main+100>: add $0x10,%esp
0x804a00f <main+103>: nop
0x804a010 <main+104>: push %eax
0x804a011 <main+105>: push $0x805a7f6
0x804a016 <main+110>: push %ebx
0x804a017 <main+111>: push %esi
int main(int argc, char * argv[])
{
int test;
int ret, op;
char * theOpts = "a:c:i:n:u:D";
char *netid = NULL, *device = NULL, *config = NULL;
char * user_num = NULL;
char *dstAddr = NULL;
u_char *auth_addr = NULL;
int daemon = 0; /* no daemon by default */
FILE *pidfile = NULL;
int pid;
char gao[6];
/* check for existing copies of the program */
char gao2;
char lirui='a';
User_Num = 20;
test =1;
gao2 = 'a';
strcpy(gao,"52052");
test = 2;
gao2 = 'b';
lirui='b';
printf("%c \n",gao2);
谢谢了
汇编 源码 部分列在下面
0x8049fa8 <main>: push %ebp
0x8049fa9 <main+1>: mov %esp,%ebp
0x8049fab <main+3>: push %edi
0x8049fac <main+4>: push %esi
0x8049fad <main+5>: push %ebx
0x8049fae <main+6>: sub $0x3c,%esp
0x8049fb1 <main+9>: and $0xfffffff0,%esp
0x8049fb4 <main+12>: sub $0x8,%esp
0x8049fb7 <main+15>: push $0x62
0x8049fb9 <main+17>: push $0x805a7f1
0x8049fbe <main+22>: mov 0x8(%ebp),%esi
0x8049fc1 <main+25>: mov 0xc(%ebp),%ebx
0x8049fc4 <main+28>: movl $0x0,0xffffffd0(%ebp)
0x8049fcb <main+35>: movl $0x0,0xffffffcc(%ebp)
0x8049fd2 <main+42>: movl $0x0,0xffffffc8(%ebp)
0x8049fd9 <main+49>: movl $0x0,0xffffffc4(%ebp)
0x8049fe0 <main+56>: movl $0x0,0xffffffc0(%ebp)
0x8049fe7 <main+63>: movl $0x0,0xffffffbc(%ebp)
0x8049fee <main+70>: movl $0x14,0x806a904
0x8049ff8 <main+80>: movl $0x35303235,0xffffffd8(%ebp)
0x8049fff <main+87>: movw $0x32,0xffffffdc(%ebp)
0x804a005 <main+93>: xor %edi,%edi
0x804a007 <main+95>: call 0x8049b90 <printf>
0x804a00c <main+100>: add $0x10,%esp
0x804a00f <main+103>: nop
0x804a010 <main+104>: push %eax
0x804a011 <main+105>: push $0x805a7f6
0x804a016 <main+110>: push %ebx
0x804a017 <main+111>: push %esi
int main(int argc, char * argv[])
{
int test;
int ret, op;
char * theOpts = "a:c:i:n:u:D";
char *netid = NULL, *device = NULL, *config = NULL;
char * user_num = NULL;
char *dstAddr = NULL;
u_char *auth_addr = NULL;
int daemon = 0; /* no daemon by default */
FILE *pidfile = NULL;
int pid;
char gao[6];
/* check for existing copies of the program */
char gao2;
char lirui='a';
User_Num = 20;
test =1;
gao2 = 'a';
strcpy(gao,"52052");
test = 2;
gao2 = 'b';
lirui='b';
printf("%c \n",gao2);
#16
你的断点设在哪里
gcc -c -g -Wall *.c
gcc -o * *.o
这样的编译没有加优化选项.不会去掉调试信息.
gcc -c -g -Wall *.c
gcc -o * *.o
这样的编译没有加优化选项.不会去掉调试信息.
#17
可能是被优化掉了!你的GDB的错误信息是什么?
#18
to CoolQ()题目就是错误信息。 :)
to bnwxf
OK了。 谢谢
原来的Makefile里加 -O2 了 忘删了
好判断力!!!佩服
:)
另一个贴字帮看看
http://expert.csdn.net/Expert/topic/1602/1602720.xml?temp=.8393366
大家也去看看
谢了
再在问题区留一两个小时 分都给你bnwx 衷心感谢
to bnwxf
OK了。 谢谢
原来的Makefile里加 -O2 了 忘删了
好判断力!!!佩服
:)
另一个贴字帮看看
http://expert.csdn.net/Expert/topic/1602/1602720.xml?temp=.8393366
大家也去看看
谢了
再在问题区留一两个小时 分都给你bnwx 衷心感谢
#19
另外
那位高人告知在下
怎么看汇编 ?
怎么把他和源代码对应上?
??
谢
那位高人告知在下
怎么看汇编 ?
怎么把他和源代码对应上?
??
谢
#20
找一份gdb文档吧,里面有看汇编的内容。
大概就是你先指定一个c程序行号,然后gdb给你反汇编出来。
大概就是你先指定一个c程序行号,然后gdb给你反汇编出来。
#21
-ggdb3,我一直用这个参数,从来都没有出过错,我想不出你是那儿错了
#1
呵呵,你不run,变量怎么有值
#2
哈哈 我没那么糊涂
:)
当然r 了
还有参数呢。
谢谢仁兄
:)
当然r 了
还有参数呢。
谢谢仁兄
#3
好像是因为可执行程序和源码不一致造成的。
确认最新的程序已经编译。
手工编译程序试试,不用make。
确认最新的程序已经编译。
手工编译程序试试,不用make。
#4
我试试看 不过应该不可能 我是clean后make的
#5
不成
#6
你的编译器可能出问题。重起计算机。
#7
1。 你没有定义改变量
2。没有加-g选项
3。你没有重新编译和链接你的程序
最有可能是3
2。没有加-g选项
3。你没有重新编译和链接你的程序
最有可能是3
#8
gggzzz :)
#9
我也碰到过。这个问题,当时移动 定义的 位置就
可以了。
可以了。
#10
我真希望是如各位所猜测
:((
可惜
:( 55
死马当活马医 重启 没有用
:((
可惜
:( 55
死马当活马医 重启 没有用
#11
局部变量在超出作用范围之后,symbol是不存在的。
可以试着定义成全局变量。
就我理解,能在symbol表中存在的变量都应该是全局的/静态的。
可以试着定义成全局变量。
就我理解,能在symbol表中存在的变量都应该是全局的/静态的。
#12
都是在作用范围可见
我是在main定义的 在没有调用其他函数前 r后就p察看 没有
r 一段 也没有
还未解决
我是在main定义的 在没有调用其他函数前 r后就p察看 没有
r 一段 也没有
还未解决
#13
大虾 们帮忙啊。
#14
被gcc优化掉了?
看一看对应的汇编代码在干什么?
看一看对应的汇编代码在干什么?
#15
看不懂啊。谁帮忙啊?!!!
谢谢了
汇编 源码 部分列在下面
0x8049fa8 <main>: push %ebp
0x8049fa9 <main+1>: mov %esp,%ebp
0x8049fab <main+3>: push %edi
0x8049fac <main+4>: push %esi
0x8049fad <main+5>: push %ebx
0x8049fae <main+6>: sub $0x3c,%esp
0x8049fb1 <main+9>: and $0xfffffff0,%esp
0x8049fb4 <main+12>: sub $0x8,%esp
0x8049fb7 <main+15>: push $0x62
0x8049fb9 <main+17>: push $0x805a7f1
0x8049fbe <main+22>: mov 0x8(%ebp),%esi
0x8049fc1 <main+25>: mov 0xc(%ebp),%ebx
0x8049fc4 <main+28>: movl $0x0,0xffffffd0(%ebp)
0x8049fcb <main+35>: movl $0x0,0xffffffcc(%ebp)
0x8049fd2 <main+42>: movl $0x0,0xffffffc8(%ebp)
0x8049fd9 <main+49>: movl $0x0,0xffffffc4(%ebp)
0x8049fe0 <main+56>: movl $0x0,0xffffffc0(%ebp)
0x8049fe7 <main+63>: movl $0x0,0xffffffbc(%ebp)
0x8049fee <main+70>: movl $0x14,0x806a904
0x8049ff8 <main+80>: movl $0x35303235,0xffffffd8(%ebp)
0x8049fff <main+87>: movw $0x32,0xffffffdc(%ebp)
0x804a005 <main+93>: xor %edi,%edi
0x804a007 <main+95>: call 0x8049b90 <printf>
0x804a00c <main+100>: add $0x10,%esp
0x804a00f <main+103>: nop
0x804a010 <main+104>: push %eax
0x804a011 <main+105>: push $0x805a7f6
0x804a016 <main+110>: push %ebx
0x804a017 <main+111>: push %esi
int main(int argc, char * argv[])
{
int test;
int ret, op;
char * theOpts = "a:c:i:n:u:D";
char *netid = NULL, *device = NULL, *config = NULL;
char * user_num = NULL;
char *dstAddr = NULL;
u_char *auth_addr = NULL;
int daemon = 0; /* no daemon by default */
FILE *pidfile = NULL;
int pid;
char gao[6];
/* check for existing copies of the program */
char gao2;
char lirui='a';
User_Num = 20;
test =1;
gao2 = 'a';
strcpy(gao,"52052");
test = 2;
gao2 = 'b';
lirui='b';
printf("%c \n",gao2);
谢谢了
汇编 源码 部分列在下面
0x8049fa8 <main>: push %ebp
0x8049fa9 <main+1>: mov %esp,%ebp
0x8049fab <main+3>: push %edi
0x8049fac <main+4>: push %esi
0x8049fad <main+5>: push %ebx
0x8049fae <main+6>: sub $0x3c,%esp
0x8049fb1 <main+9>: and $0xfffffff0,%esp
0x8049fb4 <main+12>: sub $0x8,%esp
0x8049fb7 <main+15>: push $0x62
0x8049fb9 <main+17>: push $0x805a7f1
0x8049fbe <main+22>: mov 0x8(%ebp),%esi
0x8049fc1 <main+25>: mov 0xc(%ebp),%ebx
0x8049fc4 <main+28>: movl $0x0,0xffffffd0(%ebp)
0x8049fcb <main+35>: movl $0x0,0xffffffcc(%ebp)
0x8049fd2 <main+42>: movl $0x0,0xffffffc8(%ebp)
0x8049fd9 <main+49>: movl $0x0,0xffffffc4(%ebp)
0x8049fe0 <main+56>: movl $0x0,0xffffffc0(%ebp)
0x8049fe7 <main+63>: movl $0x0,0xffffffbc(%ebp)
0x8049fee <main+70>: movl $0x14,0x806a904
0x8049ff8 <main+80>: movl $0x35303235,0xffffffd8(%ebp)
0x8049fff <main+87>: movw $0x32,0xffffffdc(%ebp)
0x804a005 <main+93>: xor %edi,%edi
0x804a007 <main+95>: call 0x8049b90 <printf>
0x804a00c <main+100>: add $0x10,%esp
0x804a00f <main+103>: nop
0x804a010 <main+104>: push %eax
0x804a011 <main+105>: push $0x805a7f6
0x804a016 <main+110>: push %ebx
0x804a017 <main+111>: push %esi
int main(int argc, char * argv[])
{
int test;
int ret, op;
char * theOpts = "a:c:i:n:u:D";
char *netid = NULL, *device = NULL, *config = NULL;
char * user_num = NULL;
char *dstAddr = NULL;
u_char *auth_addr = NULL;
int daemon = 0; /* no daemon by default */
FILE *pidfile = NULL;
int pid;
char gao[6];
/* check for existing copies of the program */
char gao2;
char lirui='a';
User_Num = 20;
test =1;
gao2 = 'a';
strcpy(gao,"52052");
test = 2;
gao2 = 'b';
lirui='b';
printf("%c \n",gao2);
#16
你的断点设在哪里
gcc -c -g -Wall *.c
gcc -o * *.o
这样的编译没有加优化选项.不会去掉调试信息.
gcc -c -g -Wall *.c
gcc -o * *.o
这样的编译没有加优化选项.不会去掉调试信息.
#17
可能是被优化掉了!你的GDB的错误信息是什么?
#18
to CoolQ()题目就是错误信息。 :)
to bnwxf
OK了。 谢谢
原来的Makefile里加 -O2 了 忘删了
好判断力!!!佩服
:)
另一个贴字帮看看
http://expert.csdn.net/Expert/topic/1602/1602720.xml?temp=.8393366
大家也去看看
谢了
再在问题区留一两个小时 分都给你bnwx 衷心感谢
to bnwxf
OK了。 谢谢
原来的Makefile里加 -O2 了 忘删了
好判断力!!!佩服
:)
另一个贴字帮看看
http://expert.csdn.net/Expert/topic/1602/1602720.xml?temp=.8393366
大家也去看看
谢了
再在问题区留一两个小时 分都给你bnwx 衷心感谢
#19
另外
那位高人告知在下
怎么看汇编 ?
怎么把他和源代码对应上?
??
谢
那位高人告知在下
怎么看汇编 ?
怎么把他和源代码对应上?
??
谢
#20
找一份gdb文档吧,里面有看汇编的内容。
大概就是你先指定一个c程序行号,然后gdb给你反汇编出来。
大概就是你先指定一个c程序行号,然后gdb给你反汇编出来。
#21
-ggdb3,我一直用这个参数,从来都没有出过错,我想不出你是那儿错了