衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

段錯誤以及調試方法

技術讓夢想更偉大 ? 來源:CSDN-文曲盡墨琛乃缺 ? 2023-02-21 09:12 ? 次閱讀

一.段錯誤產生的原因

段錯誤就是訪問了不可訪問的內存,出現了運行時出現了segmentation fault的報錯

產生的原因:訪問不存在的內存地址、訪問系統保護的內存地址 、訪問只讀的內存地址、空指針廢棄(eg:malloc與free釋放后,繼續使用)、堆棧溢出、內存越界(數組越界,變量類型不一致等)

二. 使用GDB逐步查找段錯誤

首先加上命令行得先加上-g -rdynamic的參數進行編譯,eg:gcc -g rdynamic xxx.c 隨著gdb ./a.out

eg:70750666-b17b-11ed-bfe3-dac502259ad0.png

運行結果

70cd1e32-b17b-11ed-bfe3-dac502259ad0.png很明顯,都不用一步步的調試,后面幾行就顯示了出錯位置。 并且進程還收到了SIGSEGV信號而結束,而SIGSEGV默認的handler的動作是打印“段錯誤”的出錯信息,并產生core文件。

三. 分析core文件

什么是core文件 Core文件其實就是內存的映像,當程序崩潰時,存儲內存的相應信息,主用用于對程序進行調試。 當程序崩潰時便會產生core文件,其實準確的應該說是core dump 文件,默認生成位置與可執行程序位于同一目錄下,文件名為core. Core的意思是內存, Dump的意思是扔出來;core dump又叫核心轉儲, 當程序運行過程中發生異常, 程序異常退出時, 由操作系統把程序當前的內存狀況存儲在一個core文件中, 叫core dump.

如何使用

gdb-ccore文件路徑[應用程序的路徑]
1

進去后輸入where回車, 就可以顯示程序在哪一行當掉的, 在哪個函數中。
但是core文件的生成跟你當前系統的環境設置有關系, 可以用下面的語句設置一下, 然后再運行程序便成生成core文件ulimit -c ulimited; 輸入命令

ulimit-c//查是否為0,是0就不生成core文件
ulimit-c1000//ulimit-culimited,改變數值,限制系統的core文件大小
12

eg 70fe1ab4-b17b-11ed-bfe3-dac502259ad0.png

四.段錯誤時啟動調試

(gdb)bt71216cd0-b17b-11ed-bfe3-dac502259ad0.png二,三,四都是在基于系統上的gdb的前提進行的。如果沒有,glibc為我們提供了此類能夠dump棧內容的函數簇,詳見/usr/include/execinfo.h

五. 利用backtrace和objdump進行分析

eg714f51e0-b17b-11ed-bfe3-dac502259ad0.png71afb7ec-b17b-11ed-bfe3-dac502259ad0.png

運行結果

71ee1f78-b17b-11ed-bfe3-dac502259ad0.png

這里得提一下,需要用到庫

運行結果似乎沒上面幾種方式的信息多,清晰;但是還沒完,我們再用objdump反匯編程序,找到上面地址對應的代碼位置。

objdump -d a.out找到對應main 0x5601a75e0b0f對應的代碼位置

72108a54-b17b-11ed-bfe3-dac502259ad0.png

backtrace函數
backtrace函數的作用:當程序出現異常,段錯誤,崩潰的情況下,會收到內核發送給進程的異常信號,會把程序的堆棧信息打印出來。

intbacktrace(void**buffer,intsize)
//該函數獲取當前線程的調用堆棧,獲取的信息將會被存放在buffer中,它是一個指針數組,參數size用來指定buffer中可以保存多少個void*元素。函數的返回值是實際返回的void*元素個數。buffer中的void*元素實際是從堆棧中獲取的返回地址。
char**backtrace_symbols(void*const*buffer,intsize)
//該函數將backtrace函數獲取的信息轉化為一個字符串數組,參數buffer是backtrace獲取的堆棧指針,size是backtrace返回值。函數返回值是一個指向字符串數組的指針,它包含char*元素個數為size。每個字符串包含了一個相對于buffer中對應元素的可打印信息,包括函數名、函數偏移地址和實際返回地址。
//backtrace_symbols生成的字符串占用的內存是malloc出來的,但是是一次性malloc出來的,釋放是只需要一次性釋放返回的二級指針即可。
voidbacktrace_symbols_fd(void*const*buffer,intsize,intfd)
//該函數與backtrace_symbols函數功能相同,只是它不會malloc內存,而是將結果寫入文件描述符為fd的文件中,每個函數對應一行;該函數可重入。
1234567

