GDB пропускает точку останова разделяемой библиотеки - PullRequest
0 голосов
/ 10 июля 2019

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

Я пытаюсь использовать GDB с простой программой на C, чтобы узнать оGDB.Я установил 3 точки останова, 1 в строке 7, одну в функции strcpy и одну в строке 8. Я пытаюсь установить точку останова в моей программе, включающую общую библиотеку (в частности, «break strcpy»), но каждый раз, когда я запускаю программуи нажмите «c», программа полностью пропускает точку останова 2

#include <stdio.h>
#include <string.h>

int main() {
    char str_a[20];

    strcpy(str_a, "Hello, world!\n");
    printf(str_a);
}

Всякий раз, когда я запускаю программу в отладчике, она обычно останавливается на точке останова 1, что ожидается, но затем всякий раз, когда я нажимаю «c», чтобыпродолжайте до точки останова 2, она полностью пропускает точку останова 2 и просто показывает, что выходная точка останова 3 должна быть.Это как-то связано с обработкой общих библиотек GDB?

РЕДАКТИРОВАТЬ: Вот разборка

    0x0000555555555145 <+0>:    push   rbp
    0x0000555555555146 <+1>:    mov    rbp,rsp
    0x0000555555555149 <+4>:    sub    rsp,0x20
    0x000055555555514d <+8>:    lea    rax,[rbp-0x20]
    0x0000555555555151 <+12>:   lea    rsi,[rip+0xeac]        # 0x555555556004
    0x0000555555555158 <+19>:   mov    rdi,rax
    0x000055555555515b <+22>:   call   0x555555555030 <strcpy@plt>
    0x0000555555555160 <+27>:   lea    rax,[rbp-0x20]
    0x0000555555555164 <+31>:   mov    rdi,rax
    0x0000555555555167 <+34>:   mov    eax,0x0
    0x000055555555516c <+39>:   call   0x555555555040 <printf@plt>
    0x0000555555555171 <+44>:   mov    eax,0x0
    0x0000555555555176 <+49>:   leave  
    0x0000555555555177 <+50>:   ret   

1 Ответ

1 голос
/ 10 июля 2019

Вы не указали свою платформу. Я подозреваю, что это Linux с GLIBC.

Причина, по которой GDB ведет себя так, заключается в том, что strcpy - это не нормальная функция, а GNU IFUNC.

Попробуйте установить точку останова на __strcpy_sse2_unaligned и посмотрите этот ответ.

Обновление:

отладчик выдает эту ошибку всякий раз, когда достигает точки останова 2, "../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S: No such file or directory.

  1. Это не ошибка.
  2. Тот факт, что он достигает этой точки останова, подтверждает, что этот ответ правильный.
  3. Вы можете просто рассматривать __strcpy_sse2_unaligned как псевдоним strcpy. Установка точки останова (в вашей системе) эквивалентна установке ее на strcpy.
...