2011-01-30 58 views
14

Tôi đã có một segfault nhưng tôi hoàn toàn không có ý tưởng làm thế nào để xác định vị trí nó.Làm thế nào tôi có thể gỡ lỗi hiệu quả mã C được gói bằng JNI trong Eclipse? (Android Dev)

Mẹo? enter image description here

+0

Tôi đã thử theo http://stackoverflow.com/questions/3902066/how-to-call-java-methods-from-c-in-jni/3902495#3902495 nhưng tôi đang phân đoạn trước khi tôi thậm chí có được cơ hội thực hiện cuộc gọi tới logcat:/ –

+0

Biến riêng không thể được chuyển đến hàm gốc. D'oh. –

+0

Cách dễ dàng và không nhanh như vậy: Thử cách ly các cuộc gọi trong lớp gốc của bạn theo từng bước và kiểm tra xem cuộc gọi nào đang diễn ra sai. Ngoài ra, đáng thử là: /docs/NDK-GDB.HTML - mô tả cách sử dụng trình gỡ lỗi mã gốc – TheCottonSilk

Trả lời

10

Bạn có thể lấy vị trí của hàm C gây ra sự cố bằng cách sử dụng Android NDK Stacktrace Analyzer. Các bước trên the wiki, nhưng về cơ bản bạn cần lấy dấu vết ngăn xếp từ logcat vào tệp (adb logcat > mycrash.log), sau đó đổ thư viện của bạn vào tệp văn bản, sau đó chạy chương trình trên hai tệp. Đây là tập lệnh shell tôi sử dụng để thực hiện rất nhiều:

#!/bin/sh 
if test $# -lt 2 ; then 
    echo "Extract readable stack trace from Android logcat crash" 
    echo "Usage $0 lib.so crash.log" 
    exit 1 
fi 
of=$(mktemp) 
echo "Disassemble $1" 
~/tools/android-ndk-r5/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-objdump -S $1 > $of 
echo "Parse stack trace in $2" 
~/bin/parse_stack.py $of $2 

Thay đổi đường dẫn đến tệp NDK và parse_stack.py của Android khi bạn cần.

+0

Rất vui khi cuối cùng tìm được thứ như thế này. Tôi đã mệt mỏi vì phải đi qua gdbserver rigmarole chỉ để có được một dấu vết từ một segfault. –

+0

Tôi vừa gửi bản vá cho dự án hiển thị đoạn mã nơi xảy ra sự cố: http://code.google.com/p/android-ndk-stacktrace-analyzer/issues/detail?id=1 –

+0

bạn theo tôi Jason LeBrun? Haha. Cảm ơn richq. Thật tuyệt vời. –

6

Làm thế nào để có hiệu quả gỡ lỗi Android JNI C/C++ Mã trong Eclipse:

  1. Cài đặt dự án của bạn trở thành một hỗn hợp Java, C và C++ Dự án:

    http://mhandroid.wordpress.com/2011/01/23/using-eclipse-for-android-cc-development/

  2. Cài đặt dự án của bạn để bật gỡ lỗi:

    http://mhandroid.wordpress.com/2011/01/23/using-eclipse-for-android-cc-debugging/#more-23

Lưu ý: Tác giả của trang web đã sử dụng Eclipse (Galileo) trên Ubuntu. Tôi tìm thấy một số khác biệt khi sử dụng Eclipse (Helios) trên MacOS (đặc biệt là với thiết lập gỡ lỗi). Một khi mọi thứ đã được thiết lập, Eclipse hoạt động rất tốt như một IDE để phát triển JNI.

+4

Được rồi, chúng có thể khiến thiết lập khó khăn hơn không? Tôi vẫn không thể làm cho nó hoạt động để gỡ lỗi. – JPM

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