注意事項:backtrace_symbols的實現需要符號名稱的支持,在gcc編譯過程中需要加入-rdynamic參數;

objdump反匯編碼

objdump-ftest//顯示test的文件頭信息

objdump-dtest//反匯編test中的需要執行指令的那些section

objdump-Dtest//與-d類似,但反匯編test中的所有section

objdump-htest//顯示test的SectionHeader信息

objdump-xtest//顯示test的全部Header信息

objdump-stest//除了顯示test的全部Header信息,還顯示他們對應的十六進制文件代碼
1234567891011

六.段錯誤信息的獲取

當我們運行的時候,發先有段錯誤segmentation fault時,我們可以通過一些命令進行段錯誤信息獲取。

-g gcc -g 主要適用于gdb調試

dmesg 直接輸入命令dmesgdmesg 可以在應用程序崩潰時,顯示內存中保存的相關信息。 dmesg 可以查看發生段錯誤的程序名稱、引起段錯誤發生的內存地址、指令指針地址、堆棧指針地址、錯誤代碼、錯誤原因等等。

ldd 命令
查看二進制程序的共享鏈接庫依賴,包括庫的名稱、起始地址,這樣可以確定段錯誤到底是發生在了自己的程序中還是依賴的共享庫中。

723dedfa-b17b-11ed-bfe3-dac502259ad0.png

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內存
    +關注

    關注

    8

    文章

    3055

    瀏覽量

    74329
  • 調試
    +關注

    關注

    7

    文章

    589

    瀏覽量

    34064
  • 文件
    +關注

    關注

    1

    文章

    570

    瀏覽量

    24822
  • 編譯
    +關注

    關注

    0

    文章

    661

    瀏覽量

    33041
  • gdb
    gdb
    +關注

    關注

    0

    文章

    60

    瀏覽量

    13346

原文標題:段錯誤以及調試方法

