Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

Debug apps abort at startup when a debug.mono.env entry is 50+ characters (strings.hh ensure_have_extra)

オープン
#13,142 コメント 1 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

まだ誰も着手していません。

評価

難易度
3/5
見積もり時間
半日
初心者へのやさしさ
45/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
活発
技術スタック
android, cpp
領域
mobile

調査の方向性

Start in src/native/mono/monodroid/monodroid-glue.cc at MonodroidRuntime::set_debug_env_vars (around lines 1010-1020), where each |-separated token is copied into a static_local_string sized by SMALL_STRING_PARSE_BUFFER_LEN, defined in monodroid-glue-internal.hh line 73. Reproduce by setting debug.mono.env to a 50+ character entry on a Debug build and confirm the abort. Done means a long entry no longer aborts the process, for example by using a dynamic string buffer or logging a warning, and the app still starts.

索引モデルが issue の本文から書いたものです。

説明

needs-triage
Android framework version

net10.0-android

Affected platform version

.NET SDK 10.0.401, Microsoft.Android.Sdk 36.1.69 (Mono runtime, Debug configuration)

Description

In a Debug build, if the debug.mono.env system property contains a |-separated entry that is 50 characters or longer, the app aborts at startup, before any managed code runs:

F monodroid: Attempt to store too much data in a buffer (capacity: 61; exceeded by: 1)
F monodroid: Abort at strings.hh:908:5 ('void xamarin::android::string_base<50, xamarin::android::static_local_storage<50>>::ensure_have_extra(size_t) ...')
F libc   : Fatal signal 6 (SIGABRT)

This looks exactly like an app crash. The system property is device-wide and survives uninstall/reinstall, so every Debug .NET Android app on the device keeps dying until the property is cleared.

Root cause (confirmed by code inspection, release/10.0.1xx @ 7d6e309): MonodroidRuntime::set_debug_env_vars splits the property on | and copies each token into a fixed-size buffer:

static_local_string<SMALL_STRING_PARSE_BUFFER_LEN> arg (arg_token.length ());
arg.assign (arg_token.start (), arg_token.length ());

A static_local_string never grows, and assign needs length + 1 bytes (NUL terminator). Any token of 50 or more characters trips ensure_have_extra and aborts the process. The reported "capacity" equals the token length because the buffer is sized to max(50, length), which makes the abort message look nonsensical.

I could not find the equivalent code on current main (CoreCLR host), so this seems specific to the Mono runtime.

Steps to Reproduce

Tested on an x86_64 Android 15 emulator (API 35), with the template app:

  1. dotnet new android -n MonoEnvRepro && cd MonoEnvRepro
  2. Build and install the Debug configuration on the emulator: dotnet build -c Debug -t:Install
  3. Launch it, and confirm it starts (adb shell pidof com.companyname.MonoEnvRepro returns a pid).
  4. Set the property to a value with a 50+ character entry:
    adb shell "setprop debug.mono.env 'CALC_DIAG_DIR=/data/user/0/some.app/files/diagnostics'"
  5. Force-stop and relaunch the app. It aborts immediately with the log above, and pidof returns nothing.
  6. Uninstall and reinstall the app. It still aborts.

Measured threshold (value = K=aaaa... of the given length, single entry): lengths 20, 40, 48 and 49 start fine; lengths 50, 51, 52 and 56 abort. A short value like X=1, and a value with several short entries joined by | (76 chars total, each entry under 50), start fine.

Did you find any workaround?
  • Keep every |-separated entry under 50 characters, for example by using short paths.
  • To recover a device that is stuck, clear the property with an empty value: adb shell 'setprop debug.mono.env ""'. Other "empty-looking" values such as '' did not clear it.
Relevant log output
F monodroid: Attempt to store too much data in a buffer (capacity: 61; exceeded by: 1)
F monodroid: Abort at strings.hh:908:5 ('void xamarin::android::string_base<50, xamarin::android::static_local_storage<50>>::ensure_have_extra(size_t) [MaxStackSize = 50, TStorage = xamarin::android::static_local_storage<50>, TChar = char]')
F libc   : Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 4286 (me.MonoEnvRepro), pid 4286 (me.MonoEnvRepro)

Suggested fix: use a dynamic_local_string (or size the buffer from the token) for arg in set_debug_env_vars, and/or log a warning instead of aborting on an over-long entry.

主要言語
C#
スター
2.1k
フォーク
581
平均マージ
1日 23時間
マージ済み PR(30日)
243

環境構築

  • Dockerfile・Docker Compose ファイルなし
  • プルリクエストのテンプレートあり
  • コントリビューションガイドなし

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

dotnet/android のほかの issue

dotnet/android の issue をすべて見る

似ている issue

C# の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。