2012-11-27 18 views
6

Tôi chỉ muốn lấy tất cả các bãi từ các chủ đề máy ảo java, để xem chủ đề khóa và chủ đề nào đang chờ để mở khóa một số tài nguyên. Một cái gì đó như được mô tả here. Tôi đã cố gắng để giết quá trình Zygote nhưng không có kết quả.Làm thế nào để làm cho Java Thread Dump trong Android?

Trả lời

-1

Nếu bạn chuyển sang chế độ xem DDMS trong Eclipse, bạn có một số công cụ để xem chuỗi. Đó là những gì bạn đang tìm kiếm?

+0

Hầu như có. Tôi chưa biết đối tượng bị khóa, ví dụ: - bị khóa <0x0000000780b7e688> (một java.io.InputStreamReader) – Divano

+0

Câu trả lời này đã lỗi thời vì không còn Eclipse nữa. –

-1

Tôi đoán bạn cần các chuỗi trong ứng dụng. Đối với điều này, bạn có thể sử dụng chế độ xem DDMS trên plugin eclipse ADT. Dưới đây là doc http://developer.android.com/tools/debugging/ddms.html#thread

+0

Hầu như có. Tôi chưa biết đối tượng bị khóa, ví dụ: - bị khóa <0x0000000780b7e688> (một java.io.InputStreamReader) – Divano

+0

Eclipse và DDMS không còn được dùng nữa và Android Profiler sẽ không hiển thị bất kỳ thứ gì. Đọc dưới đây cho câu trả lời của tôi. –

12

Cách dễ nhất là với DDMS hoặc plugin ADT trong Eclipse. Xem http://developer.android.com/tools/debugging/ddms.html để được hướng dẫn cơ bản. Trong ngắn hạn, hãy vào màn hình Device, chọn ứng dụng bạn quan tâm, đảm bảo cập nhật luồng được bật và chuyển sang chế độ xem Chủ đề. Bạn sẽ nhận được một danh sách các chủ đề được cập nhật trực tiếp trong quá trình đó. Nhấp đúp vào một chuỗi sẽ lấy một ảnh chụp nhanh trạng thái chồng hiện tại.

Bạn có thể sử dụng chọn tất cả và sao chép trong kết xuất chuỗi để sao chép & dán theo dõi ngăn xếp.

Nếu bạn có thiết bị phát triển/bắt nguồn từ, bạn có thể yêu cầu máy ảo Dalvik đổ ngăn xếp luồng bằng cách gửi SIGQUIT đến quy trình ứng dụng mà bạn quan tâm. Ví dụ: nếu bạn muốn xem ngăn xếp cho tất cả chuỗi trong ứng dụng Lịch, bạn có thể làm một cái gì đó như thế này:

% adb shell ps | grep android.calendar 
u0_a6  2596 127 912804 48296 ffffffff b6f62c10 S com.google.android.calendar 
# 2596 is the process ID 
% adb shell run-as com.google.android.colendar kill -3 2596 

sản lượng logcat sẽ nói điều gì đó như:

I/dalvikvm(2596): Wrote stack traces to '/data/anr/traces.txt' 

Vì vậy, kéo rằng:

% adb pull /data/anr/traces.txt . 

Mỗi khi bạn báo hiệu một quá trình, nhật ký sẽ được thêm vào tệp đó. Có thể có những thứ khác ở đó, vì vậy bạn cần phải tìm kiếm pid 2596:

----- pid 2596 at 2012-11-27 12:48:38 ----- 
Cmd line: com.google.android.calendar 

DALVIK THREADS: 
... 

Ưu điểm của việc làm này trên quan điểm chủ đề DDMS là, nếu thread là bị mắc kẹt trên một màn hình, ngăn xếp bãi sẽ cung cấp cho bạn chỉ ra đối tượng nào bị khóa và luồng nào hiện đang giữ khóa.

Quy trình zygote không có liên quan ở đây; theo định nghĩa, nó không chạy một ứng dụng. Vì nó không có một chuỗi JDWP, và không nghe SIGQUIT, bạn không thể có được một dấu vết ngăn xếp ra khỏi nó anyway.

+0

Lưu ý: Tôi đã tìm thấy dấu vết của mình tại /data/anr/traces.txt.bugreport –

+0

Có cách dễ dàng hơn, hãy đọc bên dưới. –

1

Lấy các lệnh từ answer và tập hợp tất cả lại với nhau, dưới đây là tập lệnh sau. Đặt nó vào tệp dump.sh và thực hiện, nó sẽ tìm thấy PID cần thiết, tạo một tệp mới với dấu thời gian hiện tại và tiếp theo nó sẽ tìm nạp Thread-Dump vào nó. Lệnh này có thể hữu ích khi có một khoảng thời gian rất ngắn để tìm nạp kết xuất. Trước khi sử dụng, hãy đảm bảo rằng các dấu vết được đưa vào tệp /data/anr/traces.txt hoặc thay thế giá trị này trong tập lệnh.

#!/bin/sh 

pid=`./adb shell ps | grep android.calendar | awk '{print $2}'` 
echo $pid 
f=$(date +%s%N) 
echo $f 
./adb shell run-as com.google.android.calendar kill -3 $pid 
./adb pull /data/anr/traces.txt $f 

Là tên tệp thay thế, bạn có thể sử dụng f=$(date +"%T.%6N") để nhận dấu thời gian có thể đọc được của con người. Nó sẽ dễ dàng hơn để tìm tập tin cần thiết.

+0

Có cách dễ dàng hơn, hãy đọc câu trả lời của tôi bên dưới. –

+0

Đôi khi bạn không thể sử dụng các điểm ngắt. Đối với những trường hợp bạn sử dụng tập lệnh này. –

0

Chỉ cần gỡ lỗi ứng dụng của bạn trên điện thoại trong Android Studio; sau đó trong "Chế độ xem gỡ lỗi" Alt+5, chỉ cần nhấn nút "Máy ảnh" ở góc dưới cùng bên trái, để có được một bãi chứa tất cả stacktraces, bao gồm cả khóa mà chúng đang giữ.

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