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

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

3天內(nèi)不再提示

如何用addr2line去debug

麥辣雞腿堡 ? 來源:嵌入式Linux系統(tǒng)開發(fā) ? 作者:嵌入式Linux系統(tǒng)開 ? 2023-07-30 10:20 ? 次閱讀

Linux 下寫 C/C++ 程序的程序員,時常與 Core Dump 相見。在內(nèi)存越界訪問,收到不能處理的信號,除零等錯誤出現(xiàn)時,我們精心或不精心寫就的程序就直接一命嗚呼了,Core Dump 是 Linux 仁慈地留下的程序的尸體,幫助程序員們解決了一個又一個問題。

有時配置不給力,Linux 直接毀尸滅跡,沒有了 Core 文件;又有時,剛好磁盤空間不足,Core文件寫不下了。沒有 Core 文件的時候,如何知道程序在什么地方出錯了呢?addr2line 就在這時派上用場。

這是一個示例程序,func 函數(shù)返回參數(shù) a 除以參數(shù) b 的結(jié)果。這里使用 0 作為除數(shù),結(jié)果就是程序因為除以 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 會有調(diào)試信息。

gcc -o test -g test.c

執(zhí)行

./test

提示執(zhí)行錯誤

圖片

輸入 dmesg 命令,查看 log,提示如下:

traps: test[2184] trap divide error ip:400534 sp:7ffee5779a90 error:0 in test[400000+1000]

ip 字段后面的數(shù)字就是 test 程序出錯時所程序執(zhí)行的位置。使用 addr2line 就可以 將 400534 地址轉(zhuǎn)換出對應的文件及行數(shù)

圖片

可知,程序在執(zhí)行到 test.c 文件第五行的時候,執(zhí)行出錯,我們檢查第五行代碼。

return a / b;

這里除 0 肯定是不行的,addr2line 幫助我們找到了錯誤位置。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5052

    文章

    18912

    瀏覽量

    300806
  • 內(nèi)存
    +關注

    關注

    8

    文章

    2947

    瀏覽量

    73730
  • FreeRTOS
    +關注

    關注

    12

    文章

    483

    瀏覽量

    61853
  • DEBUG
    +關注

    關注

    3

    文章

    89

    瀏覽量

    19808
