首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【Android NDK 开发】NDK CC++ 代码崩溃调试 - Tombstone 报错信息日志文件分析 ( 使用 addr2line 命令行工具查找动态库中的报错代码位置 )

文章目录 一、从 Tombstone 报错日志中查找报错动态库 二、addr2line 命令行工具使用 64 位动态库使用的 aarch64-linux-android-addr2line.exe 工具...32 位动态库使用的 arm-linux-androideabi-addr2line.exe 工具 使用 addr2line 命令行工具分析动态库 Tombstone 报错信息日志文件被保存在了 /data.../system/lib64/libart.so 动态库的 0x00000000004a5630 地址 , 具体的该地址对应的代码 , 需要通过 addr2line 命令行工具进行确定 ; 二、addr2line...命令行工具使用 ---- 64 位动态库使用的 aarch64-linux-android-addr2line.exe 工具 在 Android NDK 开发中 , 使用的 addr2line 命令行工具是在...命令行工具是在 SDK 的 ndk-bundle\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin 目录下的 arm-linux-androideabi-addr2line.exe

1.3K10

Go:配套工具addr2line,问题定位和性能优化利器

引言 在Go程序开发中,理解工具链的各个组成部分对于有效地解决bug和优化性能至关重要。本文将深入探讨Go语言中的一个较少被提及但功能强大的工具——addr2line。...性能分析:在使用像 pprof 这样的性能分析工具后,分析报告中可能包含许多只有地址的函数调用信息,使用 addr2line 可以将这些地址转换成具体的函数调用,使分析结果更加直观。...使用方法 使用 addr2line 的基本命令格式如下: bash go tool addr2line [options] binary 这里的 binary 是指已编译的Go程序的二进制文件。...一个基本的使用例子是: bash echo 0x45cff0 | go tool addr2line /path/to/binary 这个命令将显示内存地址 0x45cff0 在二进制文件 /path/...使用以下命令: bash echo 0x45cff0 | go tool addr2line -e /usr/local/bin/example 输出可能如下: /path/to/source/file.go

