core文件如何分析

目錄

        • (一)什么是coredump
        • (二)coredump產生的條件
          • (1)coredump產生主要原因:
          • (2)如何生成coredump
        • (三)gdb使用
        • (四)實例調試coredump文件
        • (五)總結

(一)什么是coredump

應用程序運行出錯或異常退出時,在滿足一定條件下產生一個core文件,例如程序收到SIGABRT、SIGEMT等信號時(注:在signal.h里說明了哪些新號會產生coredump)都會出現coredump,我們平時見到最多的應該就是段錯誤。
core文件包含了程序運行時內存、寄存器狀態、堆棧指針、內存管理信息以及函數調用堆棧信息。
我們通過分析core文件可以找到應用程序崩潰的地方

(二)coredump產生的條件

(1)coredump產生主要原因:
1、內存訪問越界
2、多線程程序使用了線程不安全的函數。
3、多線程讀寫的數據未加鎖保護。
4、非法指針
5、堆棧溢出
(2)如何生成coredump

1. 首先需要內核支持kernel選項
在這里插入圖片描述
2. 設置ulimit -c unlimited

可以通過ulimit -a查看core文件大小限制,core文件大小不能太小,否則不能生成core文件

3. 默認core文件生成在當前目錄,可以通過下面命令修改生成位置

可以通過/proc/sys/kernel/core_pattern進行設置。%p  出Core進程的PID
%u  出Core進程的UID
%s  造成Core的signal號
%t  出Core的時間,從1970-01-0100:00:00開始的秒數
%e  出Core進程對應的可執行文件名
eg:echo "core-%e-%p-%s-%t" > /proc/sys/kernel/core_pattern。

在每個進程下都有coredump_filter節點/proc/pid/coredump_filter。

通過配置coredump_filter可以選擇需在coredump的時候,將哪些內容dump到core文件中。

(三)gdb使用

這里介紹gdb命令,下一小節直接實例介紹使用流程,這里可以跳過,用的時候回來看

 gdb 源程序 core文件
命令解釋
list/l查看程序 list +函數名稱/行號
list 顯示當前行后面的源程序
list -顯示當前行前面的源程序
run/r運行程序,設置運行參數
help顯示幫助信息
start單步執行,運行程序,停在第一條執行語句
break/bbreak function在指定的函數停止
break 行號 在指定代碼行打斷
break +offset/break -offset在當前行的前面或后面的offset行打斷點,offset為自然數
break 在下一條命令處停止運行
break … if < condition>如設置break if i=100表示當i為100時程序停止運行
info查看信息
info break [n]其中n 表示斷點號來查看斷點信息
info signals info handle: 查看有哪些信號正在被gdb檢測
next < count>單步跟蹤,如果有函數調用不會進入函數,如果后面不加count表示一條一條的執行,加count表示執行后面的count條指令
step < count>單步跟蹤,如果有函數調用則進入該函數(進入該函數前提是此函數編譯有Debug信息),與next類似,其不加count表示一條一條執行,加上count表示自當前行開始執行count條代碼指令
finish運行程序直到當前函數完成并打印函數返回時的堆棧地址和返回值及參數值等信息
until運行程序直到退出循環體
continue/c當程序遇到斷點停止運行后可以使用continue命令恢復程序的運行到下一個斷點或直到程序結束
print命令查看變量
set設置變量的值
x查看內存 格式x /nfu addr
watch命令watch命令一般來觀察某個表達式(變量也可視為一種表達式)的值是否發生了變化,如果由變化則程序立即停止運行
return命令如果在函數中設置了調試斷點,在斷點后還有語句沒有執行完,這個時候我們可以使用return命令強制函數忽略還沒有執行的語句并返回。
quit/q退出gdb調試
whatis/ptype顯示變量的類型
bt顯示函數調用路徑

(四)實例調試coredump文件

用一個最簡單的例子模擬一下coredump

#include <stdio.h>
#include <unistd.h>int main(int argc,char * argv[])
{char * pStr="helloworld\n";printf("%s\n",pStr);pStr[1] = 'y';return 0; 
}

運行一下

root@l-virtual-machine:~/hc# gcc coretest.c 
root@l-virtual-machine:~/hc# ./a.out 
helloworld段錯誤 (核心已轉儲)
root@l-virtual-machine:~/hc# ls
a.out  core  coretest.c 