收藏 人收藏

    評論

    相關推薦

    在wsl2中安裝的idf,在monitor時會報錯的原因?

    的 target 均配置正確 但是好像調(diào)用了 esp32 的addr2line工具,不想重新安裝idf了,求解,ballball大佬們
    發(fā)表于 06-17 07:30

    藍牙模塊HC-05中l(wèi)inelen=get_line(linebuff,redata+getlen+2*linenum,len);為什么linenum要*2

    linelen = get_line(linebuff,redata+getlen+2*linenum,len);這句語句linenum為什么要*2/*** @brief掃描周邊的藍牙設備,并存儲到
    發(fā)表于 04-24 06:35

    如何在開發(fā)板子上安裝addr2line工具?

    由于軟件在開發(fā)板上會有些難以復現(xiàn)的閃退類型bug需要借助addr2line 解析錯誤,打印函數(shù)堆棧,需要用到這個工具。目前的Ubuntu里邊有arm的交叉編譯工具,在linux下是可以的,但是在
    發(fā)表于 01-07 07:08

    C語言在ARM中函數(shù)調(diào)用時棧變化的過程

    為什么會寫篇棧變化的文章?做系統(tǒng)分析的話你肯定遇到過一些crash, oops等棘手問題,一般大家都會用 gdb, objdump 或者 addr2line等工具分析 pc 位置來定位出錯...
    發(fā)表于 02-14 07:02

    一步步介紹CmBacktrace的相關知識和使用方法

    繁雜的故障寄存器;輸出錯誤現(xiàn)場的函數(shù)調(diào)用棧 (需配合 addr2line 工具進行精確定位),還原發(fā)生錯誤時的現(xiàn)場信息,定位問題代碼位置、邏輯更加快捷、精準。也可以在正常狀態(tài)下使用該庫,獲取當前的函數(shù)
    發(fā)表于 10-26 15:44

    在wsl2中安裝的idf,在monitor報錯的原因?如何解決?

    均配置正確 但是好像調(diào)用了 esp32 的addr2line工具,不想重新安裝idf了,求解,ballball大佬們
    發(fā)表于 02-14 07:56

    當On Line Debug時,會無緣無故的離線是為什么?

    當我On Line Debug 時 ,會無緣無故的離線。 當時我的目標板有連接主電源。 例如 24BLDC 板。低速都OK 操過某一個速度,就直接離線。 有階主電源時也無法下載程式或Debug?
    發(fā)表于 09-06 08:02

    何用2SC2539替換2SC1971

    何用2SC2539替換2SC1971
    發(fā)表于 12-22 11:40 ?3134次閱讀

    NCV8402ADDR2G雙路MOS管的特性及應用

    提及“雙路場效應管NCV8402ADDR2G”,作為業(yè)內(nèi)人士,定不覺得陌生。NCV8402ADDR2G這個物料,帶短路、過熱保護的雙路MOS管,出自國際品牌ON(安森美)。NCV8402ADDR2
    發(fā)表于 08-09 17:17 ?2915次閱讀

    何用示波器測量脈沖信號呢

    何用示波器測量脈沖信號以及測量脈沖信號對示波器有什么要求。
    的頭像 發(fā)表于 10-04 08:49 ?1.6w次閱讀

    C語言在ARM中函數(shù)調(diào)用時,棧是如何變化的?

    為什么會寫篇棧變化的文章?做系統(tǒng)分析的話你肯定遇到過一些crash, oops等棘手問題,一般大家都會用 gdb, objdump 或者 addr2line等工具分析 pc 位置來定位出錯...
    發(fā)表于 12-09 10:36 ?8次下載
    C語言在ARM中函數(shù)調(diào)用時,棧是如何變化的?

    NCV8402ADDR2G,原裝正品,價格美麗

    提及“雙路場效應管NCV8402ADDR2G”,作為業(yè)內(nèi)人士,定不覺得陌生。NCV8402ADDR2G這個料號,帶短路、過熱保護的雙路MOS管,出自國際品牌ON(安森美)。NCV8402ADDR2
    的頭像 發(fā)表于 11-12 11:55 ?859次閱讀
    NCV8402<b class='flag-5'>ADDR2</b>G,原裝正品,價格美麗

    Linux中addr2line用法介紹

    addr2line 用法 -a --addresses:在函數(shù)名、文件和行號信息之前,顯示地址,以十六進制形式。 -b --target=:指定目標文件的格式為bfdname。 -e --exe
    的頭像 發(fā)表于 07-30 10:20 ?1107次閱讀

    linux下調(diào)試core dump的方法

    ,了解系統(tǒng)的啟動信息,可以獲得出錯堆棧地址。 addr2line ,可以將指令的地址和可執(zhí)行映像轉(zhuǎn)換成文件名,函數(shù)名或源代碼的工具。這種功能將跟蹤地址轉(zhuǎn)換成更有意義的內(nèi)容來說很有用。 在調(diào)用
    的頭像 發(fā)表于 10-08 16:13 ?578次閱讀

    RVBacktrace RISC-V極簡?;厮萁M件

    RVBacktrace組件簡介一個極簡的RISC-V棧回溯組件。功能在需要的地方調(diào)用組件提供的唯一API,開始當前環(huán)境的?;厮葜С州敵?b class='flag-5'>addr2line需要的命令,使用addr2line進行?;厮葜С纸Y(jié)合反匯編,?;厮菪畔D表化TODOList:支持打印
    的頭像 發(fā)表于 09-15 08:12 ?184次閱讀
    RVBacktrace RISC-V極簡?;厮萁M件