- 调试嵌入式设备时,产生了一个段错误,查资料后明白了如何使用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、在gdb交互中查看所依赖库是否正确加载
info sharedlibrary
如果已找到对应的库则其
From
和To
会有值,syms Read
的值为yes
,并且右边路径显示的就是库在虚拟机中所在的位置。如果未找到对应的库则From
和To
为空,syms Read
的值为No
-
4、设置程序
ipcam
的依赖库的位置这里设置依赖库的位置有点绕:假设
ipcam
有两个依赖库,分别为libcrypto.so.1.0.0
和libssl.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.0
和libssl.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.0
和libssl.so.1.0.0
在虚拟机的位置则必须分别为/app/lib/libcrypto.so.1.0.0
和/lib/libssl.so.1.0.0
,没有的目录需要自行创建;
③其他目录设置类似 -
5、设置依赖库的位置后,再使用
info sharedlibrary
命令即可看的出来。然后使用bt
命令,即可打印出产生段错误的函数,函数调用是从下往上。