Linux下ROS程序崩溃,程序段错误process has died [pid 20083, exit code -11, cmd /home GDB core dump 调试

这篇具有很好参考价值的文章主要介绍了Linux下ROS程序崩溃,程序段错误process has died [pid 20083, exit code -11, cmd /home GDB core dump 调试。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

       在Linux下可通过core文件来获取当程序异常退出(如异常信号SIGSEGV, SIGABRT等)时的堆栈信息。core dump叫做核心转储,当程序运行过程中发生异常的那一刻的一个内存快照,操作系统在程序发生异常而异常在进程内部又没有被捕获的情况下,会把进程此刻内存、寄存器状态、运行堆栈等信息转储保存在一个core文件里,叫core dump。core文件是程序非法执行后core dump后产生的文件,该文件是二进制文件,可以使用gdb、elfdump、objdump打开分析里面的具体内容。

产生core dump的可能原因:(1). 内存访问越界;

                                               (2). 多线程程序使用了线程不安全的函数;

                                               (3). 多线程读写的数据未加锁保护;

                                               (4). 非法指针;

                                               (5). 堆栈溢出。

Linux下ROS程序崩溃,程序段错误process has died [pid 20083, exit code -11, cmd /home GDB core dump 调试,GDB调试,linux,运维,服务器,ubuntu

调试步骤:

1、查看core dump是否打开,如果返回0代表没有打开,返回 unlimited 表示已经打开

ulimit -c

2、如果没有打开core dump

ulimit -c unlimited

执行这行命令之后,只针对当前终端有效。

如果想对所有终端都有效则在 .bashrc 末尾添加这行代码,如下

Linux下ROS程序崩溃,程序段错误process has died [pid 20083, exit code -11, cmd /home GDB core dump 调试,GDB调试,linux,运维,服务器,ubuntu

3、生成可执行文件,要加-g选项,以获取到具体的行号信息,否则没有

g++ -g -o main main.c

4、执行程序后生成core文件,core文件默认放在可执行文件相同目录下,且文件名固定为core

./main

执行以下命令,可以将文件名修改为core.pid等形式,pid为执行当前程序的进程号,core_uses_pid中原始内容为0: 

echo "1" > /proc/sys/kernel/core_uses_pid

引用1、引用2

5、使用gdb调试core

gdb main core

6、查看程序堆栈信息

bt

小测试:

#include "stdio.h"
 
int main(){
	int *b = 0;
	*b = 10;
	printf("******** b = %d ************ ",*b);
}

Linux下ROS程序崩溃,程序段错误process has died [pid 20083, exit code -11, cmd /home GDB core dump 调试,GDB调试,linux,运维,服务器,ubuntu

Linux下ROS程序崩溃,程序段错误process has died [pid 20083, exit code -11, cmd /home GDB core dump 调试,GDB调试,linux,运维,服务器,ubuntu

产生了core文件

Linux下ROS程序崩溃,程序段错误process has died [pid 20083, exit code -11, cmd /home GDB core dump 调试,GDB调试,linux,运维,服务器,ubuntu

显示程序出错在第5行。 

参考

在ros下产生崩溃文件进行分析的方法: 

1、查看core dump是否打开

2、然后直接roslaun 或者rosun运行节点,然后产生崩溃文件。roslaunch时core dump文件生成的位置在$ROS_HOME下,如未配置默认在~/.ros目录下

        注意:在编译生成可执行文件或者库的时候,要开启调试选项,否则不会有gdb调试信息,无法查看源代码和设置断点等。

        单个文件直接编译:加上 -g 选项就行
g++ -g -o main main.c
        工程编译: 

                命令行方式:

catkin_make -DCMAKE_BUILD_TYPE=Debug

                修改CMakelist.txt文件:

SET(CMAKE_BUILD_TYPE "Debug")
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

3、gdb查看core dump文件(-q:表示屏蔽GDB打印的免责声明)

gdb main core -q

 参考文章来源地址https://www.toymoban.com/news/detail-657453.html

到了这里,关于Linux下ROS程序崩溃,程序段错误process has died [pid 20083, exit code -11, cmd /home GDB core dump 调试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包