1. 程式人生 > >linux程式除錯命令addr2line之入門簡介(本文先不聊gdb除錯)

linux程式除錯命令addr2line之入門簡介(本文先不聊gdb除錯)

       addr2line有什麼作用呢? 可別小瞧它, 它可以定位到程式碼出錯的位置。 下面, 我們來看看這個簡單的程式碼:

#include <stdio.h>

int main()
{
        int *p = NULL;
        *p = 0;

        printf("bad\n");
        return 0;
}
       這個程式很小, 我們可以一眼就看出程式在執行期出錯。 但是, 如果是大程式, 在執行期出錯, 我們該如何定位呢?  那就必須依賴於工具, 而不是你我的肉眼。

       我們以上述小程式為例, 進行如下操作:

[[email protected] learn_c]$ gcc -o taogeSeg -g taogeSeg.c 
[[email protected] learn_c]$ ./taogeSeg 
Segmentation fault (core dumped)
[[email protected] learn_c]$ dmesg | grep taogeSeg
taogeSeg[4941]: segfault at 0 ip 080483c9 sp bfb92410 error 6 in taogeSeg[8048000+1000]
[[email protected] learn_c]$ addr2line -e taogeSeg 080483c9
/home/taoge/Desktop/learn_c/taogeSeg.c:6
[
[email protected]
learn_c]$ cat -n taogeSeg.c 1 #include <stdio.h> 2 3 int main() 4 { 5 int *p = NULL; 6 *p = 0; 7 8 printf("bad\n"); 9 return 0; 10 } [[email protected] learn_c]$

       我來解釋一下:

       1. gcc -o taogeSeg -g taogeSeg.c :生成帶有除錯資訊的可執行檔案taogeSeg        2. dmesg | grep taogeSeg :獲得執行taogeSeg後的出錯資訊, 你可以將結果理解為日誌, 其中的080483c9是一個地址, 正是這個地址出錯了        3. addr2line -e taogeSeg 080483c9 :將出錯地址轉換成原始碼對應的行, 結果為6, 也就是說原始碼第6行有問題。 一看, 果然是,萬惡的*p=0;被揪出來了
。        當然, 針對這個例子, 會gdb除錯的朋友肯定也能調試出來,而且也確實能找到程式碼出錯的地址和原始碼行, 從這個意義上來講, gdb內部也攜帶了類addr2line的功能。這是不是說gdb就可以替代addr2line呢? 不是的。 如果某bug低概率發生, 現在只有一份crash log, 那就要用addr2line了, 因為你用gdb時, 該bug不一定發生啊。        實際上, 在很多linux大型軟體開發中, 經常出現段錯誤, 造成程序掛掉, 系統崩潰等問題, 此時, 用addr2line是比較好的方法。在後面的博文中, 我們會繼續瞭解與addr2line有關的除錯方法, 畢竟, 程式碼除錯太重要了。其實呢, 如果不熟悉addr2line的使用, 或者乾脆沒有聽說過這個命令, 那最好不要說自己搞linux開發, 免得被人鄙視啊。         OK, 本文只是一個引子, 能在實戰中熟練使用addr2line才見真功夫。如能熟練掌握addr2line的使用, 以後聽到什麼段錯誤, 系統崩潰, 就沒那麼毛骨悚然了。


相關推薦

linux程式除錯命令addr2line入門簡介(本文gdb除錯)

       addr2line有什麼作用呢? 可別小瞧它, 它可以定位到程式碼出錯的位置。 下面, 我們來看看這個簡單的程式碼: #include <stdio.h> int main() { int *p = NULL;

JAVA8新特性入門簡介

一:JAVA8新特性簡介       1:速度更快              首先速度很快,它是體現在很多的方面,比如說它對底層的資料結構做了一定的更新的改動,對於垃圾回收機制              也就是記憶體結構也做了改變。改變的例子如下:            

c# 入門簡介1

  goto  語句 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _5

十年風雨,一個普通程式設計師的成長路(八)想做技術總監的專案經理,是好程式設計師

目錄 十年風雨,一個普通程式設計師的成長之路(八)不想做技術總監的專案經理,不是好程式設計師 01 技術總監寫不寫程式碼? 02 面試的坎坷與杯具 03 新的開始 & 舊的結束

Mahout學習Mahout簡介、安裝、配置、入門程式測試

一、Mahout簡介 查了Mahout的中文意思——馭象的人,再看看Mahout的logo,好吧,想和小黃象happy地玩耍,得順便陪陪這位馭象人耍耍了... 附logo: (就是他,騎在象頭上的那個Mahout)  步入正文啦:        Mahout 是一個很強大

linuxconfigfs簡介和程式設計入門

一、什麼是configfs 是一種基於ram的檔案系統 二、configfs有什麼用處 在使用者空間配置核心物件 三、configfs VS ioctl configfs可直接察看,通過使用者態目錄檔案訪問介面

