Как я могу распознать глобальную переменную в GDB из GAS-источника?

Извините за мой плохой английский.

Мой рабочий процесс:

  1. Я пишу простую программу для gnu asm (GAS) test_c.s:

        .intel_syntax noprefix
        .globl my_string
        .data
    my_string:
        .ascii "Hello, world!\0"    
        .text
        .globl main
    main:
        push rbp
        mov rbp, rsp
        sub rsp, 32
    
        lea rcx, my_string
        call printf
    
        add rsp, 32
        pop rbp
        ret
    
  2. Скомпилируйте asm-источник с символами отладки:

    gcc -g test_c.s
    
  3. Отладка a.exe в GDB:

    gdb a -q
    Reading symbols from C:\a.exe...done.
    (gdb) start
    Temporary breakpoint 1 at 0x4014e4: file test_c.s, line 14.
    Starting program: C:\a.exe
    [New Thread 3948.0x45e4]
    
    Temporary breakpoint 1, main () at test_c.s:14
    14              sub     rsp, 32
    (gdb) whatis my_string
    type = <data variable, no debug info>  <-------------------- why?
    (gdb) info variables
    All defined variables:
    ...
    Non-debugging symbols:
    0x0000000000403000  __data_start__
    0x0000000000403000  __mingw_winmain_nShowCmd
    0x0000000000403010  my_string  <-------------------- why?
    ....
    

    Почему 'my_string' является переменной 'no debug info'? Как я могу распознать, что my_string является определяемой пользователем переменной? Некоторые gcc-флаги или газовые директивы?

PS: перечисленный выше файл test_c.s сгенерирован gcc из простого приложения c test_c.c:

    #include<stdio.h>

    char my_string[] = "Hello, world!";

    int main(void)
    {
        printf(my_string);
    }

    gcc test_c.c -S -masm=intel

Я пытаюсь отладить это C-приложение и получить ожидаемый результат:

    gcc -g test_c.c
    gdb a -q
    Reading symbols from C:\a.exe...done.
    (gdb) start
    Temporary breakpoint 1 at 0x4014ed: file test_c.c, line 7.
    Starting program: C:\a.exe
    [New Thread 11616.0x1688]

    Temporary breakpoint 1, main () at test_c.c:7
    7           printf(my_string);
    (gdb) whatis my_string
    type = char [18] <-------------------- OK
    (gdb) info variables
    ...
    File test_c.c:
    char my_string[18]; <-------------------- OK
    ...

Проблема в том, что мне нужна отладочная информация, связанная с GAS-источником, а не с

PSS: MinGW-build x64 v.4.8.1

1 ответ

Решение

Причина проста: вы должны были сгенерировать файл asm из файла c с включенной отладкой, то есть gcc test_c.c -S -masm=intel -g, чтобы компилятор выдал необходимую информацию. Если вы сделаете это, вы заметите раздел с именем .debug_info в вашем asm-источнике, который, к сожалению, не очень удобен для пользователя.

Другие вопросы по тегам