2011-03-31 41 views
10

Tôi đã tải xuống SDL 1.3 và thử nghiệm nó cùng với OpenGL ES trên thiết bị Android 2.2 của tôi. Nó hoạt động tốt nhưng tôi không nhận được kết quả đầu ra từ các cuộc gọi printf. Tôi đã thử các lệnh dưới đây như đã đề cập ở số android developer page nhưng không phải DDMS trong Eclipse cũng không adb logcat báo cáo các chuỗi mà chương trình viết bằng cách sử dụng printf. Tôi đã đảm bảo lọc cho thẻ stdout.Tại sao chuyển hướng stdout/stderr trên Android không hoạt động?

$ adb shell stop 
$ adb shell setprop log.redirect-stdio true 
$ adb shell start 

Tôi đang thiếu hoặc làm sai?

+0

FWIW, điều này làm cho máy ảo Dalvik tạo một chuỗi sao chép stdout/stderr vào tệp nhật ký. Bạn cần phải root để dừng/khởi động khung ứng dụng. Xem thêm http://stackoverflow.com/questions/17188987/android-native-code-debugging/17199704#17199704. – fadden

Trả lời

1

Một cách khác để thực hiện việc này là có tệp /data/local.prop, chỉ chứa dòng log.redirect-stdio=true. Có lẽ điều này hoạt động tốt hơn? Ngoài ra, lưu ý rằng stdout được đệm, do đó, nó có thể là đầu ra của bạn vẫn còn nằm trong bộ đệm, chờ đợi để được đỏ mặt. Bạn có thể gọi fflush theo cách thủ công để kiểm tra điều này.

+0

adb push local.prop /data/local.prop không hoạt động do quyền. Tôi có phải root thiết bị của mình không? – trenki

+1

Hmm, tôi không nhận ra rằng điều này sẽ gây rắc rối cho bạn trên một thiết bị. Nó hoạt động tốt trên giả lập mặc dù. Tôi biết giả lập là một nỗi đau để sử dụng, đặc biệt là với OpenGL, nhưng có lẽ đó là một lựa chọn cho việc chụp hình sự cố? Theo thông điệp của David Turner về nhóm NDK (xem http://groups.google.com/group/android-ndk/msg/0d37b24df6df7cde) stop/setprop/start nên được coi là không được hỗ trợ. – svdree

+0

Tính năng này có hoạt động từ C không? Tôi thấy đầu ra stderr để logcat từ java khi tôi làm điều này, nhưng tôi không thấy đầu ra từ C cuộc gọi đến một cái gì đó như fprintf (stderr, "cái gì"). –

2

Theo presentation này, log.redirect-stdio là dành cho đầu ra Dalvik, để chuyển hướng C/C++ đầu ra (như printf), bạn phải cài đặt busybox trên thiết bị và sử dụng tiện ích xargs của nó như thế này:

myprogram | xargs log 

này rõ ràng là làm việc cho mã được gọi là một tệp thực thi độc lập. Nếu nó chỉ dành cho mục đích gỡ lỗi, bạn có thể viết một chương trình nhỏ để gọi thư viện của bạn và gọi nó từ ứng dụng của bạn bằng cách sử dụng xargs.

+1

Xem câu trả lời của tôi cho http://stackoverflow.com/questions/9192749/capturing-stdout-stderr-with-ndk để có giải pháp với ống thay vì busybox. –

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