Segmentation fault (core dumped)

錯誤簡介

出現 “Segmentation fault (core dumped)” 錯誤通常意味著程序訪問了未分配的內存或者越界訪問了已分配內存之外的區域。

段錯誤通常發生在以下情況:

  1. 空指針解引用:嘗試對空指針進行操作。
  2. 內存越界:訪問了超出分配內存邊界的區域。
  3. 棧溢出:遞歸深度過大或者局部變量過多導致棧空間不足。

在遇到段錯誤時,常用的調試方法包括:

  • 使用調試器如 gdb 來跟蹤程序運行時的狀態,從而定位具體的錯誤發生位置。
  • 檢查代碼中的指針操作,確保不會解引用空指針或者越界訪問。
  • 考慮使用內存檢測工具(如 Valgrind)來幫助檢測內存泄漏或者非法內存訪問問題。

為什么 try-catch 捕獲不到?

在 C++ 中,try-catch 語句主要用于捕獲異常,而不是用來處理諸如段錯誤這樣的底層內存訪問問題。

core文件的生成

在ubuntu環境下,默認不生成core文件,需要生成core文件時,需要使用ulimit進行設定。
ulimit -c 判斷是否開啟轉儲,為0 則沒有開啟

1. 修改core文件路徑

在Linux系統中,/proc/sys/kernel/core_pattern文件用于指定核心轉儲文件的命名模式。這個文件通常是一個特殊的虛擬文件,修改它會影響系統在發生程序崩潰或異常時生成的核心轉儲文件的命名方式。

默認內容如下

|/usr/share/apport/apport -p%p -s%s -c%c -d%d -P%P -u%u -g%g -- %E

使用管理員模式,修改"/proc/sys/kernel/core_pattern"文件。

su
echo "core_%e_%p_%t" > /proc/sys/kernel/core_pattern

該路徑為在執行文件當前路徑創建相應的core文件,其中可選參數列表為:

%p - insert pid info filename
%u - insert current uid into filename
%g - insert current gid into filename
%s - insert signal that the coredump into the filename
%t - insert UNIX time that the coredump occurred into filename
%h - insert hostname where the coredump happened into filename
%e - insert coredumping executable name into filename

挑幾個翻譯下

- %e是執行文件名(可能被截斷)
- %P是pid
- %t是coredump生成時間戳
- %s是觸發生成coredump的信號值

注意:修改該文件后,如果重啟Linux系統,該文件又會變回初始值。

2. 使能core文件生成

# 列出當前終端所有資源限制
ulimit -a # 設置生成core文件的大小:1024k
ulimit -c 1024# 設置生成core文件的大小:不受限制
ulimit -c unlimited

注意:在終端通過ulimit命令設置core file size,僅在當前終端有效。
3. 驗證core文件生成
在修改core文件路徑和開啟core文件生成后,可以使用kill命令簡單驗證core文件生成。

kill -s SIGSEGV $$

core文件的分析

分析核心文件(core dump file)通常是為了理解程序崩潰的原因或故障的根本問題。以下是分析核心文件的一般步驟:

  1. 確認調試工具安裝
    確保系統上安裝了用于分析核心文件的調試工具,例如gdb(GNU Debugger)或者適用于特定語言和環境的其他調試工具。

  2. 獲取符號信息
    如果程序是用編譯器的調試選項編譯的(例如-g選項),則核心文件通常包含了符號信息,可以更好地分析。如果沒有符號信息,分析將更具挑戰性。

  3. 加載核心文件
    使用調試工具加載核心文件和程序執行文件(如果可用)。例如,在使用gdb時,可以執行:

    gdb /path/to/your/program /path/to/core/file
    
  4. 分析堆棧信息
    使用調試工具查看堆棧回溯(backtrace),這將顯示程序在崩潰時的函數調用路徑。在gdb中,可以使用bt命令:

    (gdb) bt
    
  5. 查看變量和內存狀態
    如果有符號信息,可以查看在崩潰時程序的變量值和內存狀態。這對于理解程序崩潰的原因非常有幫助。

  6. 分析核心轉儲的代碼段和數據段
    核心文件通常包含程序崩潰時的代碼段和數據段的快照。分析這些內容有助于理解程序在崩潰時的狀態。

  7. 查找原因并調試
    根據堆棧信息和變量狀態,嘗試確定程序崩潰的確切原因。這可能涉及到查找空指針解引用、內存泄漏、未處理的異常等問題。

  8. 記錄和報告
    如果能夠找到程序崩潰的原因或者問題點,記錄并報告給開發團隊或相關人員,以便進行修復或進一步的調查。

