2010-04-16 10 views
16

Dans mon application, je gère SIGSEG pour produire un backtrace et appelez abort() pour générer une image de base.Comment trouver quel thread a causé SEGFAULT dans une session gdb post-mortem?

Si j'exécute maintenant une analyse gdb-post-mortem du cœur, le thread qui a provoqué le SEGFAULT n'est plus visible. Y a-t-il quelque chose que je puisse faire alors je vois la cause du SEGFAULT?

Meilleures salutations, Martin

+1

Effectuez-vous également d'autres tâches dans le gestionnaire? Pourquoi ne pas simplement laisser le système d'exploitation utiliser son comportement par défaut pour laisser un noyau pour vous? –

+0

Juste en créant un backlog à stderr, puis en appelant abort(). –

+0

Veuillez spécifier votre système d'exploitation et ce que vous observez exactement dans GDB. Sur Linux (et tous les autres UNIX auxquels je peux penser) le gestionnaire SIGSEGV s'exécutera dans le thread qui a causé SIGSEGV en premier lieu. Si ce dernier appelle abort(), le core dump contiendra ce thread en tant que thread # 1, et il n'y aura aucun problème pour trouver exactement quelle instruction et quelle pile d'appel a causé le problème. Puisque vous rencontrez des difficultés, vous êtes sur un système d'exploitation «étrange» ou vous ne décrivez pas correctement ce que vous observez. –

Répondre

14

Vous pouvez utiliser la commande thread apply all bt ou thread apply all bt full pour obtenir backtraces de toutes les discussions. Cela pourrait être utile. Par ailleurs, si vous vous débarrassez de votre gestionnaire, votre système d'exploitation créera-t-il un fichier core?

+0

Actuellement j'utilise le gestionnaire pour écrire un backtrace à stderr, donc j'ai quelque chose, car je ne pouvais rien extraire du fichier core. Je dois essayer si le gestionnaire par défaut produira de meilleurs dumps de noyau. –

+4

'ulimit -c unlimited' et voyez ce que vous obtiendrez sans aucun gestionnaire. –

+0

@skwllsp, existe-t-il un moyen de savoir exactement quel thread a provoqué le SIGSEGV? Voulez-vous dire que ce n'est pas possible de savoir et que les traces arrières doivent être utilisées pour le trouver? – russoue