How to get the symbol name for a memory address in GDB?

后端 未结 5 1940
一整个雨季
一整个雨季 2020-12-12 19:38

For instance, I know that 0x46767f0 belongs to an NSString*, is there any way I can find out what NSString it is to help me find some bugs I\'m after?

相关标签:
5条回答
  • 2020-12-12 19:48

    po 0x46767f0

    will send a -description message to the object. That will print out the contents of your NSString but I suggest using Brian's answer to check the contents of your address before you send random messages to random addresses.

    0 讨论(0)
  • 2020-12-12 19:52

    gdb> list *0xAABBCCDD

    That tells you the filename and line number.

    0 讨论(0)
  • 2020-12-12 19:54

    I believe you're looking for:

    info symbol <addresss>
    

    Print the name of a symbol which is stored at the address addr. If no symbol is stored exactly at addr, GDB prints the nearest symbol and an offset from it.

    Example:

    (gdb) info symbol 0x400225
    _start + 5 in section .text of /tmp/a.out
    
    (gdb) info symbol 0x2aaaac2811cf
    __read_nocancel + 6 in section .text of /usr/lib64/libc.so.6
    

    You can read more about it here.

    0 讨论(0)
  • 2020-12-12 20:02

    addr2line

    This Binutils utility can handle any symbol address, including variables and function names.

    It is non-interactive by default, which is useful in some cases, when doing post-mortems.

    main.c

    #include <stdio.h>
    
    int myvar;
    
    int main(void) {
        printf("myvar = %d\n", myvar);
    }
    

    Compile and disassemble:

    gcc -O 0 -g gdb3 -o main -pedantic-errors -std=c89 -Wextra main.c
    readelf -s tmp.out  | grep -E ' (main|myvar)'
    

    Gives:

    55: 0000000000201014     4 OBJECT  GLOBAL DEFAULT   24 myvar
    65: 000000000000064a    32 FUNC    GLOBAL DEFAULT   14 main
    

    And now we can try:

    addr2line -e main 201014 64a
    

    which gives:

    /full/path/to/main.c:3
    /full/path/to/main.c:5
    

    Boost stack trace library uses it for example to show stack trace lines: print call stack in C or C++

    0 讨论(0)
  • 2020-12-12 20:08

    If it is a stack variable, there is no way that I am aware to do it. Otherwise, try p/a <pointer symbol or address> and it will print the symbol name (or offset to the nearest symbol name).

    0 讨论(0)
提交回复
热议问题