gdb除錯core dump入門實踐(順便複習一下之前介紹過的addr2line命令除錯

        除錯技能是軟體開發的必備技能, 不會除錯, 就抓不到bug, 就很痛苦。 本文我們來一起聊聊gdb除錯core          Part 1:         在前面的博文中, 我們聊過重要的addr2line除錯, 現在再來一起看看, 就當是複習吧。

從 0 開始學習 Linux 系列「08.15 個 gdb 除錯基礎命令

gdb 簡介 gdb 是 UNIX 及 UNIX-like 下的除錯工具,在 Linux 下一般都直接在命令列中用 gdb 來除錯程式,相比 Windows 上的整合開發環境 IDE 提供的圖形介面除錯,一開始使用 gdb 除錯可能會讓你感到生無可戀,但是隻要

Linux下常用命令sed學習總結

linux sed sed命令 正則表達式 sed總結 Sed功能說明:Sed是linux下一個強大的文本文件處理工具,通過對文件增加、刪除、查找、查詢操作,配合正則表達式以實現工作中的各種需求。同時也是一名運維人員必須掌握的核心技能。---------------------------

每天一個linux命令8grep高級篇

表達式 大寫 world exp 大寫字母 重復數 tools href 反向 1語法 grep -[acinv] ‘搜索內容串‘ filename-a 以文本文件方式搜索-c 計算找到的符合行的次數-i 忽略大小寫-n 順便輸出行號-v 反向選擇,即找 沒有搜索

Linux運維學習筆記二:常用命令2

linux 運維 筆記71、passwd:修改用戶密碼語法passwd [參數]username選項-k --keep-tokens :保留即將過期的用戶在期滿後仍能使用-l --lock :鎖定用戶無權更改其密碼,只能root才能操作-u --unlock :解除鎖定-S --status :查看用戶狀

Linux命令學習—每天發一個命令—mkdir

linux 命令 mkdirLinux命令學習之—每天發一個命令—mkdirmkdir 命令用來創建指定的名稱的目錄,要求創建目錄的用戶在當前目錄中具有寫權限,並且指定的目錄名不能是當前目錄中已有的目錄。1.命令格式:mkdir [選項] 目錄...2.命令功能:通過 mkdir 命令可以實現在指定位置創建以

linux文件查找find命令

linux findfind在windows中,我們想查找文件時,只需要在查找中輸入您想要查找的東西,對於linux來說,沒有那麽方便的圖像查找,但是使用find命令,將會是最好的選擇,find具有強大的查找命令方式,之前,聽一個學長說他面試jd的時候,問道的第一個問題就是你怎樣查找系統中大於10M 的文件,

kali linux 信息搜集常用的幾個軟件常用命令

安全 kali 信息搜集nmapnmap + ip 地址 掃描主機開放端口nmap -p 1-x + ip 地址 掃描特定主機端口nmap -v -A -sV +ip地址 詳細掃描主機nmap - p 端口 +ip 地址 192.168.1.* 集群內特定ipnmap -O 系統測試nmap -sV +ip

關於linux的進階命令用法來自noob的小結(1)

linux命令 寫的很雜,先這樣,下午再來細細排版與貼圖umask 查詢當前shell的mask值umask xxx 可以設置當前目錄的mask值vim .bashrc 可以編輯當前用戶shell的mask值並且永久保存,source 後生效-S 可以用rwx顯示出當前的去掉的

linux運維、架構路-shell編程入門

if語句 blog exp chkconfig 問題 架構之路 判斷目錄 cal 常用 一、shell編程入門必備基礎 1、vim編輯器的命令,vimrc設置 2、150個linux基礎命令 3、linux中基礎的系統服務crond,ssh網絡服務,nfs,rsync,in

Linux命令大全幫助命令及壓縮命令

.gz inf help unzip tar tar.gz 壓縮包 解壓 bsp man(manual):幫助命令 help用於解釋shell內部命令 格式:help shell內部命令 ls 命令 --help man 命令

Linux系統命令三劍客Grep

linux 命令 grep命令名稱:grep命令作用: 文本查找或搜索工具詳細說明: 同樣可以配合正則表達式來搜索文本,並將匹配的行打印輸出 也可用於過濾與搜索特定字符串,使用十分靈活常用參數:-a #不要忽略二進制數據-A #除了顯示符合範本樣式的那一行之外,並顯示該行之後的內容-b

Linux系統命令三劍客 awk

linux 命令 awk命令名稱:awk作用: 對文本和數據進行處理詳細說明: awk 是一種編程語言,用於在linux/unix下對文本和數據進行處理。 數據可以來自標準輸入(stdin)、一個或多個文件,或其它命令的輸出。 它在命令行中使用,但更多是作為腳本來使用。awk有很多內建的

Linux下的命令clear和reset

linux clear reset 清除屏幕 1) clear : 刷新屏幕 保留歷史命令記錄 說明:此命令本質上是讓終端向後翻一頁 當向上滾動鼠標時,還是可以看到之前的命令操作記錄 2) reset : 重新初始化屏幕,清除歷史命令操作記錄本文出自 “梵高說我腦子有病” 博客,謝絕