gdb调试嵌入式设备的core文件

  • 调试嵌入式设备时,产生了一个段错误,查资料后明白了如何使用gdb调试该段错误的基本方法,记录一下,免得以后遇见,又忘记怎么操作,有错误之处望联系指出

1、生成core文件

由于该嵌入式设备本身不支持gdb,所以还是生成core文件,拿到虚拟机中进行调试

  • 使用以下命令生成core文件
    ulimit -c
    ulimit -c unlimited
    echo "/opt/core.%e.%t" > /proc/sys/kernel/core_pattern
    cat /proc/sys/kernel/core_pattern	
    

    ①如果ulimit -c命令打印得出的是0,则表示不支持生成core文件,然后需要使用ulimit -c unlimited命令;
    /proc/sys/kernel/core_pattern文件是生成的core文件所放的位置,可以使用cat /proc/sys/kernel/core_pattern命令查看。也可以自定义core文件生成的位置,比如使用命令echo "/opt/core.%e.%t" > /proc/sys/kernel/core_pattern,将生成的core文件保存到/opt目录,并命令为core.%e.%t%e指运行的程序或进程,%t指生成随机数

2、调试core文件

  • 1、将生成的core文件移动到虚拟机中,可以将该嵌入式设备文件系统挂载到虚拟机中,参考NFS挂载嵌入式设备文件系统。还需要将产生段错误时,所运行的可执行程序一起复制到虚拟机中,另外还需要将所运行的可执行程序所依赖的所有库全部复制到虚拟机中,并且保持库在摄像头时,所在目录的位置,即保证路径要相同

  • 2、使用以下命令开始调试

    ./mips-linux-gnu-gdb ipcam core.ipcam.2398
    

    mips-linux-gnu-gdb是我的摄像头平台所支持的gdb,如果嵌入式设备的系统不支持使用gdb,需要自行安装嵌入式设备平台所支持的gdb
    ipcam是我产生段错误时,所运行的程序;
    core.ipcam.2398是生成的core文件;
    ④这三个文件都是在用一个目录,所以可以直接执行,如果没有在同一个目录,需要使用绝对目录或者相对目录。

  • 3、查看所依赖库是否正确加载

    info sharedlibrary
    

    如果已找到对应的库则其FromTo会有值,syms Read的值为yes,并且右边路径显示的就是库在虚拟机中所在的位置。如果未找到对应的库则FromTo为空,syms Read的值为No

  • 4、设置程序ipcam的依赖库的位置

    这里设置依赖库的位置有点绕:假设ipcam有两个依赖库,分别为libcrypto.so.1.0.0libssl.so.1.0.0,并且这两个库在摄像头时,其所在位置分别为/app/lib/libcrypto.so.1.0.0/lib/libssl.so.1.0.0
    ①如果使用命令set sysroot /opt,如果设置位置/opt,那么libcrypto.so.1.0.0libssl.so.1.0.0在虚拟机的位置则必须分别为/opt/app/lib/libcrypto.so.1.0.0/opt/lib/libssl.so.1.0.0,没有的目录需要自行创建;
    ②如果使用命令set sysroot /,设置位置/,那么libcrypto.so.1.0.0libssl.so.1.0.0在虚拟机的位置则必须分别为/app/lib/libcrypto.so.1.0.0/lib/libssl.so.1.0.0,没有的目录需要自行创建;
    ③其他目录设置类似

  • 5、设置依赖库的位置后,再使用info sharedlibrary命令即可看的出来。然后使用bt命令,即可打印出产生段错误的函数,函数调用是从下往上。

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页