Приложение застревает в GDB с gettimeofday() и контрольными точками на регистрах

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

сначала позвольте мне показать небольшой пример того, что я делаю.

хорошо, вот код, который я использую (очень просто):

#include <stdio.h>

main()
{
        int num;

        getchar();

        num=190320;

        printf("value: %d\n", num);
}

хорошо, что я делаю, это просто запускаю программу (которая останавливается на функции getchar(), пока я не нажму enter), а затем присоединяю программу к сеансу gdb в другой оболочке:

gdb -p <pid>

Теперь я просто добавляю условную точку наблюдения в регистр "rdi", чтобы я мог проверить состояние программы, когда назначена переменная "num":

(gdb) watch $rdi == 190320
Watchpoint 1: $rdi == 190320

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

(gdb) c
Continuing.
Watchpoint 1: $rdi == 190320

Ну, это версия, которая работает, как я и ожидал, простое приложение, которое работает нормально, и точка наблюдения, которая останавливается в нужный момент.

Хорошо, теперь перейдем к самой проблеме.

это та же самая программа, которую я использовал раньше, но с той разницей, что я использую gettimeofday() перед назначением переменной:

#include <stdio.h>
#include <sys/time.h>

main()
{
        int num;

        struct timeval tim;

        getchar();

        gettimeofday(&tim, NULL); /* <---- Here is !!!*/

        num=190320;

        printf("value: %d\n", num);

}

и теперь повторите те же шаги, которые я делал раньше:

- запустить программу в оболочке

-прикрепить программу к сеансу GDB в другой оболочке

-установить условную точку наблюдения в регистре "rdi"

но теперь, когда я продолжаю выполнение в gdb и нажимаю enter в оболочке, в которой выполняется программа, программа просто застревает в функции gettimeofday().

если я нажму "Ctrl+C" на GDB, я могу проверить, что программа застряла в этой функции

(gdb) c
Continuing.

^C
Program received signal SIGINT, Interrupt.
0x00007ffc88b85e3c in gettimeofday ()

теперь, если я отключаю точку наблюдения и пытаюсь продолжить выполнение снова, все идет хорошо, и программа завершается без проблем (очевидно, точка наблюдения отключена, и GDB не останавливает программу в тот момент, когда я этого хочу).

(gdb) info breakpoint
Num     Type           Disp Enb Address    What
1       watchpoint     keep y              $rdi == 190320
(gdb) disable 1
(gdb) c
Continuing.
[Inferior 1 (process 4151) exited with code 016]

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

Итак, вопрос в том, может ли кто-нибудь объяснить, почему это происходит? и есть ли способ решить эту проблему и программа не застревает в функции gettimeofday() и не достигает точки наблюдения?

П.Д.: Я знаю, что могу остановить программу в назначении переменной, используя другие методы, но это всего лишь эксперимент, и я просто хочу объяснить, почему это происходит

PD2: Извините за мой плохой английский, это не мой родной язык.

0 ответов

Другие вопросы по тегам