почему c ++ pthread вышел сам по себе без сбоя процесса? - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть процесс, который использует почти 16 потоков.Один из идентификаторов потока сам по себе завершает свою работу после некоторого времени работы (обратите внимание, что процесс не завершился сбоем).Я не уверен, как искать причины выхода из потока?Я пытался использовать оператор печати, но это не помогло.Попытка захвата через GDB не помогла.Если это что-то вроде повреждения памяти, то процесс должен завершиться сбоем, а файл ядра должен сказать все (большую часть времени), но процесс остается запущенным, просто выход из потока затрудняет мою работу.

Не могли бы вы, пожалуйстапредложить какой-нибудь способ отладки этой проблемы?

-Arpit

1 Ответ

0 голосов
/ 17 февраля 2019

Я не уверен, как искать причины выхода из потока

Есть только два пути, по которым я могу это сделать:

  1. Функция потока возвращает
  2. Что-то, что вызывает функция потока, выполняет syscall(SYS_exit, ...)

Вы можете использовать (gdb) catch syscall exit, а затем where, чтобы выяснить, где это происходит.

Если where показывает что-то похожее на это:

(gdb) where
#0  0x00007ffff7bc3556 in __exit_thread () at ../sysdeps/unix/sysv/linux/exit-thread.h:36
#1  start_thread (arg=0x7ffff781c700) at pthread_create.c:478
#2  0x00007ffff7905a8f in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:97

, тогда у вас есть случай 1, и вам нужно пройтись по функции потока, чтобы выяснить, куда она возвращается (https://rr -project.org / может очень помочь).

Если вместо этого вы увидите что-то вроде этого:

(gdb) where
#0  syscall () at ../sysdeps/unix/sysv/linux/x86_64/syscall.S:38
#1  0x0000555555554746 in do_work () at t.c:9
#2  0x0000555555554762 in fn (p=0x0) at t.c:15
#3  0x00007ffff7bc3494 in start_thread (arg=0x7ffff781c700) at pthread_create.c:333
#4  0x00007ffff7905a8f in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:97

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

...