2014-02-21 1 views
0

나쁜 영어로 죄송합니다.GAS 소스에서 GDB의 전역 변수를 어떻게 인식 할 수 있습니까?

내 워크 플로우

을 :

  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. GDB에서 a.exe 디버그 :

    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'은 '디버그 정보 없음'변수입니까? 어떻게 'my_string'이 사용자 정의 변수인지 인식 할 수 있습니까? 일부 gcc 플래그 또는 가스 지시문?

PS : 위에 나열된 파일 test_c.s는 간단한 C 응용 test_c.c에서 GCC에 의해 생성됩니다

#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 
    ... 

문제는 내가, 가스 소스에 관한 디버그 정보를하지 C

PSS를 필요로한다는 것입니다 :는 MinGW -builds x64 v.4.8.1

답변

0

이유는 간단합니다. 컴파일러가 필요한 정보를 방출하게하려면 디버깅이 활성화 된 상태로 c 파일에서 asm 파일을 생성해야합니다 (즉, gcc test_c.c -S -masm=intel -g). 그렇게하면 asm 소스에 .debug_info이라는 섹션이 표시됩니다.이 섹션은 사용자에게 친숙하지 않습니다.

+0

해결 방법이 있습니까? GDB를위한'my_string'의 타입에 관한 최소한의 디버그 정보를 추가 할 수 있습니까? – Dem0n13

+0

물론 컴파일러와 동일한 종류의 디버그 정보를 추가 할 수는 있지만 지루하고 형식을 알아야합니다 (이 경우에는 'dwarf2'입니다). – Jester

관련 문제