addr2line_addr2line行号 问号 - CSDN
精华内容
参与话题
  • Addr2line 工具(它是标准的 GNU Binutils 中的一部分)是一个可以将指令的地址和可执行映像转换成文件名、函数名和源代码行数的工具。这种功能对于将跟踪地址转换成更有意义的内容来说简直是太棒了。 要了解这个...
    Addr2line 工具(它是标准的 GNU Binutils 中的一部分)是一个可以将指令的地址和可执行映像转换成文件名、函数名和源代码行数的工具。这种功能对于将跟踪地址转换成更有意义的内容来说简直是太棒了。
    要了解这个过程是怎样工作的,我们可以试验一个简单的交互式的例子。这个示例 C 文件(main.c)是通过 cat 一个简单的应用程序实现的(也就是说,将标准输出的文本重定向到一个文件中)。然后使用 gcc 来编译这个文件,它会传递一些特殊的选项。首先,要(使用 -Wl 选项)通知链接器生成一个映像文件,并(使用 -g 选项)通知编译器生成调试符号。最终生成可执行文件 test。得到新的可执行应用程序之后,您就可以使用grep 工具在映像文件中查找 main 来寻找它的地址了。使用这个地址和 Addr2line 工具,就可以判断出函数名(main)、源文件(/work/main.c)以及它在源文件中的行号(4)。

    在调用 Addr2line 工具时,要使用 -e 选项来指定可执行映像是 test。通过使用 -f 选项,可以告诉工具输出函数名。

    [root@localhost work]# cat main.c
    #include <stdio.h>


    int main(void)
    {
    char *str = "hello";
    str[0] = 'h';
    return 0;
    }

    [root@localhost work]# gcc -Wl,-Map=main.map -g -o main main.c(编译生成可执行文件及main.map)
    [root@localhost work]# ls
    1.txt  main  main.c  main.map

    [root@localhost work]# grep main main.map
                    0x00000000080482c4                __libc_start_main@@GLIBC_2.0
                    0x0000000008048394                main
    OUTPUT(main elf32-i386)
    [root@localhost work]# addr2line 0x0000000008048394 -e main -f
    main
    /work/main.c:4


    展开全文
  • addr2line命令使用

    万次阅读 2018-05-10 18:24:19
    Addr2line 可以将函数地址解析为函数名Addr2line 工具(它是标准的 GNU Binutils 中的一部分)是一个可以将指令的地址和可执行映像转换成文件名、函数名和源代码行数的工具。这种功能对于将跟踪地址转换成更有...

    用 Addr2line 可以将函数地址解析为函数名

    Addr2line 工具(它是标准的 GNU Binutils 中的一部分)是一个可以将指令的地址和可执行映像转换成文件名、函数名和源代码行数的工具。这种功能对于将跟踪地址转换成更有意义的内容来说简直是太棒了。

    要了解这个过程是怎样工作的,我们可以试验一个简单的交互式的例子。(我直接从 shell 中进行操作,因为这是最简单地展示这个过程的方法,如清单 4 所示。)这个示例 C 文件(test.c)是通过 cat 一个简单的应用程序实现的(也就是说,将标准输出的文本重定向到一个文件中)。然后使用 gcc 来编译这个文件,它会传递一些特殊的选项。首先,要(使用 -Wl 选项)通知链接器生成一个映像文件,并(使用 -g 选项)通知编译器生成调试符号。最终生成可执行文件 test。得到新的可执行应用程序之后,您就可以使用grep 工具在映像文件中查找 main 来寻找它的地址了。使用这个地址和 Addr2line 工具,就可以判断出函数名(main)、源文件(/home/mtj/test/test.c)以及它在源文件中的行号(4)。

    在调用 Addr2line 工具时,要使用 -e 选项来指定可执行映像是 test。通过使用 -f 选项,可以告诉工具输出函数名。

    下面在全志A20平台介绍使用addr2line命令使用方法

    1.打开调试宏

    将下面红色部分的return NULL屏蔽

    #define TOMBSTONE_DIR   "/mnt/extsd/tombstones"

    char* engrave_tombstone(pid_t pid, pid_t tid, int signal,
            bool dump_sibling_threads, bool quiet, bool* detach_failed,
            int* total_sleep_time_usec) {
    //return NULL;//ignore request tombstone. by yangy.
        mkdir(TOMBSTONE_DIR, 0755);
        chown(TOMBSTONE_DIR, AID_SYSTEM, AID_SYSTEM);

    2.之后出现的段错误将会在TF卡中的tombstones文件夹中保存

    *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
    Build fingerprint: 'unknown'
    Revision: '0'
    pid: 907, tid: 966, name: InitStage2  >>> /system/bin/newcdr <<<
    signal 6 (SIGABRT), code -6 (?), fault addr --------
        r0 81f2a668  r1 40f8b814  r2 40f95330  r3 3ab0a84b
        r4 40f8b808  r5 40f95338  r6 40f8b814  r7 00000000
        r8 40f8b80c  r9 00100000  sl 40f87750  fp 00000000
        ip 4012fba4  sp 412addd0  lr 40121cb7  pc 40229b70  cpsr 90000030
        d0  6c6576656c207974  d1  65726854726f7365
        d2  00000000656c6174  d3  3d1ce80a6f726553
        d4  3ce6000002000000  d5  646e61203d1ce80a
        d6  7220657669726420  d7  0000000073696765
        d8  0000000000000000  d9  0000000000000000
        d10 0000000000000000  d11 0000000000000000
        d12 0000000000000000  d13 0000000000000000
        d14 0000000000000000  d15 0000000000000000
        d16 3f686a0000000000  d17 3fc99999a0000000
        d18 3fdfffffffbcdc80  d19 3fe0000000000000
        d20 3fe00000002191c0  d21 be0835142e800000
        d22 bf701acdbb94a830  d23 bf66c16b8a684294
        d24 3fc55554f93c9426  d25 3fefdfdfdfdfdfe0
        d26 3fd55559bbdd3a9f  d27 3fdb6dbc40ea66d3
        d28 3fe33336ab4b34f0  d29 bf70101010101000
        d30 3fffefef00000000  d31 0000000000000000
        scr 20000010


    backtrace:
        #00  pc 0000cb70  /system/lib/libutils.so (android::RefBase::incStrong(void const*) const+1)
        #01  pc 00026cb3  /system/bin/newcdr



    stack:
             412add90  404ac2ac  
             412add94  00000000  
             412add98  4012b956  /system/bin/newcdr
             412add9c  404ac29c  
             412adda0  00000000  
             412adda4  40f8b808  
             412adda8  4022bd9d  /system/lib/libutils.so (android::Thread::run(char const*, int, unsigned int))
             412addac  40f8b814  
             412addb0  00000000  
             412addb4  40f8b80c  
             412addb8  00100000  
             412addbc  3ab0a84b  
             412addc0  40f8b808  
             412addc4  40f95338  
             412addc8  df0027ad  
             412addcc  00000000  
        #00  412addd0  40f8b808  
             412addd4  40121cb7  /system/bin/newcdr
        #01  412addd8  40f8b808  
             412adddc  40f87be0  
             412adde0  404ae560  
             412adde4  40f8b808  
             412adde8  401dc228  
             412addec  00000000  
             412addf0  4022b99d  /system/lib/libutils.so
             412addf4  4010d8d7  /system/bin/newcdr
             412addf8  00000000  
             412addfc  00000000  
             412ade00  00000000  
             412ade04  00000000  
             412ade08  00000000  
             412ade0c  01000000  
             412ade10  00000001  
             412ade14  00000000  

    3.进到bin目录

    使用addr2line -C -f -e  newcdr 00026cb3命令查看出错位置

    liubin@tf-srv01:~/allwinner/a20_liubin/a20_cdr_stable/camdroid/out/target/product/pluto-tf118kd-t1b/symbols/system/bin$ addr2line -C -f -e  newcdr 00026cb3
    EventManager::init(bool)
    /home/liubin/allwinner/a20_liubin/a20_cdr_stable/camdroid/device/softwinner/pluto-tf118kd-t1b/newcdr/src/event/EventManager.cpp:338

    当然我们自己写带c/c++段错误也可以用这个工具来调试


    https://blog.csdn.net/miss33445210/article/details/50498362

    展开全文
  • Linux addr2line具体应用指南

    千次阅读 2012-05-14 16:52:40
    调试zSeries上的Linux应用程序类似于调试其他体系结构上的Linux应用程序。...本文将提供Linux addr2line一些有用的提示来帮助您入门。 UserDebug日志记录 调试一个崩溃的程序的第一步是弄清哪里出了错。zSer

    调试zSeries上的Linux应用程序类似于调试其他体系结构上的Linux应用程序。对于有经验的Linux开发人员,最大的挑战是理解新的系统体系结构。对于刚接触Linux的大型机开发人员,掌握新的调试工具似乎是一项令人畏惧的任务。不要害怕。本文将提供Linux addr2line一些有用的提示来帮助您入门。

    UserDebug日志记录

    调试一个崩溃的程序的第一步是弄清哪里出了错。zSeries上的Linux内核具有这样一个内置特性,它在用户进程崩溃时记录一些基本的调试信息。要启用这个特性,请以root用户身份执行如下命令:
    echo1>>/proc/sys/kernel/userprocess_debug

    当某个进程崩溃时,日志文件(/var/log/messages)中就会给出附加的信息,包括程序终止原因、故障地址,以及包含程序状态字(PSW)、通用寄存器和访问寄存器的简要寄存器转储。
     

    1. Mar3111:34:28l02kernel:Userprocessfault:interruptioncode0x10  
    2. Mar3111:34:28l02kernel:failingaddress:0  
    3. Mar3111:34:28l02kernel:CPU:1  
    4. Mar3111:34:28l02kernel:Processsimple(pid:30122,stackpage=05889000)  
    5. Mar3111:34:28l02kernel:  
    6. Mar3111:34:28l02kernel:UserPSW:070dc000c00ab738  
    7. Mar3111:34:28l02kernel:task:05888000ksp:05889f08pt_regs:05889f68  
    8. Mar3111:34:28l02kernel:UserGPRS:Mar3111:34:28l02kernel:00000000004019a0004019a000000000  
    9. Mar3111:34:28l02kernel:00000003c00ab732004008f800400338  
    10. Mar3111:34:28l02kernel:40018ffc0040061c40018e347ffff800  
    11. Mar3111:34:28l02kernel:00400434804006248040066e7ffff800  
    12. Mar3111:34:28l02kernel:UserACRS:  
    13. Mar3111:34:28l02kernel:00000000000000000000000000000000  
    14. Mar3111:34:28l02kernel:00000001000000000000000000000000  
    15. Mar3111:34:28l02kernel:00000000000000000000000000000000  
    16. Mar3111:34:28l02kernel:00000000000000000000000000000000  
    17. Mar3111:34:28l02kernel:UserCode:  
    18. Mar3111:34:28l02kernel:4440500007fea74a0001185418431835a8240000  

    上面表明程序(名为“simple”)以一个程序中断代码0x10终止(操作系统原理表明这是一个段转换错误),而故障地址为0。毫无疑问,有人使用了空指针。现在我们知道发生了什么,下面需要弄清它发生在何处。

    Linux addr2line基本的诊断

    UserDebug日志条目所提供的信息可用于确定程序的崩溃位置。一些可用的工具可帮助解决您可能会遇到的各种程序终止问题。我们将在本文中逐步介绍那些工具。

    首先,让我们检查一下该日志条目中的用户PSW。该PSW包含指令地址、状态码以及关于机器状态的其他信息。眼下,我们仅关心指令地址(第33至第63位)。为简化起见,让我们假设用户PSW是070dc00080400618。记住,我们是在考察一个ESA/390(31位寻址)PSW。第32位不是指令地址的一部分,它是指示31位寻址模式的标志,但是在研究PSW值时必须处理它。为了获得实际的指令指针,可把PSW的第二个字减去0x80000000。结果是一个指令地址0x400618。为了定位代码,您需要可执行文件中的一些信息。首先使用readelf来打印一些程序头信息。
     

    1. ElffiletypeisEXEC(Executablefile)Entrypoint0x400474Thereare6programheaders,startingatoffset52ProgramHeaders:  
    2. TypeOffsetVirtAddrPhysAddrFileSizMemSizFlgAlign  
    3. PHDR0x0000340x004000340x004000340x000c00x000c0RE0x4  
    4. INTERP0x0000f40x004000f40x004000f40x0000d0x0000dR0x1[Requestingprograminterpreter:/lib/ld.so.1]  
    5. LOAD0x0000000x004000000x004000000x009900x00990RE0x1000  
    6. LOAD0x0009900x004019900x004019900x000fc0x00114RW0x1000  
    7. DYNAMIC0x0009ac0x004019ac0x004019ac0x000a00x000a0RW0x4  
    8. NOTE0x0001040x004001040x004001040x000200x00020R0x4  
    9. SectiontoSegmentmapping:SegmentSections...  
    10. 00  
    11. 01.interp  
    12. 02.interp.note.ABI-tag.hash.dynsym.dynstr.gnu.version  
    13. .gnu.version_r.rela.got.rela.plt.init.plt.text.fini.rodata  
    14. 03.data.eh_frame.dynamic.ctors.dtors.got.bss  
    15. 04.dynamic  
    16. 05.note.ABI-tag  

    上述显示了readelf-lsimple的结果(记住“simple”是我们的测试程序的名称)。在ProgramHeaders部分,第一个LOAD行提供了关于程序从哪里加载的信息。在Flg列,该段被标记为R(read)E(executable)。VirtAddr是程序开始加载的地址。MemSiz是正在被加载到这个段中的代码长度。把它加到VirtAddr上,这个程序的基本地址范围就是0x400000-0x400990。程序发生崩溃的指令地址为0x400618,在程序的加载范围之内。现在我们知道了问题直接发生在代码中。

    如果可执行文件包括调试符号,那么确定哪一行代码导致了问题是可以做到的。对该地址和可执行文件使用addr2line程序,如下所示:
    addr2line-esimple0x400618

    将返回:
    /home/devuser/simple.c:34

    要研究该问题,可以检查第34行。

    对于Linux addr2line原始的程序崩溃,PSW为070dc000c00ab738。要获得指令地址,可减去0x80000000。结果为0x400ab738。这个地址并不准确地落在我们的小程序之内。那么,它是什么呢?是来自共享库的代码。如果对可执行文件运行ldd命令(lddsimple),将会返回程序运行所需的共享对象的列表,以及该库在那里可用的地址。
    libc.so.6=>/lib/libc.so.6(0x40021000)/lib/ld.so.1=>/lib/ld.so.1(0x40000000)

    该指令地址对应于加载libc.so.6的地址。在我们的简单测试案例中,只需要两个共享对象。其他应用程序可能需要更多共享对象,这使得ldd的输出更加复杂。我们将以perl作为例子。输入:
    ldd/usr/bin/perl

    将得到:
     

    1. libnsl.so.1=> 
    2. /lib/libnsl.so.1(0x40021000)libdl.so.2=> 
    3. /lib/libdl.so.2(0x40039000)libm.so.6=> 
    4. /lib/libm.so.6(0x4003d000)libc.so.6=> 
    5. /lib/libc.so.6(0x40064000)libcrypt.so.1=> 
    6. /lib/libcrypt.so.1(0x4018f000)/lib/ld.so.1=> 
    7. /lib/ld.so.1(0x40000000)  

    所需要的一切都在那里了,但是我发现对于这个进程,下面的内容读起来更快一点:
     

    1. ldd/usr/bin/perl|awk‘{print?$4““$3}’  
    2. |sort(0x40000000)/lib/ld.so.1(0x40021000)  
    3. /lib/libnsl.so.1(0x40039000)  
    4. /lib/libdl.so.2(0x4003d000)  
    5. /lib/libm.so.6(0x40064000)  
    6. /lib/libc.so.6(0x4018f000)  
    7. /lib/libcrypt.so.1  

    现在我们来确定Linux addr2line崩溃发生在libc中的何处。假设libc.so.6的加载地址是0x40021000,从指令地址0x400ab738减去它,结果为0x8a738。这是进入libc.so.6的偏移。使用nm命令,从libc.so.6转储符号,然后尝试确定该地址位于哪个函数中。对于libc.so.6,nm将生成7,000多行输出。通过对计算得出的偏移部分执行grep(正则表达式查找程序)可以削减必须检查的数据量。输入:
    nm/lib/libc.so.6|sort|grep0008a

    将返回66行,在该输出的中间,我们会发现:
    0008a6fcTmemcpy0008a754t_wordcopy_fwd_aligned

    该偏移落在memcpy中的某个位置。在此例中,一个空指针被当作目标地址传递给了memcpy。我们在何处调用的memcpy呢?问得好。我们可以通过检查输出在日志文件中的寄存器转储来确定目标区域。寄存器14包含执行某个函数调用时的返回地址。根据图1,R14是0x8040066e,它在截去高位之后产生一个地址0x40066e。这个地址落在我们的程序范围之内,因此可以运行addr2line来确定该地址在何处。输入:
    addr2line-esimple0x40066e

    将返回:
    /home/devuser/simple.c:36

    这是我们调用memcpy之后的那一行。关于addr2line的一点补充:如果可执行文件中没有包括调试符号,您将获得??:0作为响应。

     

     

     

     

    arm-eabi-addr2line 

    Usage: arm-eabi-addr2line [option(s)] [addr(s)]

    for example:

    D:\gat\iBox\TRUNK\lib>arm-eabi-addr2line -e "D:\*.out.symbols\alps\out\target\product\*\symbols/../../../../../kernel/vmlinux" c0037aa0

     The options are:
      @<file>                Read options from <file>
      -b --target=<bfdname>  Set the binary file format
      -e --exe=<executable>  Set the input file name (default is a.out)
      -i --inlines           Unwind inlined functions
      -j --section=<name>    Read section-relative offsets instead of addresses
      -s --basenames         Strip directory names
      -f --functions         Show function names
      -C --demangle[=style]  Demangle function names
      -h --help              Display this information
      -v --version           Display the program's version.

    常用-f, -C, -e.

     

    KE debug的方法:

    首先在在dump的kernel log中找[<>]这样的东西,然后再通过addr2line在vmlinux中找到其对应的line

    有的地址,比如bf开头的是debug不了的,因为3GB-8MB ~ 3GB是kernel module载入的地址,而vmlinux中没有module的symbol table.

    NE debug的方法

    首先在ne log中找signal 11 (SIGSEGV), fault addr baae8fd1

    的东西,找到后

    通过分析,如果fault addr 是deaddead,那就表示heap error出现,然后再看是deadadd0,就是heap corruption,如果是deadadd0,就是heap usage error.

    然后将heap信息保存下载

    然后再通过将signal 11 (SIGSEGV), fault addr baae8fd1中的地址通过addr2line来进行转换得道C库出错的地址

    NE的decode是通过

             #01  pc 0001cd4a  /system/lib/libc.so

    中间后面libc.so的路径,将其加到symbols path后面,然后再通过addr2line来解析出来。

     arm-eabi-addr2line -f -C -e D:\gat\Department\SP_SS\OSS5_ST_Share\GAT\TRUNK\Test_Cases\NE\ztemt73v2_ALPS.GB.p52_eng.out.symbols\alps\out\target\product\ztemt73v2\symbols\system\lib\libc.so 0001cd0e

    输出的话就是

    __findenv
    /alps/GB/Of/alps/bionic/libc/stdlib/getenv.c:90

     

    展开全文
  • addr2line方法使用总结

    2020-04-15 19:36:01
    first demo

    addr2line方法使用总结
    addr2line:将地址信息转化成函数名或行数(常用于找报错函数的调用者)。使用方法
    拿这次报错信息为例。(函数报错,但是没有做异常判断!!!这里规范问题实在要吐槽一下)

    0、我们已经知道函数的报错信息,但是更想知道是哪个函数调用了它。
    1、首先需要得到报错函数的地址,定义一个局部变量caller,然后获取该变量的地址信息
    然后报错时将地址信息打印出来。
    2、得到报错的地址,需要在nfs路径下使用命令 arm-hisiv500-linux-addr2line 0x12345678 -e hikdsp -f.
    其中arm-hisiv500-linux- 为H3平台的编译链,addr2line为该命令,0x12345678为报错的地址信息 -e 后跟编译的成果物,-f 为显示函数名,具体可参看man addr2line
    3、为本次实现的定位的代码

    #define __read_lr(caller) __asm__ __volatile__ ("mov %0, lr\n": "=&r" (caller)) /*返回操作数caller的地址*/
    

    这里涉及到内联汇编的语法,内联汇编的用法有一个通用模板:
    asm [ volatile ] (
    assembler template
    [ : output operands ] /* optional /
    [ : input operands ] /
    optional /
    [ : list of clobbered registers ] /
    optional */
    );
    asm为gcc关键字,表示接下来要嵌入汇编代码。为避免keyword asm与程序中其它部分产生命名冲突,gcc还支持__asm__关键字,与asm的作用等价。volatile为可选关键字,表示不需要gcc对下面的汇编代码做任何优化。同样出于避免命名冲突的原因,__volatile__也是gcc支持的与volatile等效的关键字。
    由于我们是在C语言中内联汇编代码,故需用双引号""将命令括起来,以便gcc以字符串形式将这些命令传给汇编器。
    在内联汇编中,操作数通常用数字来引用,具体的编号规则为:若命令共涉及n个操作数,则第1个输出操作数(the first output operand)被编号为0,第2个output operand编号为1,依次类推,最后1个输入操作数(the last input operand)则被编号为n-1
    “=&”指的是输出地址;“r"是寄存器操作数约束(register operand constraint, r)。有了"r"的约束,表明操作数将被存储在指定的寄存器中,如本次该行代码表明将caller值存入lr(R14)寄存器,然后输出操作数caller的地址。
    报错时打印出错误信息,然后使用:addr2line方法,打印信息如下
    在这里插入图片描述
    可以看出是哪个函数报错。

    addr2line 方法2定位崩溃问题
    这里写一个简单的崩溃程序,崩溃后dmsg查看报错地址信息

    在这里插入代码片
    #include<stdio.h>
    /*addr2line 方法使用用例*/
    void fun2(int *p)
    {
       int err =0;
       err = *p;
       printf("err =%d\n",*p);  
       return ;
    }
    int fun1()
    {
        int *p =NULL;
        fun2(p)  ;
        return 0;
    }
    int main()
    {
        unsigned int u32num1 = 1,u32num2 = 2;
        unsigned int u32Result = 0;
        u32Result = u32num1 - u32num2;
        printf("result = %d\n",u32Result); //-1
        fun1();
       
        return 0;
    }
    
    

    dmesg结果如下
    在这里插入图片描述
    使用addr2line
    在这里插入图片描述
    注意编译时加上-g,否则大概率出现?? -g表示不对编译结果进行优化,保留调试信息

    • [ ]
    展开全文
  • addr2line使用命令

    2016-01-22 09:51:49
    使用方法: addr2line -e test1 400506 加上-f ,可以显示出函数名。 在Linux下写C/C++程序的程序员,时常与Core Dump相见。在内存越界访问,收到不能处理的信号,除零等错误出现时,我们精心或不精心写
  • 对于这样的问题,有两种调试方法: addr2line 和 gdb。   第一章 先讲解下gcc 编译加不加 -g 对程序的影响, 还有strip。 //1.1.cpp  #include using namespace std; bool IsUnique() {  int k = 0, m = 0;
  • addr2line的使用

    千次阅读 2019-05-05 17:45:53
    报错log: --------- beginning of crash 01-01 08:01:17.963 3466 3466 F libc : FORTIFY: write: prevented read past end of buffer 01-01 08:01:17.964 3466 3466 F libc : Fatal signal 6 (SIGABRT), ...
  • 上一篇文章我们学习了gcc编译器的相关内容。...本篇文章接着上一篇文章,学习GNU为GCC提供的辅助开发工具...本篇文章先学习使用addr2line与strip工具。 1、addr2line工具 首先我们要知道,gcc编译程序的时候,加上-g选...
  • Android中使用addr2line来分析native信息

    万次阅读 2015-02-28 14:38:07
    在Android的开发过程中有会有很多的native bug必须要用addr2line来分析,并且这个工具也非常的好用。下面我们来看看具体的使用。 烧录到手机上的版本和你电脑上的编译出的版本要一致,这个数据才是准确的,才好定位...
  • Addr2Line 源代码分析

    千次阅读 2007-04-08 10:53:00
    ,21600"o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f"stroked="f"><v:shape id="_x0000_i102
  • addr2line命令

    万次阅读 2019-03-16 11:11:46
    linux下addr2line工具事一个可以将指令的地址和可执行文件映像转换成文件名,函数名和源代码行数的工具。add2line独起来就是addr to line,即地址转换为行。 调试core dump常用:addr2line -e --exe=&lt;...
  • addr2line探秘

    万次阅读 2012-02-26 17:42:40
    addr2line探秘 在Linux下写C/C++程序的程序员,时常与Core Dump相见。在内存越界访问,收到不能处理的信号,除零等错误出现时,我们精心或不精心写就的程序就直接一命呜呼了,Core Dump是Linux仁慈地留下的程序的...
  • addr2line

    2020-06-30 19:02:26
    一、addr2lineaddr2line可以将函数地址解析为函数名,在Linux下用C/C++的程序,可以使用addr2line根据地址获取到对应的代码行。 这是一个示例程序,func函数返回参数a除以参数b的结果。这里使用0作为除数,结果...
  • addr2line 工具

    千次阅读 2016-02-03 16:18:55
    1.将ndk中的arm-linux-androideabi-addr2line可执行文件的路径加入配置文件~/.bashrc中,例如: export PATH=$PATH:~/dlna/android-ndk-r6b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin 2.使...
  • Addr2line 将函数地址解析为函数名 原文链接:http://www.ibm.com/developerworks/cn/linux/l-graphvis/  Addr2line 工具(它是标准的 GNU Binutils 中的一部分)是一个可以将指令的地址和可执行映像...
  • NDK调试arm-linux-androideabi-addr2line工具的使用作用arm-linux-androideabi-addr2line看工具名称就知道是将内存地址转换成行号,具体点就是根据so库抛出的Error日志的中内存地址,找到具体是在那个文件的哪一行...
  • addr2line 行号显示乱码

    2018-12-01 04:30:30
    #include void go() { printf("the go func addr is 0x%x\n",go); } int main() { go(); return 0; ``` ...这一段代码用addr2line指令得到打印地址的行号和函数名,但是行号是乱码
  • 如何使用arm-linux-androideabi-addr2line

    千次阅读 2014-04-21 16:59:33
    原帖地址:... 1.将ndk中的arm-linux-androideabi-addr2line可执行文件的路径加入配置文件~/.bashrc中,例如: export PATH=$PATH:~/dlna/android-ndk-r6b/toolchains/arm-lin
  • panic、oops、crash都是指linux kernel层发生了内核无法处理的异常。 应用层编程只会造成该进程的崩溃,内核层的编程如驱动代码中的异常最严重的情况会导致内核panic。...addr2line可以将出错代码地址转转换
  • 当手机发生异常,你会发现下面的一些log信息经常见到却不好从字面理解,举个栗子:[60] [60] Attempt to program a write protected block[70] [70] Failed Reading block @ 10[70] [70] Reading MMC failed[980] ...
1 2 3 4 5 ... 20
收藏数 80,999
精华内容 32,399
关键字:

addr2line