実行時エラー、何処でエラーを出しているか掴みたい。
- 泥臭い log (printf等)
- よりスマートな ddms
- さらにスマートな Android app eclipse
- スマートなのか泥臭いかよく分からないが gdb !!
フレームワークの既存logレベルを setprop で変更する
adb shell setprop log.tag.AccountManagerService VERBOSE
C言語ネイティブでlogを出すには?
DDMS log の tag に表示される内容の指定
#define LOG_TAG "hogehoge"
LOGVを出す指定
#define LOG_NDEBUG 0
includeファイル
#include <cutils/log.h>
サンプル
LOGW("open(%s) failed: %s (%d)\n", path, strerror(errno), errno);
以下、旧情報ほぼ有益な情報は無い
とりあえず、log で気に入らないメッセージが出るので鎮めることにした。
だけど、エラーメッセージって簡略化しすぎ。err や errorno は出てても引数出てない。
おそらくだがセキュリティーホールなどになるからかもしれない。
./ は $ANDROID_SRC/ に読み替えること。
./frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
にエラーメッセージを出すルーチンがある。
本体は、JNIを使って c言語ネイティブプログラムをコールしている模様。
そちらのロギングコードは有ったが、はコメントアウトされていたので、
java 側を修正。
$ diff -u ZygoteInit.java.orig ZygoteInit.java
--- ZygoteInit.java.orig 2010-12-25 05:57:19.636641127 +0900
+++ ZygoteInit.java 2010-12-25 08:19:48.707223984 +0900
@@ -235,7 +235,7 @@
private static void setEffectiveUser(int uid) {
int errno = setreuid(ROOT_UID, uid);
if (errno != 0) {
- Log.e(TAG, "setreuid() failed. errno: " + errno);
+ Log.e(TAG, "setreuid("+ROOT_UID+","+uid+") failed. errno: " + errno);
}
}
@@ -245,7 +245,7 @@
private static void setEffectiveGroup(int gid) {
int errno = setregid(ROOT_GID, gid);
if (errno != 0) {
- Log.e(TAG, "setregid() failed. errno: " + errno);
+ Log.e(TAG, "setregid("+ROOT_GID+","+gid+") failed. errno: " + errno);
}
}
は!これを書くために diff 取ったら、私のミスが分かった。
と言うわけで、実行時エラー setreuid() で書いたのはウソです。
あとエラー出力に関係有りそうなのは…
下記のコメントアウトされていたのを復活させていた^^; パッチほどのモノでもないかと。。。
JNIでのc言語ネイティブの実態。
frameworks/base/core/jni/com_android_internal_os_ZygoteInit.cpp:53: LOGI("setreuid(%d,%d) err %d %d errno %d", ruid, euid, err, errno);
これで、実行時エラーの内容が得られる。
コメント
最終更新:2011年10月07日 23:19