void DebuggerKill() { lock (m_Lock) { if (m_Session != null) { m_DebuggeeExecuting = true; if (!m_Session.HasExited) { m_Session.Exit(); } m_Session.Dispose(); m_Session = null; } } }
public static void Kill() { lock (_lock) { if (_session == null) { return; } CommandLine.InferiorExecuting = true; if (!_session.HasExited) { _session.Exit(); } _session.Dispose(); _session = null; } }
public void Kill() { lock (_lock) { if (_session == null) { return; } if (!_session.IsRunning) { _session.Continue(); } if (!_session.HasExited) { _session.Exit(); } _session.Dispose(); _session = null; } }
public void ApplicationRunsWithDebuggerAndBreaks(bool useSharedRuntime, bool embedAssemblies, string fastDevType, bool allowDeltaInstall) { AssertCommercialBuild(); AssertHasDevices(); var proj = new XamarinFormsAndroidApplicationProject() { IsRelease = false, AndroidUseSharedRuntime = useSharedRuntime, EmbedAssembliesIntoApk = embedAssemblies, AndroidFastDeploymentType = fastDevType }; var abis = new string [] { "armeabi-v7a", "x86" }; proj.SetProperty(KnownProperties.AndroidSupportedAbis, string.Join(";", abis)); if (allowDeltaInstall) { proj.SetProperty(KnownProperties._AndroidAllowDeltaInstall, "true"); } proj.SetDefaultTargetDevice(); using (var b = CreateApkBuilder(Path.Combine("temp", TestName))) { SetTargetFrameworkAndManifest(proj, b); Assert.True(b.Install(proj), "Project should have installed."); int breakcountHitCount = 0; ManualResetEvent resetEvent = new ManualResetEvent(false); var sw = new Stopwatch(); // setup the debugger var session = new SoftDebuggerSession(); session.Breakpoints = new BreakpointStore { { Path.Combine(Root, b.ProjectDirectory, "MainActivity.cs"), 20 }, { Path.Combine(Root, b.ProjectDirectory, "MainPage.xaml.cs"), 14 }, { Path.Combine(Root, b.ProjectDirectory, "MainPage.xaml.cs"), 19 }, { Path.Combine(Root, b.ProjectDirectory, "App.xaml.cs"), 12 }, }; session.TargetHitBreakpoint += (sender, e) => { TestContext.WriteLine($"BREAK {e.Type}, {e.Backtrace.GetFrame (0)}"); breakcountHitCount++; session.Continue(); }; var rnd = new Random(); int port = rnd.Next(10000, 20000); TestContext.Out.WriteLine($"{port}"); var args = new SoftDebuggerConnectArgs("", IPAddress.Loopback, port) { MaxConnectionAttempts = 10, }; var startInfo = new SoftDebuggerStartInfo(args) { WorkingDirectory = Path.Combine(b.ProjectDirectory, proj.IntermediateOutputPath, "android", "assets"), }; var options = new DebuggerSessionOptions() { EvaluationOptions = EvaluationOptions.DefaultOptions, }; options.EvaluationOptions.UseExternalTypeResolver = true; ClearAdbLogcat(); Assert.True(b.RunTarget(proj, "_Run", parameters: new string [] { $"AndroidSdbTargetPort={port}", $"AndroidSdbHostPort={port}", "AndroidAttachDebugger=True", }), "Project should have run."); Assert.IsTrue(WaitForDebuggerToStart(Path.Combine(Root, b.ProjectDirectory, "logcat.log")), "Activity should have started"); // we need to give a bit of time for the debug server to start up. WaitFor(2000); session.LogWriter += (isStderr, text) => { Console.WriteLine(text); }; session.OutputWriter += (isStderr, text) => { Console.WriteLine(text); }; session.DebugWriter += (level, category, message) => { Console.WriteLine(message); }; session.Run(startInfo, options); WaitFor(TimeSpan.FromSeconds(30), () => session.IsConnected); Assert.True(session.IsConnected, "Debugger should have connected but it did not."); // we need to wait here for a while to allow the breakpoints to hit // but we need to timeout TimeSpan timeout = TimeSpan.FromSeconds(60); int expected = 3; while (session.IsConnected && breakcountHitCount < 3 && timeout >= TimeSpan.Zero) { Thread.Sleep(10); timeout = timeout.Subtract(TimeSpan.FromMilliseconds(10)); } WaitFor(2000); Assert.AreEqual(expected, breakcountHitCount, $"Should have hit {expected} breakpoints. Only hit {breakcountHitCount}"); breakcountHitCount = 0; ClearAdbLogcat(); ClickButton(proj.PackageName, "myXFButton", "CLICK ME"); while (session.IsConnected && breakcountHitCount < 1 && timeout >= TimeSpan.Zero) { Thread.Sleep(10); timeout = timeout.Subtract(TimeSpan.FromMilliseconds(10)); } expected = 1; Assert.AreEqual(expected, breakcountHitCount, $"Should have hit {expected} breakpoints. Only hit {breakcountHitCount}"); Assert.True(b.Uninstall(proj), "Project should have uninstalled."); session.Exit(); } }
public void CustomApplicationRunsWithDebuggerAndBreaks(bool useSharedRuntime, bool embedAssemblies, string fastDevType, bool activityStarts) { AssertCommercialBuild(); AssertHasDevices(); var proj = new XamarinAndroidApplicationProject() { IsRelease = false, AndroidFastDeploymentType = fastDevType, }; var abis = new string [] { "armeabi-v7a", "x86" }; proj.SetProperty(KnownProperties.AndroidSupportedAbis, string.Join(";", abis)); proj.SetProperty(KnownProperties.AndroidUseSharedRuntime, useSharedRuntime.ToString()); proj.SetProperty("EmbedAssembliesIntoApk", embedAssemblies.ToString()); proj.SetDefaultTargetDevice(); proj.Sources.Add(new BuildItem.Source("MyApplication.cs") { TextContent = () => proj.ProcessSourceTemplate(@"using System; using Android.App; using Android.OS; using Android.Runtime; using Android.Widget; namespace ${ROOT_NAMESPACE} { [Application] public class MyApplication : Application { public MyApplication (IntPtr handle, JniHandleOwnership jniHandle) : base (handle, jniHandle) { } public override void OnCreate () { base.OnCreate (); } } } "), }); using (var b = CreateApkBuilder(Path.Combine("temp", TestName))) { SetTargetFrameworkAndManifest(proj, b); Assert.True(b.Install(proj), "Project should have installed."); int breakcountHitCount = 0; ManualResetEvent resetEvent = new ManualResetEvent(false); var sw = new Stopwatch(); // setup the debugger var session = new SoftDebuggerSession(); session.Breakpoints = new BreakpointStore { { Path.Combine(Root, b.ProjectDirectory, "MainActivity.cs"), 19 }, { Path.Combine(Root, b.ProjectDirectory, "MyApplication.cs"), 17 }, }; session.TargetHitBreakpoint += (sender, e) => { TestContext.WriteLine($"BREAK {e.Type}, {e.Backtrace.GetFrame (0)}"); breakcountHitCount++; session.Continue(); }; var rnd = new Random(); int port = rnd.Next(10000, 20000); TestContext.Out.WriteLine($"{port}"); var args = new SoftDebuggerConnectArgs("", IPAddress.Loopback, port) { MaxConnectionAttempts = 10, }; var startInfo = new SoftDebuggerStartInfo(args) { WorkingDirectory = Path.Combine(b.ProjectDirectory, proj.IntermediateOutputPath, "android", "assets"), }; var options = new DebuggerSessionOptions() { EvaluationOptions = EvaluationOptions.DefaultOptions, }; options.EvaluationOptions.UseExternalTypeResolver = true; ClearAdbLogcat(); Assert.True(b.RunTarget(proj, "_Run", parameters: new string [] { $"AndroidSdbTargetPort={port}", $"AndroidSdbHostPort={port}", "AndroidAttachDebugger=True", }), "Project should have run."); // do we expect the app to start? Assert.AreEqual(activityStarts, WaitForDebuggerToStart(Path.Combine(Root, b.ProjectDirectory, "logcat.log")), "Activity should have started"); if (!activityStarts) { return; } // we need to give a bit of time for the debug server to start up. WaitFor(2000); session.LogWriter += (isStderr, text) => { Console.WriteLine(text); }; session.OutputWriter += (isStderr, text) => { Console.WriteLine(text); }; session.DebugWriter += (level, category, message) => { Console.WriteLine(message); }; session.Run(startInfo, options); var expectedTime = TimeSpan.FromSeconds(1); var actualTime = ProfileFor(() => session.IsConnected); TestContext.Out.WriteLine($"Debugger connected in {actualTime}"); Assert.LessOrEqual(actualTime, expectedTime, $"Debugger should have connected within {expectedTime} but it took {actualTime}."); // we need to wait here for a while to allow the breakpoints to hit // but we need to timeout TimeSpan timeout = TimeSpan.FromSeconds(60); while (session.IsConnected && breakcountHitCount < 2 && timeout >= TimeSpan.Zero) { Thread.Sleep(10); timeout = timeout.Subtract(TimeSpan.FromMilliseconds(10)); } WaitFor(2000); int expected = 2; Assert.AreEqual(expected, breakcountHitCount, $"Should have hit {expected} breakpoints. Only hit {breakcountHitCount}"); Assert.True(b.Uninstall(proj), "Project should have uninstalled."); session.Exit(); } }
public void ApplicationRunsWithDebuggerAndBreaks(bool useSharedRuntime, bool embedAssemblies, string fastDevType) { if (!CommercialBuildAvailable) { Assert.Ignore("Test does not run on the Open Source Builds."); return; } if (!HasDevices) { Assert.Ignore("Test needs a device attached."); return; } var proj = new XamarinFormsAndroidApplicationProject() { IsRelease = false, AndroidFastDeploymentType = fastDevType }; var abis = new string [] { "armeabi-v7a", "x86" }; proj.SetProperty(KnownProperties.AndroidSupportedAbis, string.Join(";", abis)); proj.SetProperty(KnownProperties.AndroidUseSharedRuntime, useSharedRuntime.ToString()); proj.SetProperty("EmbedAssembliesIntoApk", embedAssemblies.ToString()); proj.SetDefaultTargetDevice(); using (var b = CreateApkBuilder(Path.Combine("temp", TestName))) { string apiLevel; proj.TargetFrameworkVersion = b.LatestTargetFrameworkVersion(out apiLevel); proj.AndroidManifest = $@"<?xml version=""1.0"" encoding=""utf-8""?> <manifest xmlns:android=""http://schemas.android.com/apk/res/android"" android:versionCode=""1"" android:versionName=""1.0"" package=""UnnamedProject.UnnamedProject""> <uses-sdk android:minSdkVersion=""24"" android:targetSdkVersion=""{apiLevel}"" /> <application android:label=""${{PROJECT_NAME}}""> </application > </manifest>"; b.Save(proj, saveProject: true); proj.NuGetRestore(Path.Combine(Root, b.ProjectDirectory), b.PackagesDirectory); Assert.True(b.Build(proj), "Project should have built."); Assert.True(b.Install(proj), "Project should have installed."); int breakcountHitCount = 0; ManualResetEvent resetEvent = new ManualResetEvent(false); var sw = new Stopwatch(); // setup the debugger var session = new SoftDebuggerSession(); session.Breakpoints = new BreakpointStore { { Path.Combine(Root, b.ProjectDirectory, "MainActivity.cs"), 19 }, { Path.Combine(Root, b.ProjectDirectory, "MainPage.xaml.cs"), 14 }, { Path.Combine(Root, b.ProjectDirectory, "MainPage.xaml.cs"), 19 }, { Path.Combine(Root, b.ProjectDirectory, "App.xaml.cs"), 12 }, }; session.TargetHitBreakpoint += (sender, e) => { Console.WriteLine($"BREAK {e.Type}"); breakcountHitCount++; session.Continue(); }; var rnd = new Random(); int port = rnd.Next(10000, 20000); TestContext.Out.WriteLine($"{port}"); var args = new SoftDebuggerConnectArgs("", IPAddress.Loopback, port) { MaxConnectionAttempts = 10, }; var startInfo = new SoftDebuggerStartInfo(args) { WorkingDirectory = Path.Combine(b.ProjectDirectory, proj.IntermediateOutputPath, "android", "assets"), }; var options = new DebuggerSessionOptions() { EvaluationOptions = EvaluationOptions.DefaultOptions, }; options.EvaluationOptions.UseExternalTypeResolver = true; ClearAdbLogcat(); Assert.True(b.RunTarget(proj, "_Run", parameters: new string [] { $"AndroidSdbTargetPort={port}", $"AndroidSdbHostPort={port}", "AndroidAttachDebugger=True", }), "Project should have run."); Assert.IsTrue(WaitForDebuggerToStart(output: out string logcat), "Activity should have started"); // we need to give a bit of time for the debug server to start up. WaitFor(2000); session.LogWriter += (isStderr, text) => { Console.WriteLine(text); }; session.OutputWriter += (isStderr, text) => { Console.WriteLine(text); }; session.DebugWriter += (level, category, message) => { Console.WriteLine(message); }; session.Run(startInfo, options); WaitFor(TimeSpan.FromSeconds(30), () => session.IsConnected); Assert.True(session.IsConnected, "Debugger should have connected but it did not."); // we need to wait here for a while to allow the breakpoints to hit // but we need to timeout TimeSpan timeout = TimeSpan.FromSeconds(60); while (session.IsConnected && breakcountHitCount < 3) { Thread.Sleep(10); timeout = timeout.Subtract(TimeSpan.FromMilliseconds(10)); } WaitFor(2000); ClearAdbLogcat(); ClickButton(proj.PackageName, "myXFButton", "CLICK ME"); while (session.IsConnected && breakcountHitCount < 4) { Thread.Sleep(10); timeout = timeout.Subtract(TimeSpan.FromMilliseconds(10)); } int expected = 4; Assert.AreEqual(expected, breakcountHitCount, $"Should have hit {expected} breakpoints. Only hit {breakcountHitCount}"); Assert.True(b.Uninstall(proj), "Project should have uninstalled."); session.Exit(); } }
public void ApplicationRunsWithDebuggerAndBreaks(bool embedAssemblies, string fastDevType, bool allowDeltaInstall, string username) { AssertCommercialBuild(); AssertHasDevices(); var path = Path.Combine("temp", TestName); int userId = GetUserId(username); List <string> parameters = new List <string> (); if (userId >= 0) { parameters.Add($"AndroidDeviceUserId={userId}"); } if (SwitchUser(username)) { WaitFor(5); ClickButton("", "android:id/button1", "Yes continue"); } var lib = new XamarinAndroidLibraryProject { ProjectName = "Library1", Sources = { new BuildItem.Source("Foo.cs") { TextContent = () => @"public class Foo { public Foo () { } }" }, }, }; var app = new XamarinFormsAndroidApplicationProject { ProjectName = "App", IsRelease = false, EmbedAssembliesIntoApk = embedAssemblies, AndroidFastDeploymentType = fastDevType }; app.MainPage = app.MainPage.Replace("InitializeComponent ();", "InitializeComponent (); new Foo ();"); app.AddReference(lib); app.SetAndroidSupportedAbis("armeabi-v7a", "x86"); app.SetProperty(KnownProperties._AndroidAllowDeltaInstall, allowDeltaInstall.ToString()); app.SetDefaultTargetDevice(); using (var libBuilder = CreateDllBuilder(Path.Combine(path, lib.ProjectName))) using (var appBuilder = CreateApkBuilder(Path.Combine(path, app.ProjectName))) { Assert.True(libBuilder.Build(lib), "Library should have built."); SetTargetFrameworkAndManifest(app, appBuilder); Assert.True(appBuilder.Install(app, parameters: parameters.ToArray()), "App should have installed."); if (!embedAssemblies) { // Check that we deployed .pdb files StringAssertEx.ContainsRegex($@"NotifySync CopyFile.+{app.ProjectName}\.pdb", appBuilder.LastBuildOutput, $"{app.ProjectName}.pdb should be deployed!"); StringAssertEx.ContainsRegex($@"NotifySync CopyFile.+{lib.ProjectName}\.pdb", appBuilder.LastBuildOutput, $"{lib.ProjectName}.pdb should be deployed!"); } int breakcountHitCount = 0; ManualResetEvent resetEvent = new ManualResetEvent(false); var sw = new Stopwatch(); // setup the debugger var session = new SoftDebuggerSession(); session.Breakpoints = new BreakpointStore { { Path.Combine(Root, appBuilder.ProjectDirectory, "MainActivity.cs"), 20 }, { Path.Combine(Root, appBuilder.ProjectDirectory, "MainPage.xaml.cs"), 14 }, { Path.Combine(Root, appBuilder.ProjectDirectory, "MainPage.xaml.cs"), 19 }, { Path.Combine(Root, appBuilder.ProjectDirectory, "App.xaml.cs"), 12 }, { Path.Combine(Root, libBuilder.ProjectDirectory, "Foo.cs"), 4 }, }; session.TargetHitBreakpoint += (sender, e) => { TestContext.WriteLine($"BREAK {e.Type}, {e.Backtrace.GetFrame (0)}"); breakcountHitCount++; session.Continue(); }; var rnd = new Random(); int port = rnd.Next(10000, 20000); TestContext.Out.WriteLine($"{port}"); var args = new SoftDebuggerConnectArgs("", IPAddress.Loopback, port) { MaxConnectionAttempts = 10, }; var startInfo = new SoftDebuggerStartInfo(args) { WorkingDirectory = Path.Combine(appBuilder.ProjectDirectory, app.IntermediateOutputPath, "android", "assets"), }; var options = new DebuggerSessionOptions() { EvaluationOptions = EvaluationOptions.DefaultOptions, }; options.EvaluationOptions.UseExternalTypeResolver = true; ClearAdbLogcat(); appBuilder.BuildLogFile = "run.log"; parameters.Add($"AndroidSdbTargetPort={port}"); parameters.Add($"AndroidSdbHostPort={port}"); parameters.Add("AndroidAttachDebugger=True"); Assert.True(appBuilder.RunTarget(app, "_Run", doNotCleanupOnUpdate: true, parameters: parameters.ToArray()), "Project should have run."); Assert.IsTrue(WaitForDebuggerToStart(Path.Combine(Root, appBuilder.ProjectDirectory, "logcat.log")), "Activity should have started"); // we need to give a bit of time for the debug server to start up. WaitFor(2000); session.LogWriter += (isStderr, text) => { Console.WriteLine(text); }; session.OutputWriter += (isStderr, text) => { Console.WriteLine(text); }; session.DebugWriter += (level, category, message) => { Console.WriteLine(message); }; session.Run(startInfo, options); WaitFor(TimeSpan.FromSeconds(30), () => session.IsConnected); Assert.True(session.IsConnected, "Debugger should have connected but it did not."); // we need to wait here for a while to allow the breakpoints to hit // but we need to timeout TimeSpan timeout = TimeSpan.FromSeconds(60); int expected = 4; while (session.IsConnected && breakcountHitCount < 3 && timeout >= TimeSpan.Zero) { Thread.Sleep(10); timeout = timeout.Subtract(TimeSpan.FromMilliseconds(10)); } WaitFor(2000); Assert.AreEqual(expected, breakcountHitCount, $"Should have hit {expected} breakpoints. Only hit {breakcountHitCount}"); breakcountHitCount = 0; ClearAdbLogcat(); ClickButton(app.PackageName, "myXFButton", "CLICK ME"); while (session.IsConnected && breakcountHitCount < 1 && timeout >= TimeSpan.Zero) { Thread.Sleep(10); timeout = timeout.Subtract(TimeSpan.FromMilliseconds(10)); } expected = 1; Assert.AreEqual(expected, breakcountHitCount, $"Should have hit {expected} breakpoints. Only hit {breakcountHitCount}"); appBuilder.BuildLogFile = "uninstall.log"; Assert.True(appBuilder.Uninstall(app), "Project should have uninstalled."); session.Exit(); } }