Как я могу распознать глобальную переменную в GDB из GAS-источника?
Извините за мой плохой английский.
Мой рабочий процесс:
Я пишу простую программу для 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
Скомпилируйте asm-источник с символами отладки:
gcc -g test_c.s
Отладка 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-источнике, который, к сожалению, не очень удобен для пользователя.