之前没有用过addr2line和gdb等内核调试工具定位问题代码,这里记录一下在将某个网络驱动从4.9内核移植到5.7内核时出现内核崩溃起不来的问题。...0000000000000000 [ 2.663929] x1 : 0000000000000000 x0 : 0000000000000000 [ 2.669191] Call trace: 1.通过addr2line...我用的编译链是aarch64-linux-gnu-,所以addr2line前面也要加这个前缀,这里一开始有个问题,我使用addr2line的时候没有输出代码行号,只输出两个"??"...-linux-gnu-addr2line -e vmlinux FFFF800011AD4328 net/ethtool/common.c:346 定位问题代码在net/ethtool/common.c...2.通过gdb定位 使用 aarch64-linux-gnu-gdb vmlinux 命令进入gdb调试行,输入以下命令 (gdb) b*(0xFFFF800011AD4328) Breakpoint
[root@HI J]# arm-eabi-addr2line -e KERNEL_OBJ/vmlinux c0008520
但是利用addr2line这个工具,就可以找到对应的代码行。前提条件是可执行程序或者动态链接库编译的时候带-g选项。...在Linux下,进程的memory map可以在/proc//maps文件中得到。...不过相比addr2line,GDB需要将BUG现象重现一遍,所以对于不好重现的BUG,或是随机重现的BUG来说,使用addr2line就可以直接从backtrace找到对应的代码行,不需要重现现象,比GDB...二、实践部分 1、获取程序的调用栈 在Linux上的C/C++编程环境下,我们可以通过如下三个函数来获取程序的调用栈信息。.../backtrace(signal_handler+0x31) [0x400b63] [02] /lib/x86_64-linux-gnu/libc.so.6(+0x36150) [0x7f86afc7e150
常用的地址转换工具有addr2line、ndk-stack等,个人比较喜欢addr2line,所以接下来介绍下该工具的基本使用方式 addr2line简介 使用-h参数查看工具的可选参数配置 日常使用过程中...将C++源代码转换为C++ ABI标识符的过程称为mangle,相反的过程称为demangle 以Linux下的g++为例,每个方法都以_Z开头,比如_Z3foov就是函数foo(),v表示参数类型为void...其中NDK中的aarch64-linux-android-c++fil(和addr2line同一个目录)是专门用来支持Demangle的 addr2line使用示例 新建一个带C++的Android Studio...工程,主动创造一个native crash 启动app后如预期崩溃 抓到崩溃信息后,根据ABI找到相对应的addr2line工具和带符号表的so文件。...转换地址 aarch64-linux-android-addr2lin -C -f -e ${SO_PATH} ${Address} ${Address} ...
在 Linux 下写 C/C++ 程序的程序员,时常与 Core Dump 相见。...在内存越界访问,收到不能处理的信号,除零等错误出现时,我们精心或不精心写就的程序就直接一命呜呼了,Core Dump 是 Linux 仁慈地留下的程序的尸体,帮助程序员们解决了一个又一个问题。...有时配置不给力,Linux 直接毁尸灭迹,没有了 Core 文件;又有时,刚好磁盘空间不足,Core文件写不下了。没有 Core 文件的时候,如何知道程序在什么地方出错了呢?...使用 addr2line 就可以将 400534 地址转换出对应的文件及行数: 可知,程序在执行到 test.c 文件第五行的时候,执行出错,我们检查第五行代码。...return a / b; 这里除 0 肯定是不行的,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...-4.9\prebuilt\windows-x86_64\bin 目录下的 arm-linux-androideabi-addr2line.exe ; 使用 addr2line 命令行工具分析动态库
用 addr2line 工具定位 addr2line 顾名思义,是内存地址转换成代码行号的工具。...NDK 中自带 addr2line ,一般位于以下目录中: //32bit D:\NDK\android-ndk-r16\toolchains\arm-linux-androideabi-4.9\prebuilt...-linux-android-4.9\prebuilt\windows-x86_64\bin\aarch64-linux-android-addr2line.exe 执行 crash 代码得到的 crash...根据 .so 是 32 位还是 64 位选择对应的 addr2line 工具,执行 aarch64-linux-android-addr2line.exe -e -f ...另外在使用 addr2line 过程中经常会遇到 “??:?” 或 “??
addr2line的核心功能 addr2line 是Go语言配套工具集中的一个工具,它主要用于将程序的内存地址转换为对应的源代码位置。这在分析程序崩溃的堆栈跟踪或性能分析数据时非常有用。...通常,这些数据只提供内存地址,而通过使用 addr2line,开发者可以将这些地址映射回具体的代码行,从而更容易地理解和调试程序。...核心转储分析:分析核心转储文件时,addr2line 能帮助将地址映射回源代码,简化调试过程。...使用方法 使用 addr2line 的基本命令格式如下: bash go tool addr2line [options] binary 这里的 binary 是指已编译的Go程序的二进制文件。...后续我会继续研究,整理pprof和delve结合addr2line使用的文章,敬请关注!
addr2line有两种操作模式。在第一个命令行中,十六进制地址在命令行中指定,addr2line显示每个地址的文件名和行号。...在第二个命令中,addr2line从标准输入中读取十六进制地址,并在标准输出中打印每个地址的文件名和行号。在这种模式下,addr2line可以在管道中用于转换动态选择的地址。...注意:addr2line是将地址转换为文件号,而文件是保存在磁盘中的,程序运行的地址是在虚拟内存里面的(代码段),在高版本Linux 中可能无法解析出地址在文件哪个位置。...:133.2、方式二:采用宏定义Linux中有两个宏__FILE__、__func__和__LINE__,分别指示当前的文件名、函数名和行号,利用宏定义封装内存分配函数和释放函数。...= malloc(20);void *p3 = malloc(30);free(p3);free(p2);return 0;}3.5、方式五:__malloc_hook(不推荐)这种方式适用于比较老的Linux
相应的工具有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
有了堆栈地址, 我们可以通过arm-linux-androideabi-addr2line.exe把地址翻译成函数名....由于txt中保存的是内存地址, 而addr2line需要的是so的相对地址, 所以我们需要获取libUE.so的内存地址, 做个减法, 才能使用addr2line进行翻译....有了so的相对地址, 就可以使用addr2line进行翻译了: arm-linux-androideabi-addr2line.exe -C -s -f -e libUE4.so [ADDRESS] 但是
/linux_dumper.cc ${BREAKPAD_ROOT}/src/client/linux/minidump_writer/linux_ptrace_dumper.cc...x4 = 0x0000007feddeaa00 x5 = 0x0000007a7e1a7965 @ "crash.log" 2226L, 114492B 我这我们需要下个一工具继续分析,addr2line...3.2 addr2line 基本用法如下 Usage: aarch64-linux-android-addr2line [option(s)] [addr(s)] Convert addresses...the input file name (default is a.out) 指定输入文件 -f --functions Show function names 显示函数名称 而addr2line...命令所在的路径如下,可以根据崩溃信息中的设备的cpu架构来选择对应的addr2line。
前言 Linux常用命令中有一些命令可以在开发或调试过程中起到很好的帮助作用,有些可以帮助了解或优化我们的程序,有些可以帮我们定位疑难问题。本文将简单介绍一下这些命令。..._64-linux-gnu/libc.so.6 (0x00007f0621931000) /lib64/ld-linux-x86-64.so.2 (0x00007f0621cf6000)...定位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)翻译成了文件名
'/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...prefixes # 逗号分隔的动态库搜索路径列表 所以加上--lib_prefix指定这些缺失的动态库所在的位置就好了,对于君正的编译器这个位置在mips-gcc520-glibc222/mips-linux-gnu.../test_capture test_capture.prof --text \ --lib_prefix=/opt/toolchains/mips-gcc520-glibc222/mips-linux-gnu
/configure && make 编译完以后会在生成两个可执行文件,分别是src/processor/minidump_stackwalk和src/tools/linux/dump_syms/dump_syms.../dump_syms # 此处需要注意的是,路径中不要指定具体执行文件名,否则会报找不到相关命令,例如${BREAKPAD_HOME}/src/tools/linux/dump_syms/dump_syms...发生时候的线程 0 libnative-lib.so + 0x325f4 //发生 crash 的位置和寄存器信息 有了具体的寄存器信息,我们进行符号解析(注意CPU是arm64)可以使用 ndk 中提供的addr2line...来根据地址进行一个符号反解的过程,该工具在 $NDK_HOME/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin/aarch64...-linux-android-addr2line 进入addr2line所在目录输入(注意地址arm64用aarch64下的工具链解析arm64-v8a下的so文件) aarch64-linux-android-addr2line
工欲善其事必先利其器,使用add2line 和ndk-stack等工具分析JNI Crash的log addr2line 作用是根据内存地址找到对应的报错代码的文件名和行号 所在目录是toolchain...的bin文件夹, 比如 aarch64-linux-android-4.9对应的bin文件夹是 /Android/Sdk/ndk-bundle/toolchains/aarch64-linux-android.../Android/Sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin 用法: # -f表示显示函数名...有时候用addr2line发现能显示函数名但行号是乱码??,有可能是因为这个so被strip了。...命令格式: arm-linux-androideabi-objdump -dx xx.so > stacktrace.txt 或 aarch64-linux-android-objdump -dx xx.so
- 使用 nm 命令查看可执行文件nm hello |grep 44add0 # 第 3 步查到的 Entry point address000000000044add0 T _rt0_amd64_linux...静态分析 - 使用 addr2line 命令找到入口的代码行数addr2line -f -e hello 0x44add0 # 第 3 步查到的 Entry point address_rt0_amd64..._linux/usr/local/go/src/runtime/rt0_linux_amd64.s:86.
eg:addr2line –e exe addr 其实gdb也有这个功能,不过addr2line的好处是,很多时候,bug很难重现,我们手上只有一份crash log。...这样就可以利用addr2line找到对应的代码行,很方便。 注意: 1. 该可执行程序用-g编译,使之带调试信息。 2. 如果crash在一个so里面,那addr2line不能直接给出代码行。...ldd(显示程序需要使用的动态库和实际使用的动态库) # ldd /bin/ls linux-gate.so.1 => (0xbfffe000) librt.so.1...libc.so.6 (0xb7dc3000) libpthread.so.0 => /lib/libpthread.so.0 (0xb7dab000) /lib/ld-linux.so...opannotate -s test : 以代码的角度,针对test进程显示检测结果 opannotate -s /lib64/libc-2.4.so : 以代码的角度,针对libc-2.4.so库显示检测结果 linux
addr2line addr2line是NDK中用来获得指定动态链接库文件或者可执行文件中指定地址对应的源代码信息,它们位于NDK包中的如下位置中,以arm64架构为例: $NDK_HOME/toolchains.../aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin/aarch64-linux-android-addr2line 其中NDK_HOME表示...linux-android/lib/ x86 $TOOLCHAIN/i686-linux-android/lib/ x86_64 $TOOLCHAIN/x86_64-linux-android/lib/...addr2line的使用说明如下所示: Usage: ....objdump也是ndk自带的一个工具,通常与addr2line在同一目录: $NDK_HOME/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86
领取专属 10元无门槛券
手把手带您无忧上云