Linux下addr2line命令用法
? ? ? Linux下addr2line命令用于將程序指令地址轉(zhuǎn)換為所對(duì)應(yīng)的函數(shù)名、以及函數(shù)所在的源文件名和行號(hào)。當(dāng)含有調(diào)試信息(-g)的執(zhí)行程序出現(xiàn)crash時(shí)(core dumped),可使用addr2line命令快速定位出錯(cuò)的位置。
? ? ? 如果無(wú)法確定文件名或函數(shù)名,addr2line將在它們的位置打印兩個(gè)問(wèn)號(hào);如果無(wú)法確定行號(hào),addr2line將打印0或一個(gè)問(wèn)號(hào)。
? ? ? 參數(shù)說(shuō)明:
? ? ? (1).-a:在函數(shù)名、文件名和行號(hào)信息之前,以十六進(jìn)制形式顯示地址。
? ? ? (2).-b:指定目標(biāo)文件的格式為bfdname。
? ? ? (3).-C:將低級(jí)別的符號(hào)名解碼為用戶級(jí)別的名字。
? ? ? (4).-e:指定需要轉(zhuǎn)換地址的可執(zhí)行文件名,默認(rèn)文件是a.out。
? ? ? (5).-f:在顯示文件名、行號(hào)信息的同時(shí)顯示函數(shù)名。
? ? ? (6).-s:僅顯示每個(gè)文件名(the base of each file name)去除目錄名。
? ? ? (7).-i:如果需要轉(zhuǎn)換的地址是一個(gè)內(nèi)聯(lián)函數(shù),則還將打印返回第一個(gè)非內(nèi)聯(lián)函數(shù)的信息。
? ? ? (8).-j:讀取指定section的偏移而不是絕對(duì)地址。
? ? ? (9).-p:使打印更加人性化:每個(gè)地址(location)的信息都打印在一行上。
? ? ? (10).-r:啟用或禁用遞歸量限制。
? ? ? (11).--help:打印幫助信息。
? ? ? (12).--version:打印版本號(hào)。
? ? ? dmesg命令:全稱為display message,用來(lái)顯示Linux內(nèi)核環(huán)形緩沖區(qū)信息。
? ? ? 測(cè)試代碼main.cpp如下:
#include <stdio.h>int divide(int a, int b)
{return a/b;
}int main()
{fprintf(stdout, "input value\n");int a = 3, b = 0;int div = divide(a, b);fprintf(stdout, "div value: %d\n", div);return 0;
}
? ? ? 在終端輸入以下命令:注意不要忘記-g,否則在使用addr2line命令時(shí)無(wú)法顯示文件名和行號(hào)
g++ -g main.cpp -o main
? ? ? 執(zhí)行main,輸出結(jié)果如下:
? ? ? 通過(guò)dmesg命令查看系統(tǒng)日志的錯(cuò)誤信息,結(jié)果如下:其中ip字段后面的數(shù)字4005c4就是main程序出錯(cuò)時(shí)所執(zhí)行的位置
?? ? ? 通過(guò)addr2line命令將地址4005c4轉(zhuǎn)換定位到代碼中出錯(cuò)的位置,命令及執(zhí)行結(jié)果如下:可見crash的地方在main.cpp文件的第5行,在divide函數(shù)中
總結(jié)
以上是生活随笔為你收集整理的Linux下addr2line命令用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Python3中迭代器介绍
- 下一篇: Python3中生成器介绍