Normalmente, uma falha no kernel do Linux seria visível no console do sistema. No entanto, apenas no caso de ser realmente uma falha do kernel, mas no seu caso, não é visível por qualquer motivo que você queira confirmar se é realmente uma falha do kernel. Para isso, você poderia configurar seu sistema para reinicialização automática após uma pane do kernel assim: Configure a reinicialização no pânico do kernel do Linux . Se o sistema acabar reinicializando, então é realmente uma pane no kernel e então você pode se concentrar no caminho de investigação (muitas respostas relacionadas em sites de troca de pilha).
Mas a partir da sua descrição eu acho que é mais provável que seja uma condição pendente do kernel ou "muito ocupada", você poderia começar aqui: Como investigar a causa do travamento total? .
Finalmente, como você observou que a causa-raiz parece ser mais provável de ser seu aplicativo, eu suponho que, de alguma forma, isso está sobrecarregando o sistema, fazendo com que ele pare de responder. Você poderia revisar seu código para qualquer loop longo / infinito e tentar limitar seu impacto: quebrar após um certo tempo de execução (talvez use algumas exceções de tempo limite) ou após um certo número de iterações, etc. Se o sistema tornar-se responsivo novamente após um enquanto então você teria uma idéia melhor de qual área do seu código é a culpa e talvez como isso afeta o sistema.