文章出處:【微信號:技術讓夢想更偉大,微信公眾號:技術讓夢想更偉大】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    嵌入式C開發中段錯誤的3種調試方法

    相信大家在嵌入式C開發中,或多或少都會遇到錯誤(segmentation fault )。昨天分享了一個總線錯誤的例子:嵌入式軟件中,關于總線錯誤,我幫你們踩了這些坑!相比總線
    發表于 07-11 09:42 ?321次閱讀
    嵌入式C開發中段<b class='flag-5'>錯誤</b>的3種<b class='flag-5'>調試</b><b class='flag-5'>方法</b>

    LCD屏幕的調試方法以及遇到的問題是什么?

    LCD屏幕的調試方法以及遇到的問題是什么?
    發表于 01-19 07:02

    HardFault錯誤調試的定位方法是什么

    HardFault 錯誤調試定位方法1、首先更改 startup.s 的啟動文件,把里面的 HardFault_Handler 代碼換成下面的代碼:HardFault_Handler
    發表于 02-15 07:22

    網管配置通道環和復用方法

      網管配置方法   通道保護調試步驟   復用保護調試步驟   復用保護配置注意事項
    發表于 09-10 16:19 ?0次下載

    mplab icd3錯誤消息及解決方法

    MPLAB ICD 3在線調試器會產生許多不同的錯誤消息;其中一些錯誤消息比較特殊而其他的都可以用常規糾正措施解決。MPLAB ICD 3在線調試器會產生許多不同的
    發表于 10-22 11:52 ?2.1w次閱讀

    chipscope使用教程以及FPGA在線調試方法

    本文檔內容介紹了基于chipscope使用教程以及FPGA在線調試方法,供參考
    發表于 03-02 14:09 ?9次下載

    keil中常見的各種錯誤警告以及相應的解決方法資料說明

    本文檔的主要內容詳細介紹的是簡單整理的keil中常見的各種錯誤警告以及相應的解決方法
    發表于 03-08 08:00 ?14次下載
    keil中常見的各種<b class='flag-5'>錯誤</b>警告<b class='flag-5'>以及</b>相應的解決<b class='flag-5'>方法</b>資料說明

    Labview編程錯誤調試與處理工具的使用說明

    Labview編程錯誤調試與處理工具
    的頭像 發表于 08-05 06:04 ?2399次閱讀

    linux C用戶態調試追蹤函數調用堆棧以及定位錯誤

    一般察看函數運行時堆棧的方法是使用GDB(bt命令)之類的外部調試器,但是,有些時候為了分析程序的BUG,(主要針對長時間運行程序的分析),在程序出錯時打印出函數的調用堆棧是非常有用的。
    發表于 05-16 17:36 ?903次閱讀
    linux C用戶態<b class='flag-5'>調試</b>追蹤函數調用堆棧<b class='flag-5'>以及</b>定位<b class='flag-5'>段</b><b class='flag-5'>錯誤</b>

    錯誤調試神器 - Core Dump詳解

    一、前言: 有的程序可以通過編譯, 但在運行時會出現Segment fault(錯誤). 這通常都是指針錯誤引起的. 但這不像編譯錯誤一樣會提示到文件某一行, 而是沒
    發表于 04-02 14:34 ?1205次閱讀

    Linux環境下段錯誤的產生原因及調試方法小結

    dmesg可以在應用程序crash掉時,顯示內核中保存的相關信息。如下所示,通過dmesg命令可以查看發生錯誤的程序名稱、引起錯誤發生的內存地址、指令指針地址、堆棧指針地址、
    的頭像 發表于 04-30 15:23 ?2575次閱讀

    什么是錯誤

    來源:聚優致成 一、什么是錯誤?一旦一個程序發生了越界訪問,cpu 就會產生相應的保護,于是 segmentation fault 就出現了,通過上面的解釋,錯誤應該就是訪問了不可
    的頭像 發表于 09-11 14:04 ?1.7w次閱讀

    單片機硬錯誤排查方法

    HardFault 錯誤調試定位方法1、首先更改 startup.s 的啟動文件,把里面的 HardFault_Handler 代碼換成下面的代碼:HardFault_Handler
    發表于 12-16 16:54 ?0次下載
    單片機硬<b class='flag-5'>錯誤</b>排查<b class='flag-5'>方法</b>

    錯誤是什么意思?是何原因引起的?

    剛接觸指針的時候,經常會遇到錯誤。所謂錯誤,就是訪問了不能訪問的內存。
    的頭像 發表于 02-13 09:41 ?3463次閱讀

    AN028 Cortex-M3內核HardFault錯誤調試定位方法

    AN028 Cortex-M3內核HardFault錯誤調試定位方法
    發表于 02-27 18:32 ?0次下載
    AN028 Cortex-M3內核HardFault<b class='flag-5'>錯誤</b><b class='flag-5'>調試</b>定位<b class='flag-5'>方法</b>
    百家乐怎么玩才会赢钱| 正品百家乐官网电话| 百家乐官网游戏论坛| 亚洲皇冠| 百家乐免费试玩| 博九娱乐网| 永平县| 百家乐官网正网开户| 太阳城百家乐官网的分数| 百家乐官网机械投注法| 百家乐官网心得打法| 百家乐官网游戏的玩法| 百家乐官网开户送10彩金| 玩百家乐官网出千方法| 百家乐官网英皇赌场娱乐网规则 | 七胜百家乐官网赌场娱乐网规则| 黄金百家乐官网的玩法技巧和规则 | 百家乐官网改单软件| 丽都百家乐官网的玩法技巧和规则 | 大发888娱乐真钱游戏下载| 波克棋牌官方免费下载| 深水埗区| 赌博百家乐官网技术| 请问下百家乐官网去哪个娱乐城玩最好呢| 百家乐有多少网址| 百家乐真人博彩的玩法技巧和规则| 大发888是什么| 88娱乐城官方网站| 百家乐官网五局八星| 澳门百家乐官网赌博技巧| 百家乐官网免费体验金| 百家乐游戏真钱游戏| 玩百家乐去哪个娱乐城最安全 | 巴厘岛百家乐官网的玩法技巧和规则 | 温州市百家乐ktv招聘| 新全讯网3344111.c| 皇星娱乐城| 壹贰博百家乐官网娱乐城| 2024年九运的房屋风水吉凶| 奥斯卡百家乐的玩法技巧和规则| 三易博娱乐城|