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

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

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

使用gdb调试以上程序产生的coredump文件,并打印len变量的值,出现了“No symbol”提示信息。我们使用bt命令看看当前的程序在哪里执行,发现当前在raise函数中执行。raise函数不存在len变量,因此会出现“No symbol”提示。
出现GDB No symbol
但是有时处于分析问题的需要,需要查看当前执行函数之外的信息,这个时候我们可以使用gdb的up命令。如下:
在这里插入图片描述
执行两次up 1后,进入main函数作用域,这个时候再print len,len的只被输出来。

你可能感兴趣的:(gdb)