Я не уверен, как искать причины выхода из потока
Есть только два пути, по которым я могу это сделать:
- Функция потока возвращает
- Что-то, что вызывает функция потока, выполняет
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
.