在 Linux 下寫 C/C++ 程序的程序員,時常與 Core Dump 相見。在內存越界訪問,收到不能處理的信號,除零等錯誤出現時,我們精心或不精心寫就的程序就直接一命嗚呼了,Core Dump 是 Linux 仁慈地留下的程序的尸體,幫助程序員們解決了一個又一個問題。
有時配置不給力,Linux 直接毀尸滅跡,沒有了 Core 文件;又有時,剛好磁盤空間不足,Core文件寫不下了。沒有 Core 文件的時候,如何知道程序在什么地方出錯了呢?addr2line 就在這時派上用場。
這是一個示例程序,func 函數返回參數 a 除以參數 b 的結果。這里使用 0 作為除數,結果就是程序因為除以 0 導致錯誤,直接中斷了。
test.c
#include < stdio.h >
int func(int a, int b)
{
return a / b;
}
int main()
{
int x = 10;
int y = 0;
printf("%d / %d = %dn", x, y, func(x, y));
return 0;
}
編譯:-o 指定輸出文件名,-g 會有調試信息。
gcc -o test -g test.c
執行
./test
提示執行錯誤

輸入 dmesg 命令,查看 log,提示如下:
traps: test[2184] trap divide error ip:400534 sp:7ffee5779a90 error:0 in test[400000+1000]
ip 字段后面的數字就是 test 程序出錯時所程序執行的位置。使用 addr2line 就可以 將 400534 地址轉換出對應的文件及行數 :

可知,程序在執行到 test.c 文件第五行的時候,執行出錯,我們檢查第五行代碼。
return a / b;
這里除 0 肯定是不行的,addr2line 幫助我們找到了錯誤位置。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
嵌入式
+關注
關注
5198文章
20445瀏覽量
334008 -
內存
+關注
關注
9文章
3209瀏覽量
76361 -
FreeRTOS
+關注
關注
14文章
499瀏覽量
66935 -
DEBUG
+關注
關注
3文章
95瀏覽量
21379
發布評論請先 登錄
相關推薦
熱點推薦
在wsl2中安裝的idf,在monitor時會報錯的原因?
的 target 均配置正確 但是好像調用了 esp32 的addr2line工具,不想重新安裝idf了,求解,ballball大佬們
發表于 06-17 07:30
調用rt_timer_check函數就報錯,為什么?
: addr2line -e rtthread.elf -a -f 0x800320e[W/kernel.service] rt_hw_backtrace_frame_unwind is not implemented
發表于 06-10 06:18
調用rt_timer_check函數就報錯怎么解決?
: addr2line -e rtthread.elf -a -f 0x800320e[W/kernel.service] rt_hw_backtrace_frame_unwind is not implemented
發表于 09-18 06:11
單片機運行一段時間死機,為什么?
問題:
單片機運行一段時間死機,想通過在死機前異常時利用cmbacktrace捕捉log保存,讓系統重啟重啟后通過shell打印出死機時信息,用addr2line分析死機原因
發表于 09-29 08:26
在V5.1.0版本中,lfs文件系統使用ulog文件后端保存文件, 遇到了使用cat命令讀取文件錯誤怎么解決?
) assertion failed at function:_dfs_lfs_read, line number:730
please use: addr2line -e rtthread.elf -a -f 0x80031c2
發表于 10-10 06:08
如何在開發板子上安裝addr2line工具?
由于軟件在開發板上會有些難以復現的閃退類型bug需要借助addr2line 解析錯誤,打印函數堆棧,需要用到這個工具。目前的Ubuntu里邊有arm的交叉編譯工具,在linux下是可以的,但是在
發表于 01-07 07:08
C語言在ARM中函數調用時棧變化的過程
為什么會寫篇棧變化的文章?做系統分析的話你肯定遇到過一些crash, oops等棘手問題,一般大家都會用 gdb, objdump 或者 addr2line等工具分析 pc 位置來定位出錯...
發表于 02-14 07:02
在wsl2中安裝的idf,在monitor報錯的原因?如何解決?
均配置正確 但是好像調用了 esp32 的addr2line工具,不想重新安裝idf了,求解,ballball大佬們
發表于 02-14 07:56
當On Line Debug時,會無緣無故的離線是為什么?
當我On Line Debug 時 ,會無緣無故的離線。
當時我的目標板有連接主電源。
例如 24BLDC 板。低速都OK 操過某一個速度,就直接離線。
有階主電源時也無法下載程式或Debug?
發表于 09-06 08:02
C語言在ARM中函數調用時,棧是如何變化的?
為什么會寫篇棧變化的文章?做系統分析的話你肯定遇到過一些crash, oops等棘手問題,一般大家都會用 gdb, objdump 或者 addr2line等工具分析 pc 位置來定位出錯...
發表于 12-09 10:36
?8次下載
NCV8402ADDR2G,原裝正品,價格美麗
提及“雙路場效應管NCV8402ADDR2G”,作為業內人士,定不覺得陌生。NCV8402ADDR2G這個料號,帶短路、過熱保護的雙路MOS管,出自國際品牌ON(安森美)。NCV8402ADDR2
Linux中addr2line用法介紹
addr2line 用法 -a --addresses:在函數名、文件和行號信息之前,顯示地址,以十六進制形式。 -b --target=:指定目標文件的格式為bfdname。 -e --exe
linux下調試core dump的方法
,了解系統的啟動信息,可以獲得出錯堆棧地址。 addr2line ,可以將指令的地址和可執行映像轉換成文件名,函數名或源代碼的工具。這種功能將跟蹤地址轉換成更有意義的內容來說很有用。 在調用
RVBacktrace RISC-V極簡棧回溯組件
RVBacktrace組件簡介一個極簡的RISC-V棧回溯組件。功能在需要的地方調用組件提供的唯一API,開始當前環境的棧回溯支持輸出addr2line需要的命令,使用addr2line進行棧回溯支持結合反匯編,棧回溯信息圖表化TODOList:支持打印
如何用addr2line去debug
評論