SORU
4 Temmuz 2009, CUMARTESİ


Nasıl SIGSEGV (segment hatası) binebilirim ve bir Android JNI altında yığın izleme al?

Ben gidiyorum a project yeni Android Native Development Kit (yani JNI) istiyorum yakalamak SIGSEGV gerektiğini ortaya (belki de ÇAĞRISI, SİGABRT, SIGFPE) sipariş edecek olan varsa iyi kazasında raporlama iletişim yerine (veya daha önce) ne olur şu anda: acil unceremonious ölüm süreci ve muhtemelen bazı girişimi tarafından OS yeniden başlatın. (Düzenleme:JVM/Dalvik VM sinyali yakalar ve bir yığın izleme ve diğer yararlı bilgileri de dahil; sadece kullanıcı bana bu Bilgi gerçekten e-posta seçeneği sunmak istiyorum.)

Durum: büyük beden C kodu yazmak istemedim en çalışmalarında bu uygulama (tüm oyun mantığı) ve rağmen iyi test edilmiş çok sayıda diğer platformlar, bu tamamen mümkün olduğunu Ben, benim Android port, yem, çöp ve neden kazasında yerel kod, demek istediğim kilitlenme dökümleri (hem yerli hem de Java) şu anda da ortaya Android günlük (sanırım olur stderr olmayan Android durum). (Hem de gidiş ve JNI çıkan) geri sayı 40 ve açıkçası, bonus puan için küçük farklar olmasına rağmen C ve Java kodu, değiştirmek için ücretsiz keyfi.

Sinyal J2SE, libjsig kütüphane zincirleme duydum.eğer güvenli bir şekilde Android, sorum alıcı kısmını çözecek, ama Android için böyle bir kütüphane görüyorum böyle bir sinyal işleyicisi yüklemek istiyorum, ve/Dalvik.

CEVAP
24 Kasım 2009, Salı


Düzenleme:Jelly BeanREAD_LOGS went awayçünkü yığın izleme edemiyorsun itibaren. :-(

Aslında var bir sinyal işleyicisi çalışma olmadan bir şeyler yapmanın çok egzotik ve serbest kodunu kullanarak, hangi görebilirsiniz on github (edit: bağlama tarihi bırakın; kaldırıldı kaza işleyicisi o zamandan beri). İşte nasıl:

  1. sigaction() sinyalleri yakalamak ve eski işleyicileri depolamak için kullanın. (android.c:570)
  2. Zaman geçer, bir segfault olur.
  3. Sinyal işleyicisi, bir JNI son kez arayıp sonra eski işleyicisi arayın. (android.c:528)
  4. Bu JNI Ara, herhangi bir yararlı bilgi hata ayıklama günlüğü ve kendi sürecinde olması gerek işaretli bir etkinlik startActivity() Ara. (SGTPuzzles.java:962, AndroidManifest.xml:28)
  5. Java geri gelip eski işleyicisi çağırmak, Android çerçeve debuggerd Senin için güzel bir yerel izleme günlük bağlanır, ve sonra işlemi ölecek. (debugger.c, debuggerd.c)
  6. Bu arada, kaza-işleme etkinliği başlıyor. Gerçekten adım 5 tamamlanmasını bekleyin böylece PID geçirmek gerekir; bunu yapmak istemiyorum. Burada kullanıcı için özür dilerim ve eğer bir günlük göndermek istediğini söyle. Eğer öyleyse, logcat -d -v threadtime çıkış toplamak ve alıcı, konu ve gövde ACTION_SEND fırlatma doldurdu. Kullanıcı Gönder tuşuna basın olacaktır. (, *, strings.xml:41*19 18* *
  7. logcat ya da bir kaç saniyeden fazla alarak başarısız dikkat edin. Tek bir cihaz ile karşılaşmadım, T-Mobile Pulse / Huawei hemen logcat T (takip) duruma geçer ve nerelerde U8220, . (CrashHandler.java:70, strings.xml:51)

Olmayan Android bir durumda, bu biraz farklı olurdu. Kendi yerel izleme toplamak için ihtiyacınız olacak, this other question, ne bağlı olarak. İşlemek için izleme damping, çarpışma işleyicisi ayrı işlem başlatılıyor, ve bazı uygun şekilde e-posta gönderme platformu için ihtiyacınız olacak, ama genel yaklaşım hala çalışması gerektiğini düşünüyorum.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Gavin Hoey

    Gavin Hoey

    21 Aralık 2007
  • Howcast

    Howcast

    4 EKİM 2007
  • Sali Kaceli

    Sali Kaceli

    24 ŞUBAT 2009