編譯的時候一定要加入-g選項,要不然在最后顯示錯誤的時候只會顯示錯的地址,而不會顯示錯誤的具體信息
這個時候有了core文件,我們查看這個文件類型,使用file或readelf -h

命令 file core //將core這個文件的具體信息給顯示出來,命令最后會顯示這個core文件是通過哪個文件產生的root@l-virtual-machine:~/hc# file core
core: ELF 64-bit LSB core file x86-64, version 1 (SYSV), SVR4-style, from './a.out'

在這里插入圖片描述從紅色方框截圖可以看到,程序中止是因為信號SIGSEGV,且從bt(backtrace)命令(或者where)可以看到函數的調用棧,即程序執行到coretest.c的第8行,修改pStr導致的
在這里插入圖片描述在這里插入圖片描述

(五)總結

在我們編譯程序時要使用-g選項保留一份程序,方便出問題時我們定位問題所在,core文件使用時注意:

(1)保證進程對生成core的目錄有讀寫權限
(2)若程序調用seteuid()/setegid() 改變了進程的有效用戶或組,則默認情況下系統不為這些進程生成 core 文件。除非將 /proc/sys/fs /suid_dumpable 文件的內容改為1(一般默認是0)。
(3)設置足夠大的Core文件大小限制,否則不能生成core文件。

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

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

相關文章

SpringMVC+FreeMarker

前言&#xff1a; 最近在學習SpringMVC&#xff0c;模板引擎用的是FreeMarker&#xff0c;之前沒有接觸過。利用SpringMVC開發其實還有許多的步驟&#xff0c;比如控制層&#xff0c;服務層&#xff0c;持久化層&#xff0c;實體等等&#xff0c;先弄了一個小demo來總結一下Spr…

SpringMVC那點事

一、SpringMVC返回json數據的三種方式 1、第一種方式是spring2時代的產物&#xff0c;也就是每個json視圖controller配置一個Jsoniew。 如&#xff1a;<bean id"defaultJsonView" class"org.springframework.web.servlet.view.json.MappingJacksonJsonView&q…

js學習內容的整理