實戰分析

  1. 編譯時用-g選項
g++ -g -o test.out test.cpp
  1. 修改core文件生成路徑到當前執行文件同目錄
echo "core_%e_%p_%t" > /proc/sys/kernel/core_pattern
  1. 設置生成core文件的大小:不受限制
ulimit -c unlimited

4.在當前終端運行程序,因為ulimit設置 只在當前終端有效。

./test.out

5.程序出錯后會在執行同目錄下生成類似 core_test.ou_2024_1720274485 文件,用gdb工具分析

gdb ./test.out ./core_test.ou_2024_1720274485

使用 gdb 檢查變量:

你可以在 gdb 中使用 print 命令查看 queue 和 front 的值。例如:

(gdb) print queue
(gdb) print front

相關資料:

  • https://blog.csdn.net/ftswsfb/article/details/119192789
  • https://blog.51cto.com/u_13536788/9686757

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/42051.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/42051.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/42051.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大廠面試官贊不絕口的后端技術亮點【后端項目亮點合集(2)】

本文將持續更新~~ hello hello~ ,這里是絕命Coding——老白~💖💖 ,歡迎大家點贊🥳🥳關注💥💥收藏🌹🌹🌹 💥個人主頁:絕命C…

提高論文發表機會:Nature Communications 最新研究教你如何巧妙回復審稿意見

我是娜姐 迪娜學姐 ,一個SCI醫學期刊編輯,探索用AI工具提效論文寫作和發表。 對于科研搬磚人來說,在論文投稿過程中,如何有效回復審稿意見才能得到審稿人的認可,一直是一個讓人困惑又帶點玄學的問題。 但是&#xff0c…

vue3 按鈕復制粘貼功能

