linux之Segment Fault錯誤分析[2]
簡而言之,產生段錯誤就是訪問了錯誤的記憶體段,一般是你沒有許可權,或者根本就不存在對應的實體記憶體,尤其常見的是訪問0地址. |
作為一個熟練的C/C++程式設計師,以上程式碼的bug應該是很清楚的,因為它嘗試操作地址為0的記憶體區域,而這個記憶體區域通常是不可訪問的禁區,當然就會出錯了。我們嘗試編譯執行它: |
果然不出所料,它出錯並退出了。 |
哦?!好像不用一步步除錯我們就找到了出錯位置d.c檔案的第4行,其實就是如此的簡單。 |
以 上資料摘自man page(man 5 core)。不過奇怪了,我的系統上並沒有找到core檔案。後來,憶起為了漸少系統上的拉圾檔案的數量(本人有些潔癖,這也是我喜歡Gentoo的原因 之一),禁止了core檔案的生成,查看了以下果真如此,將系統的core檔案的大小限制在512K大小,再試: |
core檔案終於產生了,用gdb除錯一下看看吧: |
哇,好歷害,還是一步就定位到了錯誤所在地,佩服一下Linux/Unix系統的此類設計。 |
編譯執行效果如下: |
怎麼樣?是不是依舊很酷? |
編譯執行結果如下: |
這次你可能有些失望,似乎沒能給出足夠的資訊來標示錯誤,不急,先看看能分析出來什麼吧,用objdump反彙編程式,找到地址0x804876f對應的程式碼位置: |
|
相關推薦
linux之Segment Fault錯誤分析[2]
簡而言之,產生段錯誤就是訪問了錯誤的記憶體段,一般是你沒有許可權,或者根本就不存在對應的實體記憶體,尤其常見的是訪問0地址. 一 般來說,段錯誤就是指訪問的記憶體超出了系統所給這個程式的記憶體空間,通常這個值是由gdtr來儲存的,他是一個48位的暫存器,其中的32位是儲存由
linux之Segment Fault錯誤分析[1]
最近在Linux環境下做C語言專案,由於是在一個原有專案基礎之上進行二次開發,而且專案工程龐大複雜,出現了不少問題,其中遇到最多、花費時間最長的問題就是著名的“段錯誤”(Segmentation Fault)。藉此機會系統學習了一下,這裡對Linux環境下的段錯誤做個小結,方便以後同類問題的排查與解決。 1
謝煙客---------Linux之Bash基礎特性(2)
linux總結Linux之哲學思想 一切皆文件 避免交互,實現Bash編程 文本編程命令實現配置 組合小程序完成復雜任務總結 過程式編程 解釋執行 字符和數值存儲的區別 shebang -> cpu ->解釋器 數據類型 變量類型
Linux之Ubuntu常見錯誤總結
N1: E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable) E: Unable to lock the administration directory (/var/
Linux下的段錯誤分析
2. 段錯誤產生的原因 2.1 訪問不存在的記憶體地址 #include #includevoid main() {int *ptr = NULL;*ptr = 0; } 2.2 訪問系統保護的記憶體地址 #include #includevoid main() {
Linux網路程式設計socket錯誤分析
轉自: http://aigo.iteye.com/blog/1911134 socket錯誤碼: EINTR: 4 阻塞的操作被取消阻塞的呼叫打斷。如設定了傳送接收超時,就會遇到這種錯誤。 只能針對阻塞模式的socket。讀,寫阻塞的socket時,-1返回,錯誤號為
Linux之源碼編譯httpd-2.4.25
ins eve 特性 .... -h tar nss res all 源碼編譯 第一步:configure腳本 選項:指定安裝位置、指定啟用的特性--help: 獲取其支持使用的選項選項分類:>安裝路徑設定:--prefix=/PATH:指定默認安裝位置,默認為/
Linux下如何生成core dump 文件(解決segment fault段錯誤的問題)
http alt 系統設置 images mit 只讀 功能 lin 設置 Linux下的C程序常常會因為內存訪問等原因造成segment fault(段錯誤),如果此時core dump 的功能是打開的,在運行我們的可執行程序時就會生成一個名為core的文件,然後我們就可
捕獲Linux段錯誤(Segment fault)並且列印錯誤堆疊
Linux上跑伺服器如果遇到程式崩潰是一件很苦惱的事情, 再碰到重現很難的BUG, 估計只能通過傳統的排查方法進行. 在編寫本文前, 筆者使用過諸如libunwind等庫進行錯誤時堆疊列印, 但是其本身由於需要引用第三方庫, 使用還是稍微麻煩. 經過Google後, 居然找到一篇好文, 其通過捕獲SI
七.linux開發之uboot移植(七)——uboot原始碼分析2-啟動第二階段之start_armboot函式分析1
一.uboot啟動第二階段之start_armboot函式簡介 1.start_armboot函式簡介 (1)這個函式在uboot/lib_arm/board.c的第444行開始到908行結束。 (2)、即一個函式組成uboot第二階段 2、
segment fault 段錯誤 (core dumped)的起因分析!
核心使用記憶體描述符結構體表示程序的地址空間,該結構體包含了和程序地址空間有關的全部資訊。記憶體描述符由mm_struct結構體表示,定義在檔案<linux/sched.h>中。進程地址空間由每個程序的線性地址區(vm_area_struct)組成。通過核心,程序可以給自己的地址空間動態的新增或
Linux之使用haproxy搭建web群集(2)
linux duyuheng keepalived Linux之使用haproxy搭建web群集(2) 案例二:一、 實驗拓撲圖 二、 實驗目標:使用keepalived+haproxy實現雙機熱備和負載均衡。三、 實驗環境:各虛擬機防火墻Iptables 與 NetworkManager 關閉四
Linux運維學習筆記之二:常用命令2
linux 運維 筆記71、passwd:修改用戶密碼語法passwd [參數]username選項-k --keep-tokens :保留即將過期的用戶在期滿後仍能使用-l --lock :鎖定用戶無權更改其密碼,只能root才能操作-u --unlock :解除鎖定-S --status :查看用戶狀
linux C函數之strdup函數分析
c函數之strdup函數分析一.函數分析1.函數原型:#include <string.h>char *strdup(const char *s); 2.功能:strdup()函數主要是拷貝字符串s的一個副本,由函數返回值返回,這個副本有自己的內存空間,和s沒有關聯。strdup函數復制一個字符串
linux之2>&1
決心 分頁 fin 進行 .html 因此 普通用戶 以及 div 轉載自:http://blog.sina.com.cn/s/blog_5842daa30101enz5.html 經常關註linux腳本的人,一定看到過 2>&1 這樣的用法,最初一定不明白其
JDK動態代理[2]----JDK動態代理的底層實現之Proxy源碼分析
sco 不可 -- 例如 mis tfs err eno entity 在上一篇裏為大家簡單介紹了什麽是代理模式?為什麽要使用代理模式?並用例子演示了一下靜態代理和動態代理的實現,分析了靜態代理和動態代理各自的優缺點。在這一篇中筆者打算深入源碼為大家剖析JDK動態代理實現的
《Linux學習並不難》Linux字符界面(2):關閉和重啟Linux系統之shutdown命令
Linux shutdown 關機 3.2 《Linux學習並不難》Linux字符界面(2):關閉和重啟Linux系統之shutdown命令shutdown命令可以安全地關閉或重啟Linux系統,有些用戶會使用直接斷掉電源的方式來關閉計算機,這是十分危險的。Linux系統與Windows不同,其
Linux之poll機制分析
for 可用 報告 超時時間 程序 訪問 events blank linux 應用程序訪問1個設備文件時可用阻塞/非阻塞方式.如果是使用阻塞方式,則直接調用open()、read()、write(),但是在驅動程序層會判斷是否可讀/可寫,如果不可讀/不可寫,則將當前進程休
Linux queue.h之TAILQ隊列分析
freebsd free tel 所有 lis img 對象 processor 宏定義 轉自 這兩天想看看memcached的實現,所以先學習了libevent,使用起來還是比較簡單的,其實是對select/poll/kqueue等的封裝,學習libevent過程中又
【Z】段錯誤Segment Fault定位,即core dump文件與gdb定位
rect fun 發生 toolbar ulimit top wid title 沒有 使用C++開發系統有時會出現段錯誤,即Segment Fault。此類錯誤程序直接崩潰,通常沒有任何有用信息輸出,很難定位bug,因而無從解決問題。今天我們介紹core dump文件,