Я столкнулся со странной проблемой, когда программа зависает при вызове функции PAPI_start_counters.
Например, когда я использую код из здесь и после компиляции как «gcc -o papitest high_level.c -lpapi» и запуска ./papitest я получаю вывод: В этой системе 11 счетчиков а потом ничего. Если я попытаюсь убить программу с помощью Ctrl + C, ничего не произойдет, а также ничего не произойдет с kill -9. Моя система такова:
Операционная система: Debian GNU / Linux 8 (jessie) Ядро: Linux 3.16.0-5-amd64 Архитектура: x86-64 С 32 ядрами процессора Intel (R) Xeon (R) E5-4603 v2 @ 2,20 ГГц
Я помню, как раньше использовал PAPI на том же сервере с более старым ядром.
Обновлено: вот что появляется при запуске dmesg:
[ 2039.025224] INFO: task papitest:2022 blocked for more than 120 seconds.
[ 2039.025284] Tainted: G C 3.16.0-5-amd64 #1
[ 2039.025335] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
[ 2039.025421] papitest D ffff88081daf0050 0 2022 2008 0x00000000
[ 2039.025427] ffff88081fb180d0 0000000000000086 0000000000013b40 ffff88081e823fd8
[ 2039.025431] 0000000000013b40 ffff88081daf0050 ffff88103f4619f8 ffff88081e823de0
[ 2039.025435] ffff88103f4619fc ffff88081daf0050 00000000ffffffff ffff88103f461a00
[ 2039.025439] Call Trace:
[ 2039.025447] [<ffffffff815227c5>] ? schedule_preempt_disabled+0x25/0x70
[ 2039.025452] [<ffffffff81524263>] ? __mutex_lock_slowpath+0xd3/0x1d0
[ 2039.025457] [<ffffffff81133fc0>] ? remote_function+0x40/0x50
[ 2039.025461] [<ffffffff8152437b>] ? mutex_lock+0x1b/0x2a
[ 2039.025466] [<ffffffff81134800>] ? perf_event_read_value+0x30/0xd0
[ 2039.025470] [<ffffffff811348cd>] ? __perf_read_group_add+0x2d/0x190
[ 2039.025475] [<ffffffff81136e1a>] ? _perf_event_disable+0x5a/0xb0
[ 2039.025479] [<ffffffff8113500f>] ? perf_read+0xbf/0x250
[ 2039.025483] [<ffffffff811afca3>] ? vfs_read+0x93/0x170
[ 2039.025486] [<ffffffff811b08d2>] ? SyS_read+0x42/0xa0
[ 2039.025492] [<ffffffff81525c00>] ? system_call_fast_compare_end+0x10/0x15
Я не знаю, как это сделать, так как я не могу прервать выполнение программы, например, чтобы выполнить команду "where" в gdb
Просто запустите программу с gdb ./a.out
и прервите ее, нажав ctrl + c.
Я не могу сделать это. Программа не отвечает на прерывание, а также, если я убью терминал, процесс перестает работать.
Вы пробовали именно то, что я предложил? Обычно gdb
получает прерывание и сообщает вам о стеке программы.
Да, пробовал, но ничего не получается. Кстати, я добавил сообщения ядра на случай, если это поможет
Похоже на тупик в ядре. Разве Джесси не должно быть хотя бы на 3.16.56-1?
Да, должно. У меня возникла проблема с пакетом, из-за которого я задерживал обновление dist. Я исправил это, но проблема осталась с ядром 3.16.56-1. С другой стороны, обновление до Debian 9 с ядром 4.9.88-1 решает проблему.
Вы использовали отладчик? Какой стек у приложения пока зависает?