2015-05-11 4 views
0

У меня есть простая программа x86 АссамблеиGDB точки останова поведения между с и без *

.data 

    HelloWorld: 
    .ascii "Hello World!" 

    ByteLocation: 
    .byte 10 

    Int32: 
    .int 2 
    Int16: 
    .short 3 
    Float: 
    .float 10.23 

    IntegerArray: 
    .int 10,20,30,40,50 


.bss 
    .comm LargeBuffer, 10000 

.text 

    .globl _start 

    _start: 
    nop 
    # Exit syscall to exit the program 

    movl $1, %eax 
    movl $0, %ebx 
    int $0x80 

Я скомпилировал и запустить его в БГД. Тогда я попытался установить точку останова для

movl $1, %eax 

Я использую:

(gdb)break *_start + 1 
Breakpoint 1 at 0x4000b1: file VariableDemo.s, line 33. 

Это прекрасно работает. Но если я пробовал:

(gdb) break _start + 1 
Function "_start + 1" not defined. 
Make breakpoint pending on future shared library load? (y or [n]) n 

В чем разница между и без * в этом случае? Также почему вторая команда прерывания gdb спрашивает меня об общей библиотеке?

ответ

0

break * _start + 1 ставит точку останова по адресу _main + 1. Это допустимое местоположение.

Синтаксис _function + something для местоположения в Gdb AFAIK отсутствует. Очевидно, что в качестве имени функции требуется целое «_main + 1» (не уверенный, что позволяет язык). Таким образом, он ищет эту функцию «_main + 1» и, поскольку она не может найти ее в этот момент, она спрашивает вас, следует ли повторить попытку, когда/если какая-то общая библиотека загружается позже.

Допустимые способы указания местоположения объясняются in gdb manual.