gdb

2013-04-23 21 views
6

kullanarak çalışan bir arka planda hata ayıklama Bir daemon olarak çalışan bir yüksek trafik ağı C sunucusu uygulaması geliştiriyorum. Bazı durumlarda, uygulama çöküyor (her zaman çekirdeksiz). SIGSEGV'yi yaratan yeri bulmak için gdb ile çalışan daemon'u nasıl debug edebilirim?gdb

Açıklayıcı notlar:

  1. Ben işlemine eklemek sonra komutunu

  2. takmak kullanarak çalışan sürecine gdb kullanarak takmak için nasıl biliyorum, o durur. Çalıştırırsam "devam et", program çökmezse gdb engellenir. CTRL-C'ye basarsam, işlem çıkıyor ve gdb'yi kolayca çıkaramıyorum.

Yani soru şu: Bir sıkışmış olan gdb olmadan işleme devam etmek için bir yol ancak süreç düşmezse eğer ayırmak mümkün var mı?

+0

değiştirmek denediniz örneğin kokteyli ayarları 'ulimit' komutu? Ve/veya bir hata ayıklama sürümünü mi çalıştırıyorsunuz? Ya da muhtemelen çökme için olası yerleri daraltmak için daha fazla günlüğe kayıt eklemek? –

+0

Tüm olasılıkları denedim. İşlem, bir Ubuntu sunucusunda bir yükseltme hizmeti olarak çalışır ve hizmet başlangıcında belirli bir kullanıcıya ayarlanır. limits.conf, bu kullanıcı için hem dosya hem de çekirdek için sınırsız değer içerir. /etc/sysctl.conf dosyasında fs.suid_dumpable ve kernel.core_uses_pid ayarını yaptım Daha fazla günlük kaydı ekledim ancak yüksek trafikli bir sunucu ve çok fazla çıkış üretiyor. –

cevap

3

Bu sayfa detach komutunun gdb içinde çalışacağını belirtir.

Bir uygulamada bölümleme hatası yakalamak istiyorsanız, uygulamayı hata ayıklayıcısından çalıştırmanız gerekir. Daha sonra sinyal yakalandığında, uygulamanın yığın izlemesini görmek için where veya bt'u kullanabilirsiniz. Tabii ki, arızalı olduktan sonra uygulamaya devam edemezsiniz, nasıl kurtarmalı? Arızayı yakında tetiklemeyi düşünüyorsanız, işlem sürecine ekleyebilir ve hata ayıklayıcısındaki hatayı tekrar bekleyebilirsiniz.

Hata meydana geldikten sonra yığın izlemeyi istiyorsanız, eklenecek işlem olmayacağı için çekirdek dosyaya gerçekten ihtiyacınız vardır. Şimdi, eğer sisteminiz sistemin bir parçası olarak başlatılmışsa, konfigürasyonu döküm çekirdeğine almanız zor olabilir, ancak diğer uygulamaların çekirdek döküntülerini her yerde terk etmesini istemeyebilirsiniz. Öyleyse sistem arka planını durdurmayı ve kullanıcı alanınızda tekrar başlatmayı önerirdim, sonra çekirdeğin dökülmesine izin verebilirsiniz. Sistemin bir parçası olarak başlaması gerçekten çok önemliyse, o zaman daemonun başlatılmasının tek bir alt-kabuk ile sınırlı olup olmadığına bakın ve çekirdek için uygun bir maksimum boyut ayarlamak için bu alt kabukta ulimit -c kullanın. dökümü.

+0

Biliyorum, ancak "devam" komutunu çalıştırdıktan sonra, gdb'den çıkmanın tek yolu, çalışan işlemi durduran CTRL-C'ye basmaktır. –

+0

'Continue' yerine' detach' kullanın ve 'quit' komutunu kullanın. Benim için çalışıyor. –

+0

Anladım, ancak işlem çökerse backtrace elde edebilmek istiyorum. –

6

deneyin zaman uyumsuz modu ve "& devam":

kaydet

Sonra
set target-async on 
set pagination off 
set non-stop on 

çalıştırmak olmayan stop.gdb aşağıda:

$ gdb -x non-top.gdb 
(gdb) !pgrep YOUR-DAEMON 
1234 
(gdb) attach 1234 
(gdb) continue -a & 
(gdb) 
+0

Teşekkür ederiz. Bunu deneyeceğim ve geri bildirim göndereceğim. –