2013-07-16 34 views
11

Một ứng dụng Android mà tôi hiện đang phát triển đã bị lỗi (cố định), do những gì đáng lẽ phải nêu ra một IndexOutOfBoundsException. Tôi đã truy cập một chuỗi trong phương thức doInBackground của một lớp mở rộng AyncTask, từ tham số biến đối số (tức là String ...). Tôi đã vô tình truy cập vào chỉ số 1 (không phải 0) của một chuỗi đối số biến một phần tử (hơi lúng túng ...). Khi ứng dụng đầu tiên gặp lỗi, tôi nhìn vào logcat của mình, (và nhiều lần nữa để xác nhận rằng tôi không điên) và không có dấu vết ngăn xếp cho một RuntimeException được tìm thấy. Tôi gặp tai nạn điện thoại của tôi khá thường xuyên và luôn luôn có một chút dấu vết ngăn xếp tốt đẹp cho tôi để xem xét và sửa chữa với, nhưng tôi đã bối rối bởi điều này. Dưới đây là phần thích hợp của logcat của tôi (mà không chứa stack trace cho một RuntimeException), sau một tuyên bố gỡ lỗi ngay trước khi dòng mã đã gây ra vụ tai nạn:Tại sao logcat android không hiển thị dấu vết ngăn xếp cho một ngoại lệ thời gian chạy?

W/dalvikvm(25643): threadid=11: thread exiting with uncaught exception (group=0x40c281f8) 
D/dalvikvm(25643): GC_CONCURRENT freed 1249K, 25% free 12433K/16455K, paused 2ms+6ms 
W/dalvikvm(25643): threadid=15: thread exiting with uncaught exception (group=0x40c281f8) 
I/Process (25643): Sending signal. PID: 25643 SIG: 9 
I/ActivityManager(5905): Process com.trade.nav.ges (pid 25643) has died. 
W/ActivityManager(5905): Force removing r: app died, no saved state 
I/WindowManager(5905): WIN DEATH: win 
I/WindowManager(5905): WIN DEATH: win 
I/SurfaceFlinger(1746): id=3848 Removed idx=2 Map Size=4 
I/SurfaceFlinger(1746): id=3848 Removed idx=-2 Map Size=4 
I/WindowManager(5905): WIN DEATH: win 
I/power (5905): *** acquire_dvfs_lock : lockType : 1 freq : 1000000 
D/PowerManagerService(5905): acquireDVFSLockLocked : type : DVFS_MIN_LIMIT frequency : 1000000 uid : 1000 pid : 5905 tag : ActivityManager 
W/ActivityManager(5905): mDVFSLock.acquire() 

Và sau đó, hoạt động khác bắt đầu. Để tham khảo, đây là mã mà gây ra tai nạn:

private class LoadImage extends AsyncTask<String, Integer, Bitmap> { 
    String url = ""; 
    //... 
    public LoadImage(ImageView iv, Context c) { 
     //... 
    } 

    protected Bitmap doInBackground(String... urls) { 
     // urls has one element 
     url = urls[1]; 
     //... 
    } 
    //... 
} 

Bất kỳ cái nhìn sâu sắc vào những gì đang xảy ra sẽ vui lòng cho tôi rất nhiều, như tôi tò mò về việc có bất cứ điều gì chưa bao giờ thấy như thế này trên internet. Cảm ơn.

Chỉnh sửa: Tôi không có bộ lọc thiết

+0

Bạn đã thử bằng cách đặt mã ngoại lệ trong Try Catch Block? –

+0

Bạn chắc chắn rằng bạn không có bất kỳ bộ lọc nào được chọn? – Varun

+1

... vấn đề không phải là tôi cần phải ngăn chặn các mã từ việc nâng cao ngoại lệ thời gian chạy, tôi đã làm điều đó trong một phiên bản khác của mã (thay đổi số 1 thành 0). Vấn đề là phiên bản cũ của mã không bao giờ gây ra một dấu vết ngăn xếp ngoại lệ thời gian chạy để hiển thị trong logcat của tôi. Tôi muốn biết tại sao điều đó lại xảy ra. –

Trả lời

10

đề bạn đang đâm rõ (chú ý thread exiting with uncaught exception trên hai chủ đề khác nhau trong quá trình tương tự). Quá trình này tự dọn dẹp sau khi chính nó - Sending signal cho biết quá trình đang gửi tín hiệu gây tử vong cho chính nó. Vì vậy, câu hỏi là lý do tại sao bạn không nhìn thấy một bãi chứa stack giữa hai.

Ngăn xếp ngăn xếp đến từ RuntimeInit$UncaughtHandler, là trình xử lý ngoại lệ chưa được cung cấp toàn khung do khung cung cấp. Quá trình tự hủy diệt xảy ra trong khối finally. Thật khó để nhìn thấy một cách để thoát khỏi điều này mà không cần đăng nhập "LOẠI TRỪ KHÓA", trừ khi một cái gì đó trong Slog.e thất bại và ném.

Tôi đoán rằng có điều gì đó không thành công trong Slog.e hoặc ai đó đã thay thế trình xử lý ngoại lệ chưa được xử lý của khung công tác. Điều sau có thể xảy ra nếu bạn đã kết hợp một số thư viện bên ngoài vào ứng dụng của mình, chẳng hạn như trình ghi nhật ký sự cố hoặc mạng quảng cáo và trình xử lý mới không ghi ngoại lệ nhưng thực hiện quá trình này.

Bạn có thể theo dõi nó bằng cách đính kèm trình gỡ lỗi ngôn ngữ Java (ví dụ: Eclipse). Theo mặc định nó sẽ dừng lại trên các trường hợp ngoại lệ chưa được nắm bắt. Từ đó bạn có thể theo dõi nó xung quanh, thiết lập các điểm ngắt và một bước thông qua trình xử lý ngoại lệ chưa được nắm bắt (nếu bạn có đầy đủ nguồn), v.v.

+0

Cảm ơn bạn rất nhiều. Tôi có kế hoạch nhìn vào nó nhiều hơn ở nhà, vì tôi không thể tìm thấy thời gian tại nơi làm việc. Tôi không có bất kỳ thư viện của bên thứ ba nào sẽ ảnh hưởng đến điều đó (mặc dù tôi sẽ kiểm tra xem Aviary, một trình biên tập hình ảnh mà tôi sử dụng làm thư viện, không làm gì), và tôi vẫn thấy các bãi chứa khác trong logcat của tôi (như nó nên), vì vậy tôi tiếp tục bị hấp dẫn. Cảm ơn nhiều vì những gợi ý kịp thời và đầy đủ thông tin. Chúc một ngày tốt lành. –

6

Theo nghi ngờ của fadden, thư viện bên ngoài có thể ghi đè lên trình xử lý ngoại lệ chưa được bắt, tôi bắt đầu điều tra bất kỳ thư nào có thể. Hóa ra rằng GoogleAnalytics throttles treo và ngăn chặn ngăn xếp dấu vết được hiển thị trong logcat nếu bạn bật enableExceptionReporting. Tôi loại bỏ dòng mã này sau đó mọi thứ trở lại đúng hướng !! Đó có thể là lần đầu tiên tôi rất vui khi thấy tai nạn !!

Các vấn đề liên quan