c# - studio - App Crash al instante sin excepción o registro(parece un error xamarin/mono)
visual studio app center (4)
Es una situación extraña aquí :), he implementado este código en mi fragmento para escanear TCP Ports
en un multithread environment
, se crash when debugging
y, a veces crash in release mode
también se cuelga crash in release mode
con estos mensajes:
E/art (12972): Nested signal detected - original signal being reported
F/art (12972): art/runtime/fault_handler.cc:117] Check failed: !initialized_
Intentó configurar Target
Android to 23
que no funcionó.intentado ejecutar
adb shell setprop debug.mono.env MONO_DEBUG=soft-breakpoints
que no funcionaron.intentado compilar usando diferentes
Android API''s Versions
CUALQUIER IDEA ¿POR QUÉ ESTÁ SUCEDIENDO?
AQUÍ ES MI CÓDIGO:
public void start()
{
for (int i = 0; i < 50; i++)
{
Task.Run(() => RunScanTcp());
//ThreadPool.QueueUserWorkItem(RunScanTcp);
//Thread thread = new Thread(new ThreadStart(RunScanTcp));
//thread.Start();
}
}
public void RunScanTcp()
{
while (abort != true)
{
port = port + 1;
Log.Info("PORT SCANNER", port.ToString());
}
}
public class PortList
{
private int start;
private int stop;
private int ports;
private static readonly object _syncRoot = new object();
public PortList(int starts, int stops)
{
start = starts;
stop = stops;
ports = start;
}
public bool MorePorts()
{
lock (_syncRoot)
{
return (stop - ports) >= 0;
}
}
public int NextPort()
{
lock (_syncRoot)
{
if (MorePorts())
{
return ports++;
}
return -1;
}
}
}
Estoy compilando usando:
Android Version (Android 7.1 Nougat)
Versión mínima de Android:
Android 4.1 (API Level 16 - Jelly Bean)
Target versión de Android:
Compile Using SDK Version
ACTUALIZAR:
Después de Visual Studio Update 15.2 (26430.12)
y Xamarin 4.5.0.476
- 30/05/2017
(dd / mm / aaaa), la aplicación se crashed
mientras estaba connected to debugger
también ...
Aquí está la salida del depurador:
referenceTable GDEF length=814 1
referenceTable GSUB length=11364 1
referenceTable GPOS length=47302 1
referenceTable head length=54 1
referenceTable GDEF length=428 1
referenceTable GSUB length=2302 1
referenceTable GPOS length=43252 1
referenceTable head length=54 1
referenceTable GDEF length=808 1
referenceTable GSUB length=11364 1
referenceTable GPOS length=49128 1
referenceTable head length=54 1
referenceTable GDEF length=808 1
referenceTable GSUB length=11364 1
referenceTable GPOS length=47320 1
referenceTable head length=54 1
05-31 04:31:51.590 F/art (17427): art/runtime/fault_handler.cc:117] Check failed: !initialized_
Gracias a todos ...
Para que el archivo apk funcione en otros dispositivos que no estén conectados a la depuración de USB, debe publicar el archivo APK firmado y distribuirlo, consulte el siguiente enlace: https://developer.xamarin.com/guides/android/deployment,_testing,_and_metrics/ publishing_an_application / part_1 _-_ preparation_an_application_for_release /
Así que me encontré con un problema así con Xamarin y VS. resulta que no todos los errores se registran en la consola de depuración de VS, pero están en el registro del dispositivo. Lo que tenía que hacer esa vez era ir y usar el emulador en mi máquina y ejecutarlo mientras el dispositivo iniciaba sesión. y detuvo el registro justo después del bloqueo. En ese registro estaba claro cuál era el problema (que en mi caso era un permiso mal configurado). Espero que ayude.
Como describió, funciona sin esa parte del código ... por lo que el error debe estar en algún lugar de su código.
Echemos un vistazo.
public void start()
{
for (int i = 0; i < 50; i++)
{
Task.Run(() => RunScanTcp());
}
}
public void RunScanTcp()
{
while (abort != true)
{
port = port + 1;
Log.Info("PORT SCANNER", port.ToString());
}
}
En el método de start
, inicia 50 tareas, y no await
ninguna, lo que significa que posiblemente todas las tareas se ejecutan en paralelo (al menos definitivamente algunas tareas intentan acceder al port
al mismo tiempo).
Lo que esas tareas ejecutan es un método que accede al port
que debe ser un campo de la clase contenedora.
El acceso a un campo compartido desde múltiples tareas / hilos nunca es una buena idea sin un bloqueo.
Intenta usar el siguiente código (si realmente necesitas las tareas paralelas por algún motivo).
public class YourClass
{
private bool abort;
private int port;
private object portLock = new object();
public void start()
{
for (int i = 0; i < 50; i++)
{
Task.Run(() => RunScanTcp());
}
}
public void RunScanTcp()
{
while (abort != true && this.port < int.MaxValue)
{
lock (this.portLock) {
port = port + 1;
Log.Info("PORT SCANNER", port.ToString());
}
}
}
}
Posiblemente un mejor enfoque es usar solo una tarea y en algún lugar await
.
public class YourClass
{
private bool abort;
private int port;
private object portLock = new object();
public Task start()
{
return Task.Run(() => RunScanTcp());
}
public void RunScanTcp()
{
lock (this.portLock) {
while (abort != true && this.port < int.MaxValue)
{
port = port + 1;
Log.Info("PORT SCANNER", port.ToString());
}
}
}
}
Si eso resuelve su problema actual, puede agregar otra pregunta sobre cómo resolver correctamente lo que realmente está tratando de resolver (ya que su código actual simplemente incrementa el port
hasta que se interrumpe o la aplicación falla (ya que contó arriba del Int32
MaxValue)
El problema parece estar en la xamarin.android platform
porque después de la última actualización 6/9/2017
Visual Studio 2017 version 15.2 (26430.13)
ya no se Visual Studio 2017 version 15.2 (26430.13)
... de todas formas gracias por su tiempo ... Este error ocurre cuando se intenta crear (n ) número de hilos / tarea ...