2010-04-16 25 views
16

Ben SIGSEG Geri izleme üretmek ve bir çekirdek dökümü oluşturmak üzere abort() aramaya işlemek. Post-mortem gdb oturumunda hangi iş parçacığının SEGFAULT'ye yol açtığı bulunur? Benim uygulamada

Şimdi çekirdeğin bir GDB ölüm sonrası analizi çalıştırmak

, segfault neden ipliği artık görülebilir. Yapabileceğim bir şey var mı bu yüzden SEGFAULT'ın nedenini görüyorum?

Saygılarımızla, Martin

+1

İşleyicide başka işler de var mı? Neden sadece işletim sistemi sizin için bir çekirdek bırakmak için varsayılan davranışını kullanmasına izin vermiyor? –

+0

Sadece stderr'e bir backlog oluşturup abort() çağrısı. –

+0

Lütfen işletim sisteminizi ve GDB'de tam olarak ne gözlemlediğinizi belirtin. Linux (ve diğer her UNIX Aklıma) SIGSEGV işleyicisi ilk etapta SIGSEGV neden parçacığı çalışır On . Bu işleyici abort() işlevini çağırırsa, çekirdek dökümü bu iş parçacığı # 1 olarak içerecektir ve tam olarak hangi yönergenin ve hangi çağrı yığınının soruna neden olduğunu bulmakta sorun olmayacaktır. Zorluk çekiyorsanız, bazı "garip" işletim sistemlerinde ya da gerçekte neyi gözlemlediğinizi doğru olarak tanımlamıyorsunuz. –

cevap

14

Tüm parçacığı geriye dönük izleme almak için komut thread apply all bt veya thread apply all bt full kullanabilirsiniz. Faydalı olabilir. Eğer işletim sistemi çekirdek dosyası oluşturur size işleyici arada

kurtulmak olur?

+0

Şu anda stderr'e bir backtrace yazmak için işleyiciyi kullanıyorum, bu yüzden çekirdek dosyadan hiçbir şey alamadığım için bir şeyim var. Varsayılan işleyicinin "daha iyi" çekirdek dökümleri üretip üretmeyeceğini denemeliyim. –

+4

'ulimit -c sınırsız 've herhangi bir işleyici olmadan hangi çekirdeği alacağınızı görün. –

+0

@skwllsp, hangi iş parçacığının SIGSEGV'ye neden olduğunu tam olarak bilmenin bir yolu var mı? Bunu bilmek aslında mümkün değil ve geri izlerini bulmak için kullanılması gerektiği anlamına mı geliyor? – russoue