GDB пропускает инструкции - PullRequest
0 голосов
/ 15 января 2019

У меня ограниченный опыт работы с GDB и отладки общих объектов в целом, поэтому мне интересно, сможет ли кто-нибудь пролить свет на поведение, которое я наблюдаю.

В основном я пытаюсь понять внутренности плохо документированной библиотеки. С этой целью я написал программу, которая использует библиотеку минимально, и я пытаюсь пройтись по ней, чтобы увидеть, что происходит.

Проблема в том, что после нескольких использований команды "step" в gdb программа выполняет более одной инструкции. Одна из причин, по которой я считаю, это то, что в конечном итоге GDB указывает, что три потока были запущены, но нигде в коде я не вижу, почему это могло произойти.

В прошлом я пытался перестроить библиотеку с помощью символов отладки, но, похоже, это не дает мне дальнейших результатов. Я даже не уверен, относится ли это к делу, так как я думал, что gbd все еще может выполнять инструкции без символов отладки (даже если их нет, значит, это даст мне меньше информации).

В случае, если это уместно: я отлаживаю написанную мной трехстрочную программу, которая динамически связывается с интересующей библиотекой. У меня есть источник для библиотеки, но он сложный, поэтому я надеялся, что GDB пролил некоторый свет на вещи.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Немного об оптимизации

Например, это код C:

int main(int argc, char** argv) {
  printf("Hello World\n");
  return 0;
}

Когда вы строите с -O0, оптимизация кода выполняется очень медленно, и код выполняется очень медленно. Это неоптимизированный код (gcc -m32):

; Variables:
        ;    arg_4: 12
        ;    arg_0: 8
        ;    var_4: -4
        ;    var_8: -8
        ;    var_C: -12
        ;    var_10: -16
        ;    var_18: -24
push       ebp
mov        ebp, esp
sub        esp, 0x18
call       _main+11
pop        eax                            ; CODE XREF=_main+6

-- These lines are gone after optimization --
mov        ecx, dword [ebp+arg_4]
mov        edx, dword [ebp+arg_0]
--                                    --
lea        eax, dword [eax-0x1f5b+0x1fa6] ; "Hello World!\\n"

-- There lines are gone after optimization --
mov        dword [ebp+var_4], 0x0
mov        dword [ebp+var_8], edx
mov        dword [ebp+var_C], ecx

mov        dword [esp+0x18+var_18], eax  ; method imp___symbol_stub__printf
call       imp___symbol_stub__printf
xor        ecx, ecx                           
mov        dword [ebp+var_10], eax
mov        eax, ecx                                    
add        esp, 0x18                           
pop        ebp
ret

Когда вы строите с -03, вы заметите, что строк меньше. Оптимизированный код (gcc -m32 -O3):

push       ebp
mov        ebp, esp
sub        esp, 0x8
call       _main+11
pop        eax                             ; CODE XREF=_main+6
lea        eax, dword [eax-0x1f6b+0x1f9e]  ; "Hello World!"
mov        dword [esp+0x8+var_8], eax      ; "%s" for imp___symbol_stub__puts
call       imp___symbol_stub__puts
xor        eax, eax
add        esp, 0x8
pop        eep
ret

Причина, по которой неоптимизированный код имеет ненужные строки, заключается в том, что Главный принимает два аргумента и сохраняет их в регистры, если вы используя или не без оптимизации, но с оптимизацией компилятором удаляет эти инструкции mov, потому что аргументы не используются ни нужно. Аналогично, значения регистров также сохраняются в переменные стека в качестве аргументов копируются в переменные стека.

0 голосов
/ 16 января 2019

Я думал, что gbd все еще может выполнять инструкции

Возможно, но команда для этого - stepi, а не step, которую вы используете.

Шаг перешагивает строк , что требует наличия отладочной информации в источниках.

...