Make ResolveField not rely on Field::GetType resolution

Change-Id: I10f4a874809ac9db2cd54e200cf10eb7c8979fce
diff --git a/src/thread.cc b/src/thread.cc
index 2736140..f4ca2ab 100644
--- a/src/thread.cc
+++ b/src/thread.cc
@@ -642,9 +642,9 @@
 }
 
 // TODO: make more accessible?
-Field* FindFieldOrDie(Class* c, const char* name, Class* type) {
-  Field* f = c->FindDeclaredInstanceField(name, type);
-  CHECK(f != NULL) << PrettyClass(c) << " " << name << " " << PrettyClass(type);
+Field* FindFieldOrDie(Class* c, const char* name, const char* descriptor) {
+  Field* f = c->FindDeclaredInstanceField(name, descriptor);
+  CHECK(f != NULL) << PrettyClass(c) << " " << name << " " << descriptor;
   return f;
 }
 
@@ -659,25 +659,21 @@
   // Now the ClassLinker is ready, we can find the various Class*, Field*, and Method*s we need.
   ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
 
-  Class* boolean_class = FindPrimitiveClassOrDie(class_linker, 'Z');
-  Class* int_class = FindPrimitiveClassOrDie(class_linker, 'I');
-  Class* ClassLoader_class = FindClassOrDie(class_linker, "Ljava/lang/ClassLoader;");
-  Class* String_class = FindClassOrDie(class_linker, "Ljava/lang/String;");
   Class* Thread_class = FindClassOrDie(class_linker, "Ljava/lang/Thread;");
   Class* ThreadGroup_class = FindClassOrDie(class_linker, "Ljava/lang/ThreadGroup;");
   Class* UncaughtExceptionHandler_class = FindClassOrDie(class_linker, "Ljava/lang/Thread$UncaughtExceptionHandler;");
   gThreadLock = FindClassOrDie(class_linker, "Ljava/lang/ThreadLock;");
   gThrowable = FindClassOrDie(class_linker, "Ljava/lang/Throwable;");
 
-  gThread_daemon = FindFieldOrDie(Thread_class, "daemon", boolean_class);
-  gThread_group = FindFieldOrDie(Thread_class, "group", ThreadGroup_class);
-  gThread_lock = FindFieldOrDie(Thread_class, "lock", gThreadLock);
-  gThread_name = FindFieldOrDie(Thread_class, "name", String_class);
-  gThread_priority = FindFieldOrDie(Thread_class, "priority", int_class);
-  gThread_uncaughtHandler = FindFieldOrDie(Thread_class, "uncaughtHandler", UncaughtExceptionHandler_class);
-  gThread_vmData = FindFieldOrDie(Thread_class, "vmData", int_class);
-  gThreadGroup_name = FindFieldOrDie(ThreadGroup_class, "name", String_class);
-  gThreadLock_thread = FindFieldOrDie(gThreadLock, "thread", Thread_class);
+  gThread_daemon = FindFieldOrDie(Thread_class, "daemon", "Z");
+  gThread_group = FindFieldOrDie(Thread_class, "group", "Ljava/lang/ThreadGroup;");
+  gThread_lock = FindFieldOrDie(Thread_class, "lock", "Ljava/lang/ThreadLock;");
+  gThread_name = FindFieldOrDie(Thread_class, "name", "Ljava/lang/String;");
+  gThread_priority = FindFieldOrDie(Thread_class, "priority", "I");
+  gThread_uncaughtHandler = FindFieldOrDie(Thread_class, "uncaughtHandler", "Ljava/lang/Thread$UncaughtExceptionHandler;");
+  gThread_vmData = FindFieldOrDie(Thread_class, "vmData", "I");
+  gThreadGroup_name = FindFieldOrDie(ThreadGroup_class, "name", "Ljava/lang/String;");
+  gThreadLock_thread = FindFieldOrDie(gThreadLock, "thread", "Ljava/lang/Thread;");
 
   gThread_run = FindMethodOrDie(Thread_class, "run", "()V");
   gThreadGroup_removeThread = FindMethodOrDie(ThreadGroup_class, "removeThread", "(Ljava/lang/Thread;)V");
@@ -688,7 +684,7 @@
   Thread* self = Thread::Current();
   self->CreatePeer("main", false);
 
-  const Field* Thread_contextClassLoader = FindFieldOrDie(Thread_class , "contextClassLoader", ClassLoader_class);
+  const Field* Thread_contextClassLoader = FindFieldOrDie(Thread_class , "contextClassLoader", "Ljava/lang/ClassLoader;");
   Thread_contextClassLoader->SetObject(self->GetPeer(), self->GetClassLoaderOverride());
 }
 
@@ -1235,7 +1231,15 @@
 }
 
 void Thread::DumpFromGdb() const {
-  Dump(std::cerr);
+  std::ostringstream ss;
+  Dump(ss);
+  std::string str = ss.str();
+  // log to stderr for debugging command line processes
+  std::cerr << str;
+#ifdef HAVE_ANDROID_OS
+  // log to logcat for debugging frameworks processes
+  LOG(INFO) << str;
+#endif
 }
 
 class CatchBlockStackVisitor : public Thread::StackVisitor {