首页 游戏 软件 资讯 排行榜 专题
首页
科技数码
C++崩溃定位:使用addr2line解析地址到源码实战

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

热心网友
55
转载
2025-12-26

本文将从底层原理入手,结合实战案例,带大家掌握 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。

相关攻略

AI时代为何更需C++与Rust?Herb Sutter核心解读
科技数码
AI时代为何更需C++与Rust?Herb Sutter核心解读

在 AI 狂热、Python 统治胶水层、硬件算力看似无限增长的今天,C++ 标准委员会主席 Herb Sutter 却抛出了一个反直觉的结论:C++ 和 Rust 正在经历前所未有的高速增长。 大

热心网友
01.04
C++崩溃定位:使用addr2line解析地址到源码实战
科技数码
C++崩溃定位:使用addr2line解析地址到源码实战

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

热心网友
12.26
微软高管揭示:以Rust和AI逐步取代C++的未来战略
业界动态
微软高管揭示:以Rust和AI逐步取代C++的未来战略

12月23日消息,近日微软内部核心工程负责人Galen Hunt向外界宣布,要在2030年之前,消除微软代码库中的每一行C和C++代码,并利用Rust语言与AI技术的结合取而代之。作为在微软效力近3

热心网友
12.23
Linux C/C++网络编程核心知识点精讲与高频考点解析
科技数码
Linux C/C++网络编程核心知识点精讲与高频考点解析

无论是初涉网络编程的新手,还是渴望突破瓶颈的资深开发者,都能在本文中收获满满,全面提升自己在 Linux C C++ 网络编程领域的能力与水平,从容应对面试与实际项目开发的挑战 。 本次万字长文,将

热心网友
12.16
三大C++日志库对决:spdlog、glog与Boost.Log性能实测
科技数码
三大C++日志库对决:spdlog、glog与Boost.Log性能实测

今天我就来给大家盘点一下C++界那些大名鼎鼎的日志库,看看哪个最适合你的项目! 嘿,各位C++er们!我是小康

热心网友
12.02

最新APP

你比我猜
你比我猜
休闲益智 03-26
锦绣商铺
锦绣商铺
模拟经营 03-26
儿童画画
儿童画画
休闲益智 03-25
疯狂猜词
疯狂猜词
休闲益智 03-25
诸神皇冠
诸神皇冠
棋牌策略 03-25

热门推荐

猎豹浏览器免安装网页版:在线云端使用入口与教程
电脑教程
猎豹浏览器免安装网页版:在线云端使用入口与教程

猎豹浏览器免安装网页版入口是https: web lemur-browser com,具备界面简洁响应迅速、多端同步无缝衔接、安全防护层级丰富、文档处理能力突出、资源兼容性广泛覆

热心网友
03.27
昆仑万维发布三大世界第一梯队AI模型
科技数码
昆仑万维发布三大世界第一梯队AI模型

据昆仑万维集团消息,3月27日下午,昆仑万维(300418 SZ)旗下天工AI顺利举办“世界模型前沿技术与天工AIGC全家桶大模型生态”专场发布会,携Matrix-Game 3 0、SkyReels

热心网友
03.27
杨植麟、张鹏、夏立雪、罗福莉论道大模型:未来一年趋势前瞻
科技数码
杨植麟、张鹏、夏立雪、罗福莉论道大模型:未来一年趋势前瞻

本报(chinatimes net cn)记者石飞月 北京报道大模型未来会走向哪里?OpenClaw的爆火似乎为全行业指明了一个方向,但接踵而至的舆论质疑,又让这个答案变得扑朔迷离。3月27日,在2

热心网友
03.27
Anthropic核心模型意外泄露,网络安全股面临冲击风险
科技数码
Anthropic核心模型意外泄露,网络安全股面临冲击风险

Anthropic一款尚未发布的新AI模型因数据泄露意外曝光,引发市场对AI颠覆网络安全行业的担忧再度升温,网络安全板块股价周五盘前全线下挫。据《财富》杂志报道,Anthropic正在开发并已开始向

热心网友
03.27
Token经济到来,解析互联网大厂的布局与冷思考
科技数码
Token经济到来,解析互联网大厂的布局与冷思考

3月初,腾讯在深圳总部楼下设立“龙虾站”,引发千人排队尝鲜。OpenClaw掀起的“全民养虾”热潮,在短短一个月内让更多人看到了AI Agent深入业务场景的价值,随即推动Token调用量大规模增长

热心网友
03.27