1、jquery動態添加Table中的一行 function addTableRow(tableId){var html <tr>\......\</tr>";//行首插入一行if($(#tableId).find(tr).length 1){$(html).insertAfter($(#tableId).find(tr).eq(0));} else { $(html).insertBefore($(#tableId).find(tr).e…

(一)最鄰近插值python實現

這里寫目錄標題&#xff08;一&#xff09;原始圖像&#xff08;二&#xff09;最鄰近插值實現&#xff08;三&#xff09;python實現1. 安裝庫2. python程序編寫3. 效果4. 工程文件&#xff08;一&#xff09;原始圖像 &#xff08;二&#xff09;最鄰近插值實現 一般情況下我…

(二)雙線性插值python實現

這里寫目錄標題&#xff08;一&#xff09;原始圖像&#xff08;二&#xff09;雙線性插值原理&#xff08;三&#xff09;python實現1. 安裝庫2. python程序編寫3. 效果4. 工程文件&#xff08;一&#xff09;原始圖像 &#xff08;二&#xff09;雙線性插值原理 一般情況下我…

js self = this的解釋

Demo 1: function Person(){this.name hjzgg;this.age 24;this.show function(){alert(name " " age);}}var p new Person();p.show(); 錯誤&#xff1a;name 和 age都沒有定義。 Demo 2: function Person(){this.name hjzgg;this.age 24;this.show functio…

(三)圖像轉灰度圖Python實現

這里寫目錄標題&#xff08;一&#xff09;原始圖像&#xff08;二&#xff09;轉換原理&#xff08;三&#xff09;python實現1. 安裝庫2. python程序編寫3. 效果4. 工程文件&#xff08;一&#xff09;原始圖像 &#xff08;二&#xff09;轉換原理 &#xff08;三&#xff…

SD卡實例分析fat32文件系統

目錄 環境描述 分析過程 1.SD卡格式化 2.使用winhex打開sd卡 3.MBR分析 4.DBR分析

java泛型上下限

前言&#xff1a; java的泛型上下限不是很好理解&#xff0c;尤其像我這種菜雞。反反復復看了好幾遍了...&#xff0c;真是... 一、簡單的繼承體系 class Person{}class Student extends Person{}class Worker extends Person{} 二、泛型上限&#xff08;extends 關鍵字&#x…

基于matlab的步進電機仿真(一)

這里寫目錄標題環境準備基礎準備模型參數輸入和輸出仿真原理圖仿真資源環境準備 MatLab2021b 基礎準備 打開Matlab&#xff0c;在幫助文檔里面搜索step motor,我們這里選擇如下模型 該模型實現了一個通用的步進電機模型&#xff1a; 可變磁阻步進電機永磁或混合步進電機 …

java自定義類加載器

前言 java反射&#xff0c;最常用的Class.forName()方法。做畢設的時候&#xff0c;接收到代碼字符串&#xff0c;通過 JavaCompiler將代碼字符串生成A.class文件&#xff08;存放在classpath下&#xff0c;也就是eclipse項目中的bin目錄里&#xff09;&#xff0c;然后通過jav…

常用網址

MDN : 一個不錯的前端學習網站 https://developer.mozilla.org/zh-CN/  https://developer.mozilla.org/en-US/ CodePen 是一個網站前端設計開發平臺&#xff0c;是一個針對網站前端代碼設計的開發工具。 RunJS - 在線編輯、展示、分享、交流你的 JavaScript 代碼 : http://r…

repo介紹(一)

repo簡介 Repo 是我們以 Git 為基礎構建的代碼庫管理工具,可以組織多個倉庫的上傳和下載。它是由一系列的Python腳本組成&#xff0c;封裝了一系列的Git命令&#xff0c;用來統一管理多個Git倉庫 一個大型的項目可能由很多小的倉庫組合而成的&#xff0c;為了方便統一管理各個…

hash長度擴展攻擊

作為一個信息安全的人&#xff0c;打各個學校的CTF比賽是比較重要的&#xff01; 最近一個朋友發了道題目過來&#xff0c;發現有道題目比較有意思&#xff0c;這里跟大家分享下 這串代碼的大致意思是&#xff1a; 這段代碼首先引入了一個名為"flag.php"的文件&am…

repo介紹(二)

這篇文章來實例操作 安裝repo&#xff0c;參考repo介紹這一節創建repo存放default.xml 的git倉庫 初始化repo&#xff0c;repo init -u https://gitee.com/angerial/repo-test.git 這個時候會在當前目錄生成如下文件 參考repo組成&#xff0c;修改.repo/manifest.xml,這里我的…

springmvc環境搭建以及常見問題解決

1.新建maven工程 a) 打開eclipse&#xff0c;file->new->project->Maven->Maven Project b) 下一步 c) 選擇創建的工程為webapp&#xff0c;下一步 d) 填寫項目的group id和artifact id。一般情況下&#xff0c;group id寫域名的倒序&#xff0c;artifact id…

eclipse build workspace太慢或者 js出錯問題解決

1.js文件錯誤解決辦法 右鍵項目->properties->Builders(注&#xff1a;JavaScript Validator也會引起 build workspace太慢) 2.Eclipse 一直不停 building workspace完美解決總結&#xff08;來自: http://blog.163.com/shadow_wolf/blog/static/18346909720145279519222…

HttpUrlConnection發送url請求(后臺springmvc)

1.HttpURLConnection發送url請求 public class JavaRequest {private static final String BASE_URL "http://localhost:8080/dsdemo/";public static String userToken null;public static String problemName null;public static String sendPost(String sufUrl…

springmvc+jpa實現分頁的兩種方式

1.工具類 public final class QueryTool {public static PageRequest buildPageRequest(int pageNumber, int pageSize, String sortType){Sort sort null;if("auto".equals(sortType)) {sort new Sort(Direction.DESC, "ctime");} else {sort new Sort…

不使用session,借助redis實現驗證碼

1.首先看一下基本的流程 2.看一下代碼 注&#xff1a;其中用到的一些工具類&#xff0c;可以到我的github上去下載 https://github.com/hjzgg/usually_util/tree/master/utils windows 下的 redis下載 https://github.com/hjzgg/redis 獲取驗證碼的tooken RequestMapping(value…