问题原因:

core 指核心(线圈),没有半导体之前,使用线圈内存,指代内存。

可执行文件是分段存储的,加载进内存也是分段的,如代码段、数据段、堆、栈等,段错误的原因往往是碰到了不该碰到的内存位置(如系统保留段、代码段不能被修改,使用空指针等)。

核心已转储就是说进程结束之前,内存已被储存,可以用于程序员翻看程序的“临终遗言”来定位问题。往往需要使用gdb工具查看核心转储文件,且需要采用一些设置保障核心文件能够被储存,方法如下:

解决方法:

1.用 ulimit -a 查看 core file size 项是否为 unlimited。如果不是,修改成unlimited (指令:ulimit -c unlimited)

2.检查core产生路径是否正确,  cat /proc/sys/kernel/core_pattern,如果路径不存在,则设置:echo "./core-%e-%p-%s" > /proc/sys/kernel/core_pattern

core设置主要命令解析:

//控制core文件的文件名中是否添加pid作为扩展
echo "1" > /proc/sys/kernel/core_uses_pid  
//设置core文件的输出路径和输出文件名,这里我的路径是/home/boy/corefile,文件名就是后面的部分
echo "/home/boy/corefile/core-%e-%p-%t"> /proc/sys/kernel/core_pattern 
 
//参数说明
%p - insert pid into filename 添加pid
%u - insert current uid into filename 添加当前uid
%g - insert current gid into filename 添加当前gid
%s - insert signal that caused the coredump into the filename 添加导致产生core的信号
%t - insert UNIX time that the coredump occurred into filename 添加core文件生成时的unix时间
%h - insert hostname where the coredump happened into filename 添加主机名
%e - insert coredumping executable name into filename 添加程序名

3. 但因为ubuntu官方为了自动收集错误,设置了服务apport.service,用于自动生成崩溃报告,我们还是无法获取core文件。

因此可以暂时将该服务关闭。

//1.关闭错误报告
sudo systemctl disable apport.service
//或
sudo service apport stop


//2.启用错误报告
sudo systemctl enable apport.service
//或
sudo service apport start

apport被关闭后

重新执行程序,使用ll 命令应该就可以在当前路径下看到core文件了

python talib库 import提示核心已转储 ubuntu段错误核心已转储_linux

4. gdb定位错误位置

gdb  可执行文件  core文件

python talib库 import提示核心已转储 ubuntu段错误核心已转储_文件名_02

还可以输入bt(backtrace 缩写) 命令回溯定位,可以查看下程序崩溃时的堆栈信息,定位具体程序出错函数

python talib库 import提示核心已转储 ubuntu段错误核心已转储_可执行文件_03

注意:

在使用如下命令时

gdb  可执行文件  core文件

需要找到可执行文件的位置

ROS节点可以在launch中设置gdb进行调试:

<node name="client" pkg="example_3" type="client" output="screen" launch-prefix="xterm-egdb--args"/>

以下同语句代表不同的debug方式,主要使用以下两个语句
launch-prefix="xterm -e gdb --args"  //xterm命令表示新建一个terminal显示bug信息,-e参数告诉xterm执行剩下的命令行
launch-prefix="gdb -ex run --args" // 表示在运行launch的对话框内,显示bug信息