linux下gdb使用core文件调试程序,解决“段错误核心已转储“的问题
一、core文件介紹以及用途:
1、core文件是什么?
core文件包含了程序運行時的內存狀態、寄存器狀態、堆棧指針、內存管理信息以及各個函數使用堆棧信息等等;
當程序運行過程中出現段錯誤(Segmentation Fault),程序將停止運行,由操作系統把程序當前的內存狀況存儲在一個 core 文件中,即核心轉儲文件(Coredump File),core 文件是程序運行狀態的內存映象。
2、使用場景,段錯誤
使用程序的時候,總會遇到
“段錯誤(核心已轉儲)”這樣的錯誤提示信息,通過gdb與core文件便可以查看程序錯誤的地方。
3、造成段錯誤的原因
主要以下幾個方面
內存訪問越界
多線程使用了線程不安全的函數
非法指針
堆棧溢出
多線程讀寫的程序沒有加鎖保護
二、core文件調試舉例
1、舉例一個用了空指針的程序
這里我們故意使用一個空指針,然后造成段錯誤,去演示如何使用core文件調試程序
#include <iostream>int main() { *(char *) 0 = 0;//使用一個空指針,會報段錯誤int num;std::cout<<"please enter a number:";std::cin>>num;for (int i = 0; i < 10; i ++){num += i;std::cout<<"number + i = "<<num <<std::endl;}return 0; }2、設置core文件大小
因為默認的core文件大小是0 ;也就是默認不保存這個文件;所以需要我們設置一下;
使用下面的命令去查看以及設置:
但是如果你是普通用戶,這樣的操作一般都會報錯誤:“不允許的操作”;
bash: ulimit:core file size:無法修改limit值:不允許的操作遇到這樣的問題應該怎么解決呢?
1、用root用戶去使用上述:ulimit -c unlimited命令
2、返回普通用戶再使用一次:ulimit -c unlimited
PS:像使用命令 "sudo vi /etc/security/limits.conf "的這個方法,自己也有嘗試過,但是好像沒有效果,也寫出來供大家參考參考吧!
sudo vi /etc/security/limits.conf"找到下圖的soft core,
把 0 改為 unlimited;
3、設置core文件的保存位置以及文件名字格式信息
使用 echo 更巧妙一點:
echo "/home/kylin/Core_P/core-%e" > /proc/sys/kernel/core_pattern修改文件的格式信息,有利于core文件的保存和查看,名字的格式可以參考下面的:
%p - 添加pid(進程id) %u - 添加當前uid(用戶id) %g - 添加當前gid(用戶組id) %s - 添加導致產生core的信號 %t - 添加core文件生成時的unix時間 %h - 添加主機名 %e - 添加導致產生core的命令名PS:另外使用的方法,算是踩的一個坑。
就是通過編輯文件去設置保存位置與信息
結果就是一直有:
"警告:此文件自讀入后已發生改動!!!"
"core pattern" E667:同步失敗的信息
所以使用 echo的方法,可以解決上面的問題,而且是有效的!
4、使用core文件查看錯誤
由于程序里面故意寫了一個空指針,所以運行的時候肯定會有"段錯誤(核心已轉儲)";
但是不同的是,這個時候的core文件的存在的,而且保存在上面剛剛設置的地方
使用 : ”gdb + [exec file] + [core file] “調試core文件
結果能夠顯示出錯的函數、出錯的行數,并顯示該行代碼
總結
以上是生活随笔為你收集整理的linux下gdb使用core文件调试程序,解决“段错误核心已转储“的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 力扣【下一个更大元素】leetcode-
- 下一篇: linux下使用syslog日志调试程序