1.html <div click"copy(item.envelopePassword)" > 復制口令 </div> 2.utils 創建copy.js export const copy (val: string): void > {let { isSuccessRef } useCopyToClipboard(val) as anyif (isSuccessRef) {// 輕提示showNotify("復制…

【強化學習的數學原理】課程筆記--3(蒙特卡洛方法)

目錄 蒙特卡洛方法MC Basic算法sparse reward MC Greedy 算法樣本使用效率MC ? \epsilon ?-Greedy 算法一些例子 蒙特卡洛方法 第二節 推導貝爾曼最優公式中的&#xff1a; q π k ( s , a ) ∑ r P ( r ∣ s , a ) r γ ∑ s ′ P ( s ′ ∣ s , a ) v π k ( s ′ ) q…

vue3 ~ pinia學習

先看兩個圖 一個vuex 一個pinia 根據圖看出來 pinia更簡單了 那么具體怎么操作呢 我們來看下~ 第一步 下載 yarn add pinia # 或者使用 npm npm install pinia 第二步 注冊 創建一個 pinia 實例 (根 store) 并將其傳遞給應用&#xff1a; import { createApp } from v…

代碼隨想錄算法訓練Day57|LeetCode200-島嶼數量、LeetCode695-島嶼的最大面積

島嶼數量 題目描述 力扣200-島嶼數量 給你一個由 1&#xff08;陸地&#xff09;和 0&#xff08;水&#xff09;組成的的二維網格&#xff0c;請你計算網格中島嶼的數量。 島嶼總是被水包圍&#xff0c;并且每座島嶼只能由水平方向和/或豎直方向上相鄰的陸地連接形成。 此…

前端vue后端java使用easyexcel框架下載表格xls數據工具類

一 使用alibaba開源的 easyexcel框架&#xff0c;后臺只需一個工具類即可實現下載 后端下載實現 依賴 pom.xml <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependen…

MATLAB-分類CPO-RF-Adaboost冠豪豬優化器(CPO)優化RF隨機森林結合Adaboost分類預測(二分類及多分類)

MATLAB-分類CPO-RF-Adaboost冠豪豬優化器&#xff08;CPO&#xff09;優化RF隨機森林結合Adaboost分類預測&#xff08;二分類及多分類&#xff09; 分類CPO-RF-Adaboost冠豪豬優化器&#xff08;CPO&#xff09;優化RF隨機森林結合Adaboost分類預測&#xff08;二分類及多分類…

docker 設置代理,通過代理服務器拉取鏡像

docker 拉取目標鏡像需要通過代理服務器進行時&#xff0c;可以通過為 docker 配置全局代理來實現。 注&#xff1a;Linux 上通過臨時命令 export HTTP_PROXY 設置的代理&#xff0c;對 curl 這些有用&#xff0c;但是對 docker pull 不起作用。 示例 假設您的代理服務器地址是…

Nginx目錄文件作用

查看文件 [rootlocalhost nginx]# pwd /opt/nginx [rootlocalhost nginx]# ll total 4 drwx------ 2 nobody root 6 Jun 6 09:11 client_body_temp drwxr-xr-x 3 root root 4096 Feb 28 14:30 conf drwx------ 2 nobody root 6 Feb 28 14:29 fastcgi_temp drwxr-xr-x…

【web前端HTML+CSS+JS】--- HTML學習筆記01

學習鏈接&#xff1a;黑馬程序員pink老師前端入門教程&#xff0c;零基礎必看的h5(html5)css3移動端前端視頻教程_嗶哩嗶哩_bilibili 學習文檔&#xff1a; Web 開發技術 | MDN (mozilla.org) 一、前后端工作流程 WEB模型&#xff1a;前端用于采集和展示信息&#xff0c;中…

Web漏洞掃描工具AppScan與AWVS測評及使用體驗

AppScan和AWVS業界知名的Web漏洞掃描工具&#xff0c;你是否也好奇到底哪一個能力更勝一籌呢&#xff1f;接下來跟隨博主一探究竟吧。 1. 方案概覽 第一步&#xff1a;安裝一個用于評測的Web漏洞靶場&#xff08;本文采用最知名和最廣泛使用的靶場&#xff0c;即OWASP Benchma…

啥?你沒聽過SpringBoot的FatJar?

寫在最前面&#xff1a; SpringBoot是目前企業里最流行的框架之一&#xff0c;SpringBoot的部署方式多數采用jar包形式。通常&#xff0c;我們使用java -jar便可以直接運行jar文件。普通的jar只包含當前 jar的信息&#xff0c;當內部依賴第三方jar時&#xff0c;直接運行則會報…

robotframework-appiumLibrary 應用 - 實現 app 自動化

1、安裝appiumLibrary第三方庫 運行pip命令&#xff1a;pip install robotframework-appiumlibrary 若已安裝&#xff0c;需要更新版本可以用命令&#xff1a;pip install -U robotframework-appiumlibrary 2、安裝app自動化環境。 參考我的另外一篇專門app自動化環境安裝的…

設計模式探索:策略模式

1. 什么是策略模式&#xff08;Strategy Pattern&#xff09; 定義 策略模式&#xff08;Strategy Pattern&#xff09;的原始定義是&#xff1a;定義一系列算法&#xff0c;將每一個算法封裝起來&#xff0c;并使它們可以相互替換。策略模式讓算法可以獨立于使用它的客戶端而…

打卡第4天----鏈表

通過學習基礎,發現我的基本功還得需要再練練,思路得再更加清晰明了,這樣子做算法題才能駕輕就熟。每天記錄自己的進步。 一、兩兩交換 題目編號:24 題目描述: 給你一個鏈表,兩兩交換其中相鄰的節點,并返回交換后鏈表的頭節點。你必須在不修改節點內部的值的情況下完成本…

[數據結構] 基于交換的排序 冒泡排序快速排序

標題&#xff1a;[數據結構] 基于交換的排序 冒泡排序&&快速排序 水墨不寫bug &#xff08;圖片來源于網絡&#xff09; 目錄 &#xff08;一&#xff09;冒泡排序 優化后實現&#xff1a; &#xff08;二&#xff09;快速排序 I、實現方法&#xff1a; &#…

opencv環境搭建-python

最近遇到了一些圖像處理的需求&#xff0c;所以需要學習一下opencv,來記錄一下我的學習歷程。 安裝numpy pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy安裝matplotlib pip install -i https://pypi.tuna.tsinghua.edu.cn/simple matplotlib安裝opencv …

ctfshow web入門 web338--web344

web338 原型鏈污染 comman.js module.exports {copy:copy };function copy(object1, object2){for (let key in object2) {if (key in object2 && key in object1) {copy(object1[key], object2[key])} else {object1[key] object2[key]}}}login.js var express …

【ubuntu】掛載新磁盤

1、查看磁盤 sudo fdisk -l#Disk /dev/sdb: 4.0 TiB #Disk model: HNA641010BCF105 #Units: sectors of 1 * 512 512 bytes #Sector size (logical/physical): 512 bytes / 4096 bytes #I/O size (minimum/optimal): 4096 bytes / 4096 bytes #Disklabel type: gpt #Disk id…