游乐游手机版
首页/科技数码/文章详情

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

时间:2025-12-26 13:43
本文将从底层原理出发,结合实战案例,带大家掌握 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
上一篇五大女博士以全链路科研赋能国货口腔美容新崛起 下一篇K8s成本管控:40%浪费源自这些冗余配置
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
道指破52000谷歌首秀芯片V型反转黄金跳水油价反弹
科技数码 · 2026-07-01

道指破52000谷歌首秀芯片V型反转黄金跳水油价反弹

2026年6月30日,一个值得标记的时间节点。

优步终止与Waymo自动驾驶合作 聚合平台战略受质疑
科技数码 · 2026-07-01

优步终止与Waymo自动驾驶合作 聚合平台战略受质疑

合作刚刚结束,但余波远未平息。优步与Waymo在凤凰城的Robotaxi试点项目,已于上月画上句号。虽然双方对外口径都颇为客气——“有意义的试点”“富有成效的探索”——但市场显然读出了更多信号:这对亦敌亦友的巨头,正在自动驾驶赛道上悄然拉开距离。 凤凰城是Waymo最早向付费乘客开放Robotaxi

光芯片需求爆发 半导体企业订单供不应求
科技数码 · 2026-07-01

光芯片需求爆发 半导体企业订单供不应求

我国半导体产业装备的国产化进程令人瞩目。就在几年前,许多看似基础的推车、货架乃至无尘服仍需依赖进口,如今短短三年内,国产化率已实现翻倍增长。 在2026年“活力中国调研行”广东站活动中,粤芯半导体助理总裁吴昊向澎湃新闻记者透露了他的观察。他指出,当前行业仅在光刻机及部分高端材料等少数环节仍依赖进口,

小米首款NAS智能存储发布 60TB双盘位2.5G网口
科技数码 · 2026-07-01

小米首款NAS智能存储发布 60TB双盘位2.5G网口

2026年6月30日,小米正式推出了旗下首款网络附加存储(NAS)设备——小米智能存储。同时,其专属配套应用“小米智能存储”也已上架小米应用商店。在官方发布的设备使用指南视频中,这款新品首次完整亮相,各项核心配置与功能也随之全面揭晓。 先来看看外观设计。该设备采用立式方正造型,搭配钛灰色磨砂工艺,整

刺客信条黑旗重制版六天后发售多平台容量翻倍
科技数码 · 2026-07-01

刺客信条黑旗重制版六天后发售多平台容量翻倍

距离《刺客信条:黑旗》重制版正式发售仅剩六天。这款备受玩家期待的经典重制作品,即将于2026年7月9日登陆PlayStation 5、Xbox Series X|S以及PC平台。目前,各平台的安装空间需求已全面揭晓,为玩家规划存储空间提供了明确参考。 根据Xbox官方商店页面数据,Xbox Seri