有关linux gdb 调试问题! 高手帮忙 No symbol "*" in current context

时间:2022-05-29 17:08:05
各位好
请教一个问题
问题描述如下:
    在linux环境下,我作了一个小程序,makefile文件是使用工具自动生成的,编译选项用了-g 但是当调试的时候却出了问题,gdb -> file filename-> p variable2
结果出现No symbol "variable2" in current context。的错误。
可是在添加variable2之前,曾经定义过另外一个变量variable1
当调试时却没有出现上面的问题!
请赐教
如言不达意 希望提出我没表述明白的地方。
谢谢

21 个解决方案

#1


呵呵,你不run,变量怎么有值

#2


哈哈 我没那么糊涂
:)
当然r 了
还有参数呢。
谢谢仁兄

#3


好像是因为可执行程序和源码不一致造成的。
确认最新的程序已经编译。
手工编译程序试试,不用make。

#4


我试试看 不过应该不可能 我是clean后make的

#5


不成

#6


你的编译器可能出问题。重起计算机。

#7


1。 你没有定义改变量
2。没有加-g选项
3。你没有重新编译和链接你的程序
最有可能是3

#8


gggzzz :)

#9


我也碰到过。这个问题,当时移动 定义的 位置就
可以了。

#10


我真希望是如各位所猜测
:((
可惜
:( 55

死马当活马医 重启 没有用

#11


局部变量在超出作用范围之后,symbol是不存在的。
可以试着定义成全局变量。
就我理解,能在symbol表中存在的变量都应该是全局的/静态的。

#12


都是在作用范围可见
我是在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);

#16


你的断点设在哪里

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 衷心感谢

#19


另外
那位高人告知在下
怎么看汇编 ?
怎么把他和源代码对应上?
??

#20


找一份gdb文档吧,里面有看汇编的内容。
大概就是你先指定一个c程序行号,然后gdb给你反汇编出来。

#21


-ggdb3,我一直用这个参数,从来都没有出过错,我想不出你是那儿错了

#1


呵呵,你不run,变量怎么有值

#2


哈哈 我没那么糊涂
:)
当然r 了
还有参数呢。
谢谢仁兄

#3


好像是因为可执行程序和源码不一致造成的。
确认最新的程序已经编译。
手工编译程序试试,不用make。

#4


我试试看 不过应该不可能 我是clean后make的

#5


不成

#6


你的编译器可能出问题。重起计算机。

#7


1。 你没有定义改变量
2。没有加-g选项
3。你没有重新编译和链接你的程序
最有可能是3

#8


gggzzz :)

#9


我也碰到过。这个问题,当时移动 定义的 位置就
可以了。

#10


我真希望是如各位所猜测
:((
可惜
:( 55

死马当活马医 重启 没有用

#11


局部变量在超出作用范围之后,symbol是不存在的。
可以试着定义成全局变量。
就我理解,能在symbol表中存在的变量都应该是全局的/静态的。

#12


都是在作用范围可见
我是在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);

#16


你的断点设在哪里

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 衷心感谢

#19


另外
那位高人告知在下
怎么看汇编 ?
怎么把他和源代码对应上?
??

#20


找一份gdb文档吧,里面有看汇编的内容。
大概就是你先指定一个c程序行号,然后gdb给你反汇编出来。

#21


-ggdb3,我一直用这个参数,从来都没有出过错,我想不出你是那儿错了