但是利用addr2line这个工具,就可以找到对应的代码行。前提条件是可执行程序或者动态链接库编译的时候带-g选项。...具体来说,分两种情况: 如果关注的一行backtrace位于一个可执行文件中,那么直接addr2line -e 如果关注的backtrace位于一个动态链接库中...然后在这个文件中找到动态链接库的基地址,然后将backtrace中的地址 – 动态链接库的基地址,得到偏移地址offset address, 最后addr2line -e <shared library...不过相比addr2line,GDB需要将BUG现象重现一遍,所以对于不好重现的BUG,或是随机重现的BUG来说,使用addr2line就可以直接从backtrace找到对应的代码行,不需要重现现象,比GDB...有上面的认识后那我们就只需要得到此次libadd.so的加载地址然后用0x7f85839fa5c6这个地址减去libadd.so的加载地址得到的结果再利用addr2line命令就可以正确的得到出错的地方
[root@HI J]# arm-eabi-addr2line -e KERNEL_OBJ/vmlinux c0008520
常用的地址转换工具有addr2line、ndk-stack等,个人比较喜欢addr2line,所以接下来介绍下该工具的基本使用方式 addr2line简介 使用-h参数查看工具的可选参数配置 日常使用过程中...其中NDK中的aarch64-linux-android-c++fil(和addr2line同一个目录)是专门用来支持Demangle的 addr2line使用示例 新建一个带C++的Android Studio...工程,主动创造一个native crash 启动app后如预期崩溃 抓到崩溃信息后,根据ABI找到相对应的addr2line工具和带符号表的so文件。...我们主要关注backtrace后面的信息,同时带"pc"和"/data"的行基本就是app相关的崩溃行了 除了最后一个是被strip了符号的so,前三个so文件都是可以的 终端中使用addr2line
addr2line 就在这时派上用场。 这是一个示例程序,func 函数返回参数 a 除以参数 b 的结果。这里使用 0 作为除数,结果就是程序因为除以 0 导致错误,直接中断了。...使用 addr2line 就可以将 400534 地址转换出对应的文件及行数: 可知,程序在执行到 test.c 文件第五行的时候,执行出错,我们检查第五行代码。...return a / b; 这里除 0 肯定是不行的,addr2line 帮助我们找到了错误位置。...addr2line 用法 -a --addresses:在函数名、文件和行号信息之前,显示地址,以十六进制形式。 -b --target=:指定目标文件的格式为bfdname。
addr2line的核心功能 addr2line 是Go语言配套工具集中的一个工具,它主要用于将程序的内存地址转换为对应的源代码位置。这在分析程序崩溃的堆栈跟踪或性能分析数据时非常有用。...通常,这些数据只提供内存地址,而通过使用 addr2line,开发者可以将这些地址映射回具体的代码行,从而更容易地理解和调试程序。...核心转储分析:分析核心转储文件时,addr2line 能帮助将地址映射回源代码,简化调试过程。...使用方法 使用 addr2line 的基本命令格式如下: bash go tool addr2line [options] binary 这里的 binary 是指已编译的Go程序的二进制文件。...后续我会继续研究,整理pprof和delve结合addr2line使用的文章,敬请关注!
之前没有用过addr2line和gdb等内核调试工具定位问题代码,这里记录一下在将某个网络驱动从4.9内核移植到5.7内核时出现内核崩溃起不来的问题。...0000000000000000 [ 2.663929] x1 : 0000000000000000 x0 : 0000000000000000 [ 2.669191] Call trace: 1.通过addr2line...我用的编译链是aarch64-linux-gnu-,所以addr2line前面也要加这个前缀,这里一开始有个问题,我使用addr2line的时候没有输出代码行号,只输出两个"??"
文章目录 一、从 Tombstone 报错日志中查找报错动态库 二、addr2line 命令行工具使用 64 位动态库使用的 aarch64-linux-android-addr2line.exe 工具...32 位动态库使用的 arm-linux-androideabi-addr2line.exe 工具 使用 addr2line 命令行工具分析动态库 Tombstone 报错信息日志文件被保存在了 /data...命令行工具进行确定 ; 二、addr2line 命令行工具使用 ---- 64 位动态库使用的 aarch64-linux-android-addr2line.exe 工具 在 Android NDK...开发中 , 使用的 addr2line 命令行工具是在 SDK 的 ndk-bundle\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86...arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin 目录下的 arm-linux-androideabi-addr2line.exe ; 使用 addr2line
对于Android Native开发的人员而言,可能经常会在开发过程及线上环境中遇到Native Crash的问题,对于这类native crash,我们一般都会直接addr2line,或使用ndk中附带的...如何解析 常规操作 addr2line -Cfie libndkdemo.so 0xf0c8 网上的大部分教程都是直接进行如上的addr2line操作,对于自己开发过程中直接运行出现了crash的确可以快速定位...,但如果代码已发生变更,库不匹配了,定位效率就会大幅下降,比如测试报了crash,但是本地代码已发生变更,库不匹配,如果想拿到build id相同的库,就要回退到当时的代码,重新编一个一样的库再做addr2line...本地库发生变更 修改其他函数,使crash所在的函数地址变更,变更后函数地址是0xf0a0,0xf0a0 + 0x34 = 0xf0d4使用新的地址addr2line,可以发现,此时buildId虽然发生变更
二、地址转换为符号信息2.1、addr2line工具将地址转换为文件名和行号。...addr2line有两种操作模式。在第一个命令行中,十六进制地址在命令行中指定,addr2line显示每个地址的文件名和行号。...在第二个命令中,addr2line从标准输入中读取十六进制地址,并在标准输出中打印每个地址的文件名和行号。在这种模式下,addr2line可以在管道中用于转换动态选择的地址。...addr2line只能看虚拟区域的地址。2.2、dladdr1()函数将地址转换为符号信息。...(5)当出现内存泄漏时,使用addr2line工具定位内存泄漏的位置。
相应的工具有addr2line, gdb, objdump等,这几个工具在How to read a Linux kernel panic?都有介绍,我们将针对上面的实例做更具体的分析。...addr2line 如果出错的内核跟当前需要调试的内核一致,而且编译器等都一致,那么可以通过addr2line直接获取到出错的代码行,假设出错地址为0019594c: $ addr2line -e vmlinux_with_debug_info...vmlinux_with_debug_info --start-address=0x0019594c --stop-address=$((0x0019594c+0x150)) 如果是情况二,也可以跟addr2line
signal(SIGABRT,handle_segv); return func(p); } 编译: gcc -g demo.c -o demo 执行: **找到错误代码行号:**使用addr2line...命令 示例: addr2line -a 0x4007b6 -e demo 回到我们的源文件,对应的位置。
用 addr2line 工具定位 addr2line 顾名思义,是内存地址转换成代码行号的工具。...NDK 中自带 addr2line ,一般位于以下目录中: //32bit D:\NDK\android-ndk-r16\toolchains\arm-linux-androideabi-4.9\prebuilt...addr2line 是通过 pc (程序计数器)值来定位代码,“-e” 后加 .so 文件名,“-f”表示输出函数名。实际上从 log 中可以看到 AndroidStudio 自动帮我们做了这件事。...根据 .so 是 32 位还是 64 位选择对应的 addr2line 工具,执行 aarch64-linux-android-addr2line.exe -e -f ...另外在使用 addr2line 过程中经常会遇到 “??:?” 或 “??
替换更快的 add2line-rs git clone https://github.com/gimli-rs/addr2line cd addr2line cargo b --examples -r.../target/release/examples/addr2line 这样你的 jeprof 就会从 30 分钟飞速到
:0 排查原因,说明内存地址都是进程地址空间的绝对地址,动态链接库在每次加载是都可能被映射在进程内存地址空间的不同位置,因而addr2line无法根据符号的地址空间绝对地址转换到代码行数。...如果手动转换的话,需要先通过/proc/[pid]/maps找到我们的动态链接库映射的内存基地址,然后算出backtrace每个地址对应的动态链接库内部的偏移地址,再通过addr2line来将内存地址转换到代码文件的行号
获取二进制文件包含的字符串常量 strip 去除二进制文件包含的符号 readelf 显示目标文件详细信息 objdump 尽可能反汇编出源代码 addr2line...addr2line(根据地址查找代码行) 当某个进程崩溃时,日志文件(/var/log/messages)中就会给出附加的信息,包括程序终止原因、故障地址,以及包含程序状态字(PSW)、通用寄存器和访问寄存器的简要寄存器转储...eg:Mar 31 11:34:28 l02 kernel: failing address: 0 如果可执行文件包括调试符号(带-g编译的),使用addr2line,可以确定哪一行代码导致了问题。...eg:addr2line –e exe addr 其实gdb也有这个功能,不过addr2line的好处是,很多时候,bug很难重现,我们手上只有一份crash log。...这样就可以利用addr2line找到对应的代码行,很方便。 注意: 1. 该可执行程序用-g编译,使之带调试信息。 2. 如果crash在一个so里面,那addr2line不能直接给出代码行。
由于txt中保存的是内存地址, 而addr2line需要的是so的相对地址, 所以我们需要获取libUE.so的内存地址, 做个减法, 才能使用addr2line进行翻译....有了so的相对地址, 就可以使用addr2line进行翻译了: arm-linux-androideabi-addr2line.exe -C -s -f -e libUE4.so [ADDRESS] 但是
p私有位 于是我们计算8cf84c54(代码的具体位置) -8cf84000(so的加载起始位置) =0xc54(so库中对应方法的地址) 我们使用addr2line找到这个地址的代码,这里可以看到是XXXXXXXtest_jni.c...这里有个小问题,按照ddms这个工具的本身意图,当我们配置好addr2line之后,配置好符号查找位置后,应该自动会解析成符号,而不是地址。...但是这里老是提示addr2line工具找不到,很是崩溃,无语,所以才有了上面的手动解析地址到方法的手段。 不过话说回来,这样子不是更学到了内容,还是值得高兴的事情。
'/lib/libpthread-2.22.so': No such file /usr/bin/objdump: '/lib/ld-2.22.so': No such file /usr/bin/addr2line...: '/lib/libgcc_s.so.1': No such file /usr/bin/addr2line: '/lib/libc-2.22.so': No such file Total: 18659
定位crash问题--addr2line 有时候程序崩溃了但不幸没有生成core文件,是不是就完全没有办法了呢?还是cmdTest的例子。...7ffc230d9280 error:0 in cmdTest[400000+1000] 该信息记录了cmdTest运行出错的基本原因(divide error)和出错位置(40053b),我们使用addr2line...命令获取出错具体行号: addr2line -e cmdTest 40053b /home/hyb/practice/cmdTest.c:4 可以看到addr2line命令将地址(40053b)翻译成了文件名
领取专属 10元无门槛券
手把手带您无忧上云