Приложение застревает в 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: Извините за мой плохой английский, это не мой родной язык.