2009-12-01 25 views
5

Küçük bir Linux tabanlı SBC (~ 32MB RAM) üzerinde çalışan bir uygulama geliştiriyorum. Ne yazık ki, uygulamam artık GDB kapsamında çalışmak için çok büyük oldu. Gömülü Linux'ta kullanabileceğim iyi, hafif hata ayıklama yöntemlerini bilen var mı? Bir iş parçacığının yığın izlemesini görüntüleyebilmek bile son derece yararlı olacaktır.Gömülü Linux üzerinde hafif hata ayıklama Linux

Bu uygulamanın C++ dilinde yazıldığından ve birden fazla iş parçacığı çalıştırdığından bahsetmem gerekir, bu nedenle gdbserver çok iş parçacıklı uygulamalarla çalışmadığı için bir harekete geçmez. peşin

sayesinde

Maha

+1

size gdbserver parçacıklı uygulamalar için çalışmaz emin misin? Bu sayfa çalışmasını önerir: http://www.kegel.com/linux/gdbserver.html. –

cevap

4

gdbserver kesinlikle> 25 konuda birlikte şu anda gömülü proje üzerinde çalışıyorum, çok kanallı uygulamalar ile çalışır ve biz her zaman gdbserver kullanmak .

info threads 

listeler

thread <thread number from info threads> 

anahtarları yürütme bu konuya sistemdeki bütün konuları.

thread apply XXX <command> 

XXX tarafından belirlenen ve 'hepsi' de olabilen iş parçacığı üzerinde çalışır. Eğer bunlar tek dişli süreçte olduğu gibi tüm tipik komutlar işe belirli bir iş parçacığı yürütme akışında girdikten sonra Böylece tüm çalışan iş parçacığı geri iz istiyorsanız

thread apply all bt 

yok.

+0

Özel argümanlarla gdb/gdbserver'ı çalıştırmanız mı gerekiyor? Bir ARM işlemci üzerinde koşuyorum. 'Gdbserver localhost: 12345 myapp' çalıştırdığımda ve ana bilgisayarımda gdb'nin aynı sürümünü çalıştırdığımda ve 'hedef uzak 10.0.150.92:12345' komutunu girdiğimde, hata ayıklayıcının yalnızca bir iş parçacığının çalıştığını düşündüğü için kafası karışıyor (her içerik anahtarı ve 'bilgi konuları' raporları sadece 1 çalışan iş parçacığı). – Maha

+0

Hatalı olduğumda özel argümanlarla çalışmam gerekmiyor, projemiz de bir ARM'de. Hata ayıklama işlemi benimkiyle aynı geliyor. Hedefte : gdbserver localhost: konak üzerinde 10000 myapp : konak gdb komut satırında arm_v5t-le-gdb myapp : Eğer kol sağ kurmak anlamına gdb aynı Versiyon ile : Uzaktan hedef? Uygulamanızın SIGUSR1/2 veya bağlam anahtarları sırasında bir şey gibi sinyaller almasının bir nedeni var mı? Bu hata ayıklayıcının durmasına neden olur. Hem hedef hem de ana bilgisayardaki uygulama hata ayıklama simgeleriyle oluşturulmalıdır, biz bunun için NFS sunucuyu monte ederiz. – asm

+0

Ana makinem bir x86 sistemidir ve hedef sistem bir ARM işlemcisini çalıştırır. Ev sahibi de bir ARM sistemi mi? Aksi takdirde, belki GDB yapısında bir şey özledim (ARM için GDB 7.0 oluşturdum, daha sonra x86 için ayrı olarak oluşturdum). Uygulamam kesinlikle SIGUSR1/2 oluşturmuyor - hata ayıklayıcısının yalnızca bir iş parçacığının çalıştığını düşündüğünden, içerik anahtarlarının kırıldığını doğruladım. – Maha

2

bu konuda (valgrind gibi veya şeyler) QEMU gibi bir emülatör uygulamayı çalıştıran ve daha sonra GDB koşma gibi kesmek yapıyor insanlar duydum. Kulağa ağrılı geliyor, ancak çalışıyorsa ...

Libunwind (yığın izlerini almak için) ve printf tarzı günlük kaydı ile herhangi bir yere varır mısınız? Bir seri port yoksa

+0

İşaretçiler için teşekkürler.Bir emülatörün altında koşmaya baktım ama bu kesinlikle gitmek için acı verici bir yol ve muhtemelen harcayabileceğimden daha fazla zaman harcıyor. Şu anda printf tarzı günlük kaydı yapıyorum, ancak bu oldukça karmaşık bir uygulamadır ve bazen hangi bileşenin sorun yarattığını tam olarak anlamak zor olabilir. Libunwind kesinlikle yardımcı bir araç gibi görünüyor, ona bir şans vereceğim. – Maha

1

Seri port baskı uygulamanıza ~~

içine kolayca Sunucu PC görülen ı ~~~ düşünebildiğim en hafif ve basit ve hafif kodudur Bir kez bir GPIO portu kullandık ve onu kullanarak bir seri portu simüle ettik. Bu çok iyi çalıştı, ama biraz yavaş :-(~~~

0

Kendi hata ayıklayıcınızı oluşturmanın bir nedeni var mı? Bir ARM işlemcisi (AT91SAM926x) kullanarak bir Linux sistemi geliştiriyorum ve CodeSourcery'den hem derleyici hem de hata ayıklayıcı kullanıyoruz. Ben henüz GDB 7 ile bir sürüm yayınladıklarını sanmıyorum ama gdbserver aracı kullanarak herhangi bir sorun olmadan çok iş parçacıklı C++ uygulamalarında hata ayıklama yapıyorum.

+0

SBC imalatçımız tarafından tedarik edilen bir takım zincirini kullanıyoruz. Ne yazık ki önceden oluşturulmuş bir GDB sağlamazlar, bu yüzden kendi başımayım. – Maha

+2

Deneyebileceğiniz bir şey, eski bir GDB sürümünü oluşturmaktır. GDB 7 çok yeni ve büyük hataların bazı raporlarını okudum (ARM ile ilgili olsa da). 6.7 sürümünü çalıştırıyoruz. –

0

Gdbserver gerçekten çok iş parçacıklı uygulamalarla çalışır. Ancak, ev sahibi için hedef gdb'nizle çalışmasını sağlamak için bir çapraz hedef hata ayıklayıcısını derlemeniz gerekir.

bunu nasıl ayrıntılı bir açıklama için bu makaleye bakın:

Remote cross-target debugging with GDB and GDBserver

+0

Bağlantı için teşekkürler. Orada talimatları takip ettim ama benim için çalışmadılar. Yöntemiyle birlikte kol yerel çiftlerini oluşturmaya çalışarak başarısız oldu - C derleyicisinin yürütülebilir dosyaları oluşturamadığından şikayet ederek kalıplar oluştur. GDB'nin oluşturma süreci genellikle çapraz derleme yaparken oluşturduğu yürütülebilir dosyaları sınamayacak kadar akıllı olduğundan, bunu neden yaptığını bilmiyorum. – Maha