2016-03-30 17 views
0

Hata ayıklamaya ihtiyacım olan uzak ARM Linux kutusunu kullanıyorum.Uzaktan gdb her olayda durur

sunucu başlatıldığında:

gdbserver :12345 ./my_app 

istemci: Sonra

./arm-am3354-linux-gnueabihf-gdb ~/ 
(gdb) target remote dev_r:12345 
(gdb) continue 

Ben Ctrl + C ile uygulamayı durdurmak için çalışıyorum, ancak gdb ile durur:

[Inferior 1 (işlem 2766) koddan çıkıldı 01]

Ve sunucuda:

Çocuk durumuyla çıkıldı 1 gdbserver çıkarken

Öyküsü: çalışma zamanında gdb içinde kesme noktaları kurulumu sırasında QtCreator uzaktan hata ayıklamayı kullanmaya çalışıyor, fakat aynı şekilde çöküyordu. Ayrıca kesme noktaları ve duraklama QtCreator'da çalışmıyor. Ayrıca gdb-multiarch ve android-sdk'den bir tane daha gdb çalışıyordum.

Güncelleme: Hata ayıklama küçük program aka Merhaba Dünya çalışır. Yerel Hata Ayıklama (x86 üzerinde) de çalışır. App yüz binlerce satır kod, paylaşılan ve statik kütüphaneleri vardır.

Kısmi çözüm: Muhtemelen sahip olduğum gömülü platform için muhtemelen sysroot geçersizdi. kopyalama/lib/ve/usr/hedef cihaz ve onu ayarlamasını

set sysroot /home/karel/sysroot 

gibi ben breakpointler açabiliyorum ve sonra uygulaması bunların durur. Ancak duraklatma hala uzak uygulamayı durdurmaktadır. QtCreator için aynı: Tools-> Options-> Debugger-> GDB-> Ek Attach Komutları

+0

Hangi cihaza ihtiyacınız var? http://www.ironlab.io, buluttaki gerçek cihazlarda hata ayıklamaya izin verir. Onlar şimdi ücretsiz beta. – Schultz9999

cevap

0

Uygulamamın EGLFS platformunda çalıştırılmasında hata ayıklamasıyla benzer (hatta tamamen aynı) bir sorun yaşadım. Qt 5.4 ile oluşturulduğunda hata ayıklama mükemmel çalışıyordu, Qt 5.5 ile hata ayıklama açıkladığınız gibi davranıyordu.

Arama yapıldıktan sonra, SIGINT alırken Qt 5.5'teki uygulamamın çıktığını, Qt 5.4'te ise hata ayıklayıcının uygulamayı beklendiği gibi duraklatabileceğini buldum. GDB, uygulamayı duraklatmaya çalışırken veya bir kesme noktasını ayarlamayı/kaldırmayı denediğinde SIGINT'i gönderdiği için, bu, sorunların başladığı yerdi.

Biraz daha araştırma yaptıktan sonra, Qt 5.5: Fix up signal handling in QFbVtHandler'a aşağıdaki taahhüdü buldum. Sonunda, SIGINT veya SIGTERM alırken,işleyicisinin nihayetinde _exit(1)'a girdiğimizi görüyorsunuz. Bir kesme noktası ayarlandığında, GDB ile bir kesme noktasını duraklatmaya veya ayarlamaya çalışırken bunun tam olarak ne olduğunu doğruladı.

Benim için çalışan çözüm: qfbvthandler.cpp dosyasına bir yama oluşturdum, #define VTH_ENABLED satırını kaldırarak.

GDB hata ayıklama artık bir çekicilik gibi çalışıyor.

Not: qfbvthandler olsa bile.cpp Qt5.6 ve yukarı güncellendi, davranış hala aynı olacağını sanıyorum. Ancak bunu test etmek için bir çalışma alanım yok.