forked from dotnet/runtime
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[docs] Add instructions for debugging native runtime code on Android (d…
- Loading branch information
1 parent
6081289
commit 89cea2e
Showing
2 changed files
with
103 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,99 @@ | ||
# Debugging Android runtime issues | ||
|
||
## Enable verbose runtime logging | ||
|
||
If a `net6.0-android` (or later) C# project is available, adding the following: | ||
|
||
```xml | ||
<ItemGroup> | ||
<AndroidEnvironment Include="AndroidEnv.txt" /> | ||
</ItemGroup> | ||
``` | ||
|
||
with `AndroidEnv.txt`: | ||
|
||
``` | ||
debug.mono.log=mono_log_level=debug,mono_log_mask=all | ||
MONO_SDB_ENV_OPTIONS=loglevel=10 # only needed if you're debugging the managed debugger | ||
``` | ||
|
||
Will enable additional Mono runtime logging in the adb log. This is often | ||
enough to diagnose issues such as missing assemblies or other loader problems. | ||
|
||
## Managed Debugging | ||
|
||
Should work from Visual Studio (Windows) | ||
|
||
## Native debugging | ||
|
||
Install Android Studio. | ||
|
||
Download the symbols nupkg corresponding to the runtime pack that is used by | ||
the app. The runtime pack for the android workload is in a folder like | ||
`${DOTNET_ROOT}/packs/Microsoft.NETCore.App.Runtime.Mono.android-x86/6.0.0-rc.1.21451.13` | ||
|
||
The symbols are in a package called | ||
`Microsoft.NETCore.App.Runtime.Mono.android-x86.6.0.0-rc.1.21451.13.symbols.nupkg` | ||
uploaded to (FIXME: where does the symbols nuget go?). Extract it to some folder using `unzip` and in the | ||
`runtimes/android-x86/native/` folder rename the `*.so.dbg` files to `*.so.so` | ||
(we will need to add the symbols files to Android Studio, but its file picker | ||
only shows `*.so` extensions) | ||
|
||
|
||
1. Build the APK normally using `dotnet build`, (this will produce a `AppName-Signed.apk` in the output folder) | ||
2. Start an Android emultator | ||
3. Install the app on the emulator using `dotnet build -t:Install` | ||
2. Open the APK in Android Studio with "Profile or Debug APK" | ||
3. In the "Project" viewer, choose the "cpp" folder, then `libmonosgen-2.0.so` then double-click `libmonosgen-2.0.so` inside the `libmonosgen-2.0.so` folder. | ||
4. In the "Debug Symbols" view click "Add", navigate to the extracted runtime symbols nuget and select `libmonosgen-2.0.so.so` | ||
5. In the "Path Mappings" section, select the toplevel folder and add a Local | ||
Path to a git checkout of the `release/6.0` tree corresponding to the nuget. Click Apply Changes. | ||
6. Start an emulator or connect to a device | ||
7. On the menu bar select "Run > Edit Configurations..." and on the "Debugger" tab make sure the "Debug Type" is something other than "Java Only" | ||
8. Start debugging. | ||
9. You should now have function names, local variables, as well as stepping through the runtime C code. | ||
|
||
Since you're debugging an optimized release build, it is likely the debugger will not be able to materialize every local variable. | ||
|
||
## Native debugging using a local debug build of Mono | ||
|
||
Build the runtime for your android architecture: `ANDROID_NDK_ROOT=<path_to_android_ndk> ./build.sh --os android --arch x86 -c Debug`. See the instructions for [Testing Android](../../testing/libraries/testing-android.md) for details. | ||
|
||
|
||
In the source code for the C# project, add the following to the .csproj (replacing `<RUNTIME_GIT_ROOT>` by the apropriate location): | ||
|
||
``` | ||
<Target Name="UpdateRuntimePack" | ||
AfterTargets="ResolveFrameworkReferences"> | ||
<ItemGroup> | ||
<ResolvedRuntimePack PackageDirectory="<RUNTIME_GIT_ROOT>/artifacts/bin/microsoft.netcore.app.runtime.android-x86/Debug" | ||
Condition="'%(ResolvedRuntimePack.FrameworkName)' == 'Microsoft.NETCore.App'" /> | ||
</ItemGroup> | ||
</Target> | ||
``` | ||
|
||
Then rebuild and reinstall the project, open the apk in Android Studio, and debug. The | ||
runtime native libraries will be stripped, so to make use of debug symbols, you | ||
will need to follow the steps above (rename `*.so.dbg` in the artifacts to | ||
`*.so.so` and add them to the APK project in Android Studio) | ||
|
||
## Native and managed debugging or debugging the managed debugger | ||
|
||
This workflow is useful to look for issues in the debugger itself, or to debug using a mixture of C and C# debugging. | ||
|
||
Install [sdb](https://github.com/mono/sdb). | ||
|
||
Start `sdb` and set it to listen `listen 127.0.0.1 5000` (the port number is up to you). | ||
|
||
Run the following `adb` command to set Mono apps to connect to a debugger on startup: | ||
|
||
``` | ||
$ adb shell setprop debug.mono.extra "debug=10.0.2.2:5000,loglevel=10" | ||
``` | ||
|
||
(`loglevel=10` will produce debugger protocol messages in the `adb` log. If | ||
you're not debugging the debugger it can be omitted. For other debugger | ||
options see [`print_usage()`](https://github.com/dotnet/runtime/blob/main/src/mono/mono/component/debugger-agent.c#L573) in `src/mono/mono/component/debugger-agent.c`) | ||
|
||
Now launch the app from Android Studio. It should run and connect to the debugger. | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters