本文介绍: 在Linux下可通过core文件来获取当程序异常退出(如异常信号SIGSEGV, SIGABRT等)时的堆栈信息。core dump叫做核心转储,当程序运行过程中发生异常的那一刻的一个内存快照,操作系统在程序发生异常而异常在进程内部又没有被捕获的情况下,会把进程此刻内存、寄存器状态、运行堆栈等信息转储保存在一个core文件里,叫core dump。core文件是程序非法执行后core dump后产生的文件,该文件是二进制文件,可以使用gdb、elfdump、objdump打开分析里面的具体内容。
在Linux下可通过core文件来获取当程序异常退出(如异常信号SIGSEGV, SIGABRT等)时的堆栈信息。core dump叫做核心转储,当程序运行过程中发生异常的那一刻的一个内存快照,操作系统在程序发生异常而异常在进程内部又没有被捕获的情况下,会把进程此刻内存、寄存器状态、运行堆栈等信息转储保存在一个core文件里,叫core dump。core文件是程序非法执行后core dump后产生的文件,该文件是二进制文件,可以使用gdb、elfdump、objdump打开分析里面的具体内容。
(4). 非法指针;
1、查看core dump是否打开,如果返回0代表没有打开,返回 unlimited 表示已经打开
ulimit -c
2、如果没有打开core dump
ulimit -c unlimited
如果想对所有终端都有效则在 .bashrc 末尾添加这行代码,如下
3、生成可执行文件,要加-g选项,以获取到具体的行号信息,否则没有
g++ -g -o main main.c
4、执行程序后生成core文件,core文件默认放在可执行文件相同目录下,且文件名固定为core
./main
执行以下命令,可以将文件名修改为core.pid等形式,pid为执行当前程序的进程号,core_uses_pid中原始内容为0:
5、使用gdb调试core
gdb main core
6、查看程序堆栈信息
bt
小测试:
#include "stdio.h"
int main(){
int *b = 0;
*b = 10;
printf("******** b = %d ************ ",*b);
}
产生了core文件
在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
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://blog.csdn.net/qq_34761779/article/details/131578480
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_40750.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。