? ? ? ?在Linux下可通過core文件來獲取當(dāng)程序異常退出(如異常信號SIGSEGV, SIGABRT等)時的堆棧信息。core dump叫做核心轉(zhuǎn)儲,當(dāng)程序運(yùn)行過程中發(fā)生異常的那一刻的一個內(nèi)存快照,操作系統(tǒng)在程序發(fā)生異常而異常在進(jìn)程內(nèi)部又沒有被捕獲的情況下,會把進(jìn)程此刻內(nèi)存、寄存器狀態(tài)、運(yùn)行堆棧等信息轉(zhuǎn)儲保存在一個core文件里,叫core dump。core文件是程序非法執(zhí)行后core dump后產(chǎn)生的文件,該文件是二進(jìn)制文件,可以使用gdb、elfdump、objdump打開分析里面的具體內(nèi)容。
產(chǎn)生core dump的可能原因:(1). 內(nèi)存訪問越界;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(2). 多線程程序使用了線程不安全的函數(shù);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(3). 多線程讀寫的數(shù)據(jù)未加鎖保護(hù);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(4). 非法指針;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(5). 堆棧溢出。
調(diào)試步驟:
1、查看core dump是否打開,如果返回0代表沒有打開,返回 unlimited 表示已經(jīng)打開
ulimit -c
2、如果沒有打開core dump
ulimit -c unlimited
執(zhí)行這行命令之后,只針對當(dāng)前終端有效。
如果想對所有終端都有效則在 .bashrc 末尾添加這行代碼,如下
3、生成可執(zhí)行文件,要加-g選項,以獲取到具體的行號信息,否則沒有
g++ -g -o main main.c
4、執(zhí)行程序后生成core文件,core文件默認(rèn)放在可執(zhí)行文件相同目錄下,且文件名固定為core
./main
執(zhí)行以下命令,可以將文件名修改為core.pid等形式,pid為執(zhí)行當(dāng)前程序的進(jìn)程號,core_uses_pid中原始內(nèi)容為0:?
echo "1" > /proc/sys/kernel/core_uses_pid
引用1、引用2
5、使用gdb調(diào)試core
gdb main core
6、查看程序堆棧信息
bt
小測試:
#include "stdio.h"
int main(){
int *b = 0;
*b = 10;
printf("******** b = %d ************ ",*b);
}
產(chǎn)生了core文件
顯示程序出錯在第5行。?
參考
在ros下產(chǎn)生崩潰文件進(jìn)行分析的方法:?
1、查看core dump是否打開
2、然后直接roslaun 或者rosun運(yùn)行節(jié)點,然后產(chǎn)生崩潰文件。roslaunch時core dump文件生成的位置在$ROS_HOME下,如未配置默認(rèn)在~/.ros目錄下
? ? ? ? 注意:在編譯生成可執(zhí)行文件或者庫的時候,要開啟調(diào)試選項,否則不會有g(shù)db調(diào)試信息,無法查看源代碼和設(shè)置斷點等。
? ? ? ? 單個文件直接編譯:加上 -g 選項就行
g++ -g -o main main.c
? ? ? ? 工程編譯:?
????????????????命令行方式:
catkin_make -DCMAKE_BUILD_TYPE=Debug
? ? ? ? ? ? ? ? 修改CMakelist.txt文件:文章來源:http://www.zghlxwxcb.cn/news/detail-657453.html
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打印的免責(zé)聲明)
gdb main core -q
?參考文章來源地址http://www.zghlxwxcb.cn/news/detail-657453.html
到了這里,關(guān)于Linux下ROS程序崩潰,程序段錯誤process has died [pid 20083, exit code -11, cmd /home GDB core dump 調(diào)試的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!