Make adbconnection start automatically for debuggable apps (on target)
With wrap.sh it is required that apps that wish to be debuggable
declare that explicitly by adding the '-Xcompiler-option --debuggable'
options. When we switched to the new debugger implementation we
accidentally added a requirement that you pass
-XjdwpProvider:adbconnection. This removes that requirement and
returns to the earlier state.
Bug: 109505014
Test: Build program with wrap.sh that adds -Xcompiler-option --debuggable
Attach debugger to program.
Change-Id: I9416ed3b156776439f5bfec032fee3f11fe4eb3c
diff --git a/cmdline/cmdline_parser_test.cc b/cmdline/cmdline_parser_test.cc
index 235a2aa..a52e163 100644
--- a/cmdline/cmdline_parser_test.cc
+++ b/cmdline/cmdline_parser_test.cc
@@ -371,7 +371,7 @@
*/
TEST_F(CmdlineParserTest, TestJdwpProviderEmpty) {
{
- EXPECT_SINGLE_PARSE_DEFAULT_VALUE(JdwpProvider::kNone, "", M::JdwpProvider);
+ EXPECT_SINGLE_PARSE_DEFAULT_VALUE(JdwpProvider::kUnset, "", M::JdwpProvider);
}
} // TEST_F
diff --git a/runtime/jdwp_provider.h b/runtime/jdwp_provider.h
index 698fdc0..c4f1989 100644
--- a/runtime/jdwp_provider.h
+++ b/runtime/jdwp_provider.h
@@ -19,6 +19,7 @@
#include <ios>
+#include "base/globals.h"
#include "base/macros.h"
#include "base/logging.h"
@@ -26,13 +27,33 @@
enum class JdwpProvider {
kNone,
+ // Special value only used to denote that no explicit choice has been made by the user. This
+ // should not be used and one should always call CanonicalizeJdwpProvider which will remove this
+ // value before using a JdwpProvider value.
+ kUnset,
kInternal,
kAdbConnection,
- // The current default provider
+ // The current default provider. Used if you run -XjdwpProvider:default
kDefaultJdwpProvider = kAdbConnection,
+
+ // What we should use as provider with no options and debuggable. On host we always want to be
+ // none since there is no adbd on host.
+ kUnsetDebuggable = kIsTargetBuild ? kDefaultJdwpProvider : kNone,
+ // What we should use as provider with no options and non-debuggable
+ kUnsetNonDebuggable = kNone,
};
+inline JdwpProvider CanonicalizeJdwpProvider(JdwpProvider p, bool debuggable) {
+ if (p != JdwpProvider::kUnset) {
+ return p;
+ }
+ if (debuggable) {
+ return JdwpProvider::kUnsetDebuggable;
+ }
+ return JdwpProvider::kUnsetNonDebuggable;
+}
+
std::ostream& operator<<(std::ostream& os, const JdwpProvider& rhs);
} // namespace art
diff --git a/runtime/runtime.cc b/runtime/runtime.cc
index 1402749..64aab01 100644
--- a/runtime/runtime.cc
+++ b/runtime/runtime.cc
@@ -1270,7 +1270,8 @@
dump_gc_performance_on_shutdown_ = runtime_options.Exists(Opt::DumpGCPerformanceOnShutdown);
jdwp_options_ = runtime_options.GetOrDefault(Opt::JdwpOptions);
- jdwp_provider_ = runtime_options.GetOrDefault(Opt::JdwpProvider);
+ jdwp_provider_ = CanonicalizeJdwpProvider(runtime_options.GetOrDefault(Opt::JdwpProvider),
+ IsJavaDebuggable());
switch (jdwp_provider_) {
case JdwpProvider::kNone: {
VLOG(jdwp) << "Disabling all JDWP support.";
@@ -1304,6 +1305,11 @@
constexpr const char* plugin_name = kIsDebugBuild ? "libadbconnectiond.so"
: "libadbconnection.so";
plugins_.push_back(Plugin::Create(plugin_name));
+ break;
+ }
+ case JdwpProvider::kUnset: {
+ LOG(FATAL) << "Illegal jdwp provider " << jdwp_provider_ << " was not filtered out!";
+ break;
}
}
callbacks_->AddThreadLifecycleCallback(Dbg::GetThreadLifecycleCallback());
diff --git a/runtime/runtime_options.def b/runtime/runtime_options.def
index e647423..3f9a322 100644
--- a/runtime/runtime_options.def
+++ b/runtime/runtime_options.def
@@ -44,7 +44,7 @@
RUNTIME_OPTIONS_KEY (Unit, CheckJni)
RUNTIME_OPTIONS_KEY (Unit, JniOptsForceCopy)
RUNTIME_OPTIONS_KEY (std::string, JdwpOptions, "")
-RUNTIME_OPTIONS_KEY (JdwpProvider, JdwpProvider, JdwpProvider::kNone)
+RUNTIME_OPTIONS_KEY (JdwpProvider, JdwpProvider, JdwpProvider::kUnset)
RUNTIME_OPTIONS_KEY (MemoryKiB, MemoryMaximumSize, gc::Heap::kDefaultMaximumSize) // -Xmx
RUNTIME_OPTIONS_KEY (MemoryKiB, MemoryInitialSize, gc::Heap::kDefaultInitialSize) // -Xms
RUNTIME_OPTIONS_KEY (MemoryKiB, HeapGrowthLimit) // Default is 0 for unlimited