出现GDB No symbol "xxx" in current context的几种原因分析

编程入门 行业动态 更新时间:2024-10-24 20:15:52

在进行gdb调试时(包括使用core dump文件调试),经常出现GDB No symbol “xxx” in current context问题,常见的几种原因如下:

1、使用gcc编译的时候未使用-g选项。或者加了-g选项,同时使用了-o选项。建议编译的时候使用-g选项的时候,同时使用-Og可以关闭编译优化(-O选项较低gcc版本不支持)。

2、编译的可执行程序的调试信息格式与GDB所支持的不一致。
编译的时候,如果使用了-g选项,GCC4.8及其以上的版本默认使用-gdwarf-4 -fno-debug-types-section选项,也就是使用DWARF4调试信息格式。而这之前的版本只支持DWARF2或者DWARF3。GDB 7.5,Valgrind 3.8.0和elfutils 0.154这些版本及其以上版本的工具默认使用DWARF4调试信息格式。要确保可执行文件调试信息格式与调试工具所支持的是一致的。如果gdb的版本只支持DWARF2或者DWARF3,在使用gcc编译的时候可以使用-gdwarf-2或-gdwarf-3选项来指定调试信息格式,已和gdb保持一致。

使用readelf PROCESS_NAME --debug-dump=info命令可把可执行文件(elf)中的调试信息格式dump出来,如下:

3、当前栈帧无该符号
如何理解此点的意思?举个例子,程序从函数func1进入函数func2执行,此时print func1中的变量,则会出现No symbol,因为func1的作用域仅限与func1内部。进一步举例如下:
示例代码:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

int main(int argc,char *argv[])
{
        int len=5;
        int i;
        int *pt=(int*)malloc(len*sizeof(int));
        int *p=pt;

        for(i=0;i<len;i++){p++;}

        *p=5;
        printf("%d\n",*p);
        abort();
        return 0;
}

使用gdb调试以上程序产生的coredump文件,并打印len变量的值,出现了“No symbol”提示信息。我们使用bt命令看看当前的程序在哪里执行,发现当前在raise函数中执行。raise函数不存在len变量,因此会出现“No symbol”提示。

但是有时处于分析问题的需要,需要查看当前执行函数之外的信息,这个时候我们可以使用gdb的up命令。如下:

执行两次up 1后,进入main函数作用域,这个时候再print len,len的只被输出来。

更多推荐

出现GDB No symbol "xxx" in current context的几种原因分析

本文发布于:2023-06-14 01:19:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1421997.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:几种   原因   quot   symbol   GDB

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!