Генерация стека вызовов изнутри системного вызова - PullRequest
0 голосов
/ 14 января 2019

У меня есть сценарий, когда поток иногда зависает для приложения c ++ в системе yocto / poky linux на основе arm. Он останавливается где-то в системном вызове clock_nanosleep.

Я могу генерировать основные файлы, используя gcore, и прикреплять их с помощью gdb, но он показывает мне только часть пользовательского режима стека вызовов, которая заканчивается программным прерыванием.

Есть ли способ узнать, где на самом деле находится поток внутри ядра, возможно из coredump?

Редактировать: это код вызова метода. Переменная t находится в стеке.

do {
   ret = clock_nanosleep(CLOCK_MONOTONIC, 0,  &t, &t);
} while (ret == EINTR);

Привет

1 Ответ

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

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

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

...