GDB: как получить адрес объявления функции, зная номер строки?

Я открываю GDB и хотел бы знать, можно ли получить адрес памяти объявления функции, например:

int func()
{
    return 1;
}

int main()
{
    func();
    return 0;
}

Как узнать, по какому адресу объявлена функция func()?

2 ответа

  1. Объявления (и система типов) имеют значение только для компилятора, они не имеют представления в исполняемом файле и, следовательно, не имеют адресов памяти (кроме отладочных символов).

    static— определения связей, с другой стороны, выложены в памяти компоновщиком и имеют адреса. Если вы хотите получить адрес памяти символа, вам просто нужно использовать &operator1 на нем:

    (gdb) print &func
    

    Я не уверен, почему именно вам это нужно. В случае, если вы имели funcв виду кадр стека, вы можете использовать info frameпосле выбора или шага к кадру.


    [1]: &функции for можно опустить.

  2. Вы также можете использоватьinfo line <line number>, чтобы получить адрес по номеру строки, как показано ниже:

    (gdb) list
    1   #include <stdio.h>
    2   
    3   int func()
    4   {
    5       return 1;
    6   }
    7   
    8   int main()
    9   {
    10      func();
    (gdb) info line 3
    Line 3 of "test.c" is at address 0x4004ed <func> but contains no code.
    (gdb) p &func
    
    	

    You can also use info line <line number> to get the address at line number as below:

    (gdb) list
    1   #include <stdio.h>
    2   
    3   int func()
    4   {
    5       return 1;
    6   }
    7   
    8   int main()
    9   {
    10      func();
    (gdb) info line 3
    Line 3 of "test.c" is at address 0x4004ed <func> but contains no code.
    (gdb) p &func
    $1 = (int (*)()) 0x4004ed <func>
    (gdb) 
    

    Declarations (and the type system) only matter to the compiler, they have no representation in the executable and thus no memory addresses (apart from debugging symbols).

    static-linkage defintions, on the other hand, are laid out in memory by the linker and do have addresses. If you want to get the memory address of a symbol, you just need to use the & operator¹ on it:

    (gdb) print &func
    

    I am not sure, why exactly you need that though. In case you meant func's stack frame, you can use info frame after selecting or stepping to the frame.


    [1]: You can omit the & for functions.

    = (int (*)()) 0x4004ed <func>
    (gdb)