25710
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    NDK 开发中快速定位 crash 问题

    在 NDK 开发中,排查问题遇到的最熟悉的关键字非 backtrace 莫属,Linux 系统中进程 crash 后通过 backtrace 输出堆栈信息,开发者就是基于这些堆栈信息来定位代码问题。...当然定位 Native 层代码问题最优的方式还是通过 IDE(AS、VS)或者 GDB 进行 debug 断点调试,本文针对的是使用第三方 C/C++ SDK 出现 crash 的场景。...在多线程场景中,这种方式非常有用,通过搜索 logcat 抓到的日志,能帮你快速定位在某个线程中代码执行到哪个位置出现了问题。 2....用 addr2line 工具定位 addr2line 顾名思义,是内存地址转换成代码行号的工具。...-linux-android-4.9\prebuilt\windows-x86_64\bin\aarch64-linux-android-addr2line.exe 执行 crash 代码得到的 crash

    1.1K20

    C++的backtrace

    之前我也想过给我们的log模块加上C++的backtrace的功能,迟迟一直没有做主要是两个原因:一是C++的backtrace在各个平台和编译器上都不太一样,比较冗杂;二是C/C++在编译优化之后,调用行之类的信息和甚至一些函数可能就被优化没了...Windows环境 backtrace方案 Windows上的MinGW64里没有execinfo.h的头文件,gcc和clang都没有,所以不能用上面提到的方法。...这样的话怕是在突发性的大量使用的情况下(比如服务突然间短暂的异常,打印了茫茫多Error Log)会大幅降低性能。所以我感觉还是优先用第一种方式好一些。 不过无论哪种方法。...所以我们在Windows下得gcc和clang提取调用栈得时候得跳过符号解析。所幸我们仍然可以用addr2line来解析地址。所以就有了以下结果。...另外utils的代码在Linux/Windows和macOS上测试过ok了。valgrind也跑过了没有问题。唯一的麻烦是不同平台的libunwind的以来库不太一样。

    7.4K40

    Linux调试工具

    strace 在编程时,检查函数的返回值是一种好习惯。对于像glibc等标准C的函数,光检查返回值是不够的,还需要检查errno的值。这样的程序往往显得冗长,不够简洁。...你可能会问,这与有调试程序有关系吗?有的。比如,在linux中,共享库里所有非static的函数/全局变量都是export的,更糟的是C语言中没有名字空间这个概念,导致函数名极易冲突。...但与长时间坐在GDB命令行前面相比,许多人还是更愿意使用诸如DDD或Eclipse这样的图形化工具。...addr2line 把程序地址转换为文件名和行号。在命令行中给它一个地址和一个可执行文件名,它就会使用这个可执行文件的调试信息指出在给出的地址上是哪个文件以及行号。...pev pev是一个小巧的基于命令行的windows可执行文件(PE)分析工具,支持linux、windows和OSX系统。

    10K43

    android native 代码内存泄露 定位方案

    回到我们这节的主要内容,如何定位我们的c c++的内存泄露。...里面的方法,像比较而言,多了一些记录信息,将每次的申请时的地址,堆栈,so等信息记录下来,然后我们需要的时候,则通过工具ddms dump出来,进行分析每个申请的内存,是否正常的释放了,是否出现了内存泄露...的13行,具体为,还是这个图: 找到代码: 我们这里看到 malloc 申请的大小为 100字节 代码位置为13行,我们一直在申请,没有释放过,如上验证了c c++ 内存问题,可以通过此方案进行调试...这里有个小问题,按照ddms这个工具的本身意图,当我们配置好addr2line之后,配置好符号查找位置后,应该自动会解析成符号,而不是地址。...但是这里老是提示addr2line工具找不到,很是崩溃,无语,所以才有了上面的手动解析地址到方法的手段。 不过话说回来,这样子不是更学到了内容,还是值得高兴的事情。

    4.8K100

    Android NDK 开发中快速定位 Crash 问题

    在 Android NDK 开发中,排查问题遇到的最熟悉的关键字非 backtrace 莫属,Linux 系统中进程 crash 后通过 backtrace 输出堆栈信息,开发者就是基于这些堆栈信息来定位代码问题...在多线程场景中,这种方式非常有用,通过搜索 logcat 抓到的日志,能帮你快速定位在某个线程中代码执行到哪个位置出现了问题。 2....用 addr2line 工具定位 addr2line 顾名思义,是内存地址转换成代码行号的工具。...-linux-android-4.9\prebuilt\windows-x86_64\bin\aarch64-linux-android-addr2line.exe 执行 crash 代码得到的 crash...:0” 这种情况,原因就是一般 C/C++ 代码在编译配置中不生成符号表 symbolic 信息,不过 AndroidStudio 会默认为 so 文件添加符号表。 -- END --

    1.4K30

    BreakPad模拟Android native崩溃

    information),并生成 symbol file processor, 读取 minidump文件 和 symbol file,生成可读的c/c++ Stack trace....,路径中不要指定具体执行文件名,否则会报找不到相关命令,例如${BREAKPAD_HOME}/src/tools/linux/dump_syms/dump_syms,这样执行dump_syms命令会找不到...一开始本人在编译的时候用的是ndk20的,发现提示C和C++编译器没有设置.经过好几次反复才发现原来是ndk版本太高,导致了用的是clang去编译的,然后就一直抱那个错.后来降低成ndk16就通过了....(注意CPU是arm64)可以使用 ndk 中提供的addr2line来根据地址进行一个符号反解的过程,该工具在 $NDK_HOME/toolchains/aarch64-linux-android-4.9.../prebuilt/darwin-x86_64/bin/aarch64-linux-android-addr2line 进入addr2line所在目录输入(注意地址arm64用aarch64下的工具链解析

    1.6K20

    linux后台开发常用调试工具

    ) 符号:函数、变量 参数: -C 把C++函数签名转为可读形式 -A 列出符号名的时候同时显示来自于哪个文件。...eg:addr2line –e exe addr 其实gdb也有这个功能,不过addr2line的好处是,很多时候,bug很难重现,我们手上只有一份crash log。...这样就可以利用addr2line找到对应的代码行,很方便。 注意: 1. 该可执行程序用-g编译,使之带调试信息。 2. 如果crash在一个so里面,那addr2line不能直接给出代码行。...参数: -a 在显示函数名或文件行号前显示地址 -b 指定二进制文件格式 -C 解析C++符号为用户级的名称,可指定解析样式 -e 指定二进制文件...、查看检测结果等步骤,以下为常用的oprofile命令。

    3.8K151

    LeakTracer使用教程

    LeakTracer使用教程 在进行评测工具的开发时,发现最终跑出来的内存曲线如下图所示。...呈缓慢的增长趋势,但是在代码review的时候,并未发现有明显的内存泄漏问题,为排查这个问题,决定在评测工具中引入基于NDK的C++内存检查工具LeakTracer(其实还有其他的同类型检测工具如Valgrind...:0 排查原因,说明内存地址都是进程地址空间的绝对地址,动态链接库在每次加载是都可能被映射在进程内存地址空间的不同位置,因而addr2line无法根据符号的地址空间绝对地址转换到代码行数。...如果手动转换的话,需要先通过/proc/[pid]/maps找到我们的动态链接库映射的内存基地址,然后算出backtrace每个地址对应的动态链接库内部的偏移地址,再通过addr2line来将内存地址转换到代码文件的行号...在MemoryTrace::init_no_alloc_allowed()中添加以下句子: ? 再次执行命令,文件解析成功,内存问题展示如下: ?

    3.7K20

    从源头解决内存泄漏问题:全面解析内存泄漏检测与修复技术

    内存泄漏是没有自动 gc 的编程语言所产生的,解决方案一,引入 gc。这是根治内存泄漏的最好的方案。但是这样的方案有失去了 c/c++语言的优势。...要使用的可重定位对象中的节是用-j选项指定的。addr2line有两种操作模式。在第一个命令行中,十六进制地址在命令行中指定,addr2line显示每个地址的文件名和行号。...在第二个命令中,addr2line从标准输入中读取十六进制地址,并在标准输出中打印每个地址的文件名和行号。在这种模式下,addr2line可以在管道中用于转换动态选择的地址。...注意:addr2line是将地址转换为文件号,而文件是保存在磁盘中的,程序运行的地址是在虚拟内存里面的(代码段),在高版本Linux 中可能无法解析出地址在文件哪个位置。...检测内存泄漏不是一开始就加上,一般通过”热更新“的方式在需要的时候打开,即在配置文件中有一个打开内存泄漏检测的标志位。只有需要的时候才开启,这样不影响程序效率。

    50320

    linux内核调试工具-addr2line和gdb定位问题

    之前没有用过addr2line和gdb等内核调试工具定位问题代码,这里记录一下在将某个网络驱动从4.9内核移植到5.7内核时出现内核崩溃起不来的问题。...定位 首先找出函数地址,在源码编译目录下的System.map中可以找到,这里错误函数是ethtool_check_ops,在System.map文件找到地址是   ffff800011ad4310 T...我用的编译链是aarch64-linux-gnu-,所以addr2line前面也要加这个前缀,这里一开始有个问题,我使用addr2line的时候没有输出代码行号,只输出两个"??"...2.通过gdb定位 使用 aarch64-linux-gnu-gdb vmlinux 命令进入gdb调试行,输入以下命令 (gdb) b*(0xFFFF800011AD4328) Breakpoint...中的ops这里有问题,查看驱动中ethtool_ops这个结构体中缺少supported_coalesce_params,看了其他像intel网卡驱动中的ethtool.c文件中都有这个值,于是在该结构体中添加

    1.6K10

    addr2line 动态库

    二、实践部分 1、获取程序的调用栈 在Linux上的C/C++编程环境下,我们可以通过如下三个函数来获取程序的调用栈信息。...,它有三个文件组成分别是backtrace.c、dump.c、add.c,其中add.c提供了对一个数值进行加一的方法,我们在它的执行过程中故意使用了一个空指针并为其赋值,这样人为的造成段错误的发生;dump.c...这似乎还不够,更准确的位置应该是在地址0x400a3e处,但这到底是哪一行呢,我们使用addr2line命令来得到,执行如下: zoulm@zoulm-VirtualBox:/home/share/work...有上面的认识后那我们就只需要得到此次libadd.so的加载地址然后用0x7f85839fa5c6这个地址减去libadd.so的加载地址得到的结果再利用addr2line命令就可以正确的得到出错的地方...所有我们正确的地址应为0x7f0962fb35c6 – 7f0962fb3000 = 0x5c6,将这个地址利用addr2line命令得到如下结果: zoulm@zoulm-VirtualBox:/home

    2.8K20

    golang源码阅读(11)GO中各个目录的功能

    |– VERSION — 文件,当前Go版本 |– api — 目录,包含所有API列表,方便IDE使用 |– doc — 目录,Go语言的各种文档,官网上有的,这里基本会有,这也就是为什么说可以本地搭建...注意:在看源码过程中可能会看到 1ARGBEGIN{ 2}ARGEND 这是在libc.h中定义的宏。这是一些处理命令行参数的宏。...12)addr2line linux下有这个命令。 这是一个addr2line的模拟器,只是为了使pprof能够在mac上工作。...关于addr2line,可以查看linux的man手册,也可以看addr2line探秘 13)objdump linux下有这个命令。...这个文件的作用是:运行go tool dist去安装命令,同时在安装过程中会打印出执行了该文件的目录名。可见,在源码安装Go的过程中,打印出的大部分信息就是这个文件的作用。

    75630

    鸿蒙5.0版开发:分析CppCrash(进程崩溃)

    在HarmonyOS 5.0中,CppCrash指的是C/C++运行时崩溃,这类崩溃可能由空指针异常、数组越界异常、栈溢出异常等原因引起。...基于崩溃栈定位行号在应用开发场景中,对于应用自身的动态库,生成的cppcrash堆栈可以直接跳转到代码行处,支持Native栈帧和JS栈帧,无需开发者自行进行解行号操作。...对于部分未能解析跳转到对应行号的栈帧,可以通过以下方式进行解析:DevEco Studio开发者环境下,支持调用栈直接跳转到对应行号:在应用开发场景,对于应用自身的动态库,生成的cppcrash堆栈可以直接跳转到代码行处...使用addr2line工具:对于未能直接跳转的栈帧,可以使用addr2line工具将地址转换为代码行号。例如,使用以下命令:$ addr2line -Cpie ....:$ addr2line -Cpie .

    11700
    领券