Рассмотрим следующую программу.
#include <unistd.h>
int main(){
sleep(1000);
}
Если мы запустим strace
в этой программе, последняя строка, которая появляется перед длительным сном, выглядит следующим образом.
nanosleep({1000, 0},
Покапрограмма спит, код выполняется (вероятно, заблокирован) внутри ядра ОС.
Когда я запускаю программу под gdb
, если я посылаю SIGINT
в середине сна, я могу собратьразличная информация о главном потоке, такая как backtrace
и различные значения регистров.
Есть ли в gdb некоторое выражение, которое оценивается как true
, если поток должен пересечь границу syscall
перед повторным выполнением кода в пользовательском пространстве?
В идеале было бы кросс-платформенное решение, но также полезны решения для конкретных платформ.
Разъяснение :Мне все равно, действительно ли поток выполняет ;только то, было ли его последнее значение счетчика программы в коде ядра или в коде пользователя.
Другими словами, может gdb
сообщить нам, вошел ли конкретный поток в ядро, но еще не вышел из ядра?