当前位置: 首页
科技数码
C++崩溃定位:使用addr2line解析地址到源码实战

C++崩溃定位:使用addr2line解析地址到源码实战

热心网友 时间:2025-12-26
转载

本文将从底层原理出发,结合实战案例,带大家掌握 addr2line 的核心用法,彻底告别 “崩溃地址看不懂” 的困境。 0 引言 当 C++ 程序在 Linux 环境下崩溃时,我们经常看到这样的输出

本文将从底层原理入手,结合实战案例,带大家掌握 addr2line 的核心用法,彻底告别 “崩溃地址看不懂” 的困境。

0.引言

当 C++ 程序在 Linux 环境下崩溃时,我们经常会看到这样的输出:

Segmentation fault (core dumped)

然而很多时候是不会产生core文件的,我们只有增加日志打印的类似输出(一般服务端程序都会增加对应的backtrace):

Program received signal SIGSEGV, Segmentation fault.0x0000000000401526 in ?? ()

这些崩溃往往没有完整的调试日志,仅能拿到一串十六进制崩溃地址(如 0x400526 或 0x7f0012345678)以及函数名称。面对这些的地址,我们很难直接定位到源代码中的 bug 位置。

而addr2line正是解决该问题的 “利器”:它是 GNU Binutils 工具集的一员,能将程序崩溃时的内存地址,反向解析为对应的文件名、函数名、行号,甚至支持 C++ 名称修饰解析、动态库地址偏移计算等复杂场景。

本文将从底层原理出发,结合实战案例,带大家掌握 addr2line 的核心用法,彻底告别 “崩溃地址看不懂” 的困境。

1.addr2line 的基本原理

addr2line 的工作原理是 “地址→调试信息→源码” 的反向查找,其依赖 3 个核心基础:符号表、ELF 文件格式、DWARF 调试信息。对于这每个部分包含的内容可以参考编译链接的原理讲解系列文章:从源码到可执行文件:hello.c 的二进制之旅,更为详细的DWARF信息也可以参考:https://dwarfstd.org/。其整体定位过程如下图,如果没有调试信息的话会输出问号,我们只需要将命令中的可执行文件变化为对应的符号信息即可(因为线上release版本一般都会剥离符号信息,所以这也是我们排查线上问题最常用的)。

addr2line -e program 地址addr2line -e program.debug 地址


图片

2.实际使用

我们用一个实际的例子来看一下其使用方式,手动构造除0异常宕机,下面例子中没有增加backtrace日志,我们可以通过dmsg或者core文件获取到崩溃地址。

#include int func(int a, int b){ return a / b;}int main(){ int x = 10; int y = 0; func(x, y); return 0;}

g++ -g -o a.out a.cpp./a.out# Floating point exception# 通过core文件或者dmsg获取地址addr2line -e a.out 0x400a56#输出文件和行数 /a.cpp:5

3.常用参数介绍

-a --addresses:在函数名、文件和行号信息之前,显示地址,以十六进制形式。
-b --target=:指定目标文件的格式为bfdname。
-e --exe=:指定需要转换地址的可执行文件名。
-i --inlines : 如果需要转换的地址是一个内联函数,则输出的信息包括其最近范围内的一个非内联函数的信息。
-j --sectinotallow=:给出的地址代表指定section的偏移,而非绝对地址。
-p --pretty-print:使得该函数的输出信息更加人性化:每一个地址的信息占一行。
-s --basenames:仅仅显示每个文件名的基址(即不显示文件的具体路径,只显示文件名)。
-f --functions:在显示文件名、行号输出信息的同时显示函数名信息。
-C --demangle[=style]:将低级别的符号名解码为用户级别的名字。
-h --help:输出帮助信息。
-v --version:输出版本号。
来源:https://www.51cto.com/article/832483.html

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
小米回应新车未上市被曝起火实为SkyNomad遭AI污染

小米回应新车未上市被曝起火实为SkyNomad遭AI污染

小米新系列尚未正式发布,搜索“SkyNomad”即出现“起火”“事故”等联想词及疑似AI生成的“车祸”视频。小米官方紧急辟谣,已收集相关证据并与平台沟通,指出这是利用AI技术批量造谣的有组织的舆论攻击行为。

时间:2026-07-11 12:56
沃尔玛沃集鲜推出药食同源系列新品

沃尔玛沃集鲜推出药食同源系列新品

沃尔玛自有品牌沃集鲜推出“药食同源”系列,覆盖饮品、烘焙、零食等品类,分日常与衍生两大产品梯队,联合老字号拓展消费场景,同时加速全国门店升级,以商品力与门店网络推动全渠道增长。

时间:2026-07-11 12:55
聆思科技获近5亿元B轮融资

聆思科技获近5亿元B轮融资

聆思科技完成近5亿元B轮融资,由安徽与合肥国资领投。资金将用于新一代端侧大模型AI推理芯片研发,从感知模型升级至认知大模型。首颗Nebula系列预计2026年底推出。公司已推出23款芯片,累计出货超1 5亿片,广泛用于家居家电、教育办公等领域。

时间:2026-07-11 12:55
北通鲲鹏70异环联名手柄上市安魂曲薄荷双色699元

北通鲲鹏70异环联名手柄上市安魂曲薄荷双色699元

北通鲲鹏70《异环》联名款手柄上市,售价699元,提供安魂曲与薄荷双色。礼盒内含定制手柄及周边,前12000套赠游戏道具兑换卡。手柄搭载AI触觉反馈肩键、双切扳机、阻尼可调摇杆,支持星闪2000Hz回报率,兼容PC、NS、手机和车机。

时间:2026-07-11 12:54
全球电动汽车需求持续增长趋势研究机构报告

全球电动汽车需求持续增长趋势研究机构报告

6月全球电动汽车注册量连续第四个月增长,达200万辆,同比增7%。欧洲市场表现抢眼,注册量飙升31%,北美受税收政策影响下滑13%。德国车企面临挑战,保时捷上半年销量降16%,大众营业利润跌54%。

时间:2026-07-11 12:54
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 热门数据榜