エラートレース

実行時エラー、何処でエラーを出しているか掴みたい。

  • 泥臭い 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 は出てても引数出てない。
おそらくだがセキュリティーホールなどになるからかもしれない。

  • まず、 setreuid() の引数が知りたい!
./ は $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
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。