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

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

热心网友
87
转载
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。

相关攻略

C++编译器版本判断宏对照表与使用指南
编程语言
C++编译器版本判断宏对照表与使用指南

在C++跨平台开发实践中,精确识别当前使用的编译器及其完整版本号,是解决平台兼容性问题、启用编译器特定功能或规避已知版本缺陷的关键前提。然而,仅依赖__GNUC__或_MSC_VER这类基础宏定义,往往只能获取粗略的版本范围,难以满足精细化的开发需求。本文将系统梳理如何利用标准预定义宏,构建一套能够

热心网友
05.11
C++排序复杂结构体使用stdrangessort投影函数详解
编程语言
C++排序复杂结构体使用stdrangessort投影函数详解

C++20的std::ranges::sort配合投影功能,可简化复杂结构体排序。使用成员指针能高效按公有字段排序;通过lambda表达式可访问私有成员或计算值;std::mem_fn能简洁调用成员函数。多字段排序需在自定义比较器中组合投影。注意该算法要求随机访问迭代器,不适用于链表或某些视图。

热心网友
05.11
C++ ranges starts_with 函数用法详解 容器前缀匹配新方案
编程语言
C++ ranges starts_with 函数用法详解 容器前缀匹配新方案

C++23引入了通用算法std::ranges::starts_with,用于检查任何范围是否以指定前缀开头,弥补了C++20中仅适用于字符串的成员函数的局限性。该算法支持自定义比较和投影,但需注意参数传递和范围长度的性能影响。它适用于各类容器,但要求环境支持C++23标准。

热心网友
05.10
C++多线程异步任务取消协作模式详解stdstopcallback
编程语言
C++多线程异步任务取消协作模式详解stdstopcallback

在C++多线程开发中,std::stop_callback 常被误认为是一个能主动“中断”或“终止”线程执行的工具。然而,其真实功能要精确得多:它仅在其关联的 std::stop_source 调用了停止请求(request_stop()),且回调对象本身尚未被销毁的瞬间,同步执行一次预设的清理函数

热心网友
05.10
C++高效合并两个已排序大型vector的merge算法优化指南
编程语言
C++高效合并两个已排序大型vector的merge算法优化指南

合并两个已排序的std::vector时,应优先使用std::merge并提前为目标容器预留空间。直接使用空容器的begin()会导致越界,而使用back_inserter可能带来性能开销。推荐先调用reserve或resize确保容量,再传入合适的迭代器。std::inplace_merge不适用于独立vector,手动合并仅在需要过滤元素、定制比较逻辑或

热心网友
05.10

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

全链网解析:欧洲多国领导人面临支持率挑战
web3.0
全链网解析:欧洲多国领导人面临支持率挑战

英国工党领袖斯塔默面临公众信任挑战,支持率低迷。类似困境在欧洲多国领导人中普遍存在,德国总理默茨与法国总统马克龙的支持率同样远低于不支持率,反映出欧洲政界广泛的信任危机。

热心网友
05.18
芝麻开门Gate.io官网入口网址及安全交易平台使用指南
web3.0
芝麻开门Gate.io官网入口网址及安全交易平台使用指南

芝麻开门:安全便捷的数字资产交易平台 在数字货币的世界里,选择一个可靠、便捷的交易入口是第一步。芝麻开门作为一款服务于全球用户的知名交易平台,以其多重安全防护、对主流币种的广泛支持以及现货、杠杆等丰富功能,成为了许多交易者的选择。今天,我们就来详细梳理一下如何通过官方渠道,安全地获取并使用芝麻开门平

热心网友
05.18
通胀担忧加剧全球债市抛售 长期美债收益率创近三年新高
web3.0
通胀担忧加剧全球债市抛售 长期美债收益率创近三年新高

全球债市因通胀担忧遭剧烈抛售,长期美债收益率升至近三年高位。30年期美债收益率一度突破5%,10年期与2年期收益率同步攀升。日本30年期国债收益率单日飙升20基点创新高。油价上涨加剧通胀忧虑,策略师建议关注美债收益率在5 25%-5 5%区间的后续动向。

热心网友
05.18
欧易交易所官方入口网址一键直达 安全登录OKX交易平台
web3.0
欧易交易所官方入口网址一键直达 安全登录OKX交易平台

欧易(OKX):您的官方数字资产交易入口 在加密货币的世界里,选择一个可靠、功能全面的交易平台是第一步。欧易(OKX)作为全球领先的数字资产服务商,早已成为数百万用户的首选。它不仅提供比特币、以太坊等主流币种的现货交易,更将业务延伸至衍生品、DeFi以及NFT市场,构建了一个完整的加密生态。其背后,

热心网友
05.18
Gate.io官方安卓交易APP v7.19.1最新版下载与使用指南
web3.0
Gate.io官方安卓交易APP v7.19.1最新版下载与使用指南

gate io交易APP官方版 v7 19 1 安卓版下载与安装全指南 对于数字资产交易者来说,一个可靠、顺手的交易工具至关重要。Gate io交易APP,正是这样一款专业的平台,它为全球用户提供比特币、以太坊乃至上千种加密货币的实时行情与交易服务。其最新的安卓v7 19 1版本,在用户体验和系统稳

热心网友
05.18