应用程序立即崩溃,无异常或记录(似乎 xamarin/mono 错误)
App Crash instantly without exception or log (seems like xamarin/mono bug)
这里的情况很奇怪:),我已经在我的片段中实现了这段代码来扫描 multithread environment
中的 TCP Ports
,它是 crash when debugging
,有时也是 crash in release mode
带有这些消息:
E/art (12972): Nested signal detected - original signal being reported
F/art (12972): art/runtime/fault_handler.cc:117] Check failed: !initialized_
tried to set Target Android to 23
that didn’t work.
tried running adb shell setprop debug.mono.env
MONO_DEBUG=soft-breakpoints
that didn’t work.
tried to compile using different Android API's Versions
知道为什么会这样吗??
HERE IS MY CODE:
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;
}
}
}
我正在编译使用:
Android Version (Android 7.1 Nougat)
最低 Android 版本:
Android 4.1 (API Level 16 - Jelly Bean)
目标Android版本:
Compile Using SDK Version
更新:
在 Visual Studio Update 15.2 (26430.12)
和 Xamarin 4.5.0.476
- 30/05/2017
(dd/mm/yyyy) 之后,应用程序 crashed
也是 connected to debugger
...
Here is the debugger output :
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_
谢谢大家...
要使 apk 文件在连接 USB 调试以外的其他设备上运行,您需要发布签名的 APK 文件并分发它,请检查以下内容 link:
https://developer.xamarin.com/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/
所以我遇到了与 Xamarin 和 VS 类似的问题。事实证明,并非所有错误都记录到 VS 调试控制台中,但它们都在设备日志中。那次我必须做的是在我的机器上使用模拟器,然后 运行 它同时让设备登录。并在崩溃后立即停止记录。在该日志中很清楚问题出在哪里(在我的例子中是错误配置的权限)。希望对您有所帮助。
正如您所描述的那样,它在没有您的那部分代码的情况下也能正常工作...所以错误一定是在您的代码中的某个地方。
一起来看看吧
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());
}
}
在 start
方法中,您启动 50 个任务 - 而不是 await
中的任何一个 - 这意味着,可能所有任务 运行 并行(至少 绝对一些任务尝试同时访问port
)。
那些任务执行的是一个访问 port
的方法,它必须是包含 class 的字段。
在没有锁的情况下从多个任务/线程访问共享字段从来都不是一个好主意。
请尝试使用以下代码(如果您出于某种原因确实需要并行任务)。
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());
}
}
}
}
可能更好的方法是只使用一个任务并在某处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());
}
}
}
}
如果这解决了您当前的问题,您可能想添加另一个关于如何正确解决您实际尝试解决的问题的问题(因为您当前的代码基本上只是递增 port
直到它被中止或应用程序崩溃(因为它计算在 Int32
MaxValue 以上)
问题似乎出在 xamarin.android platform
因为在上次更新后 6/9/2017
Visual Studio 2017 version 15.2 (26430.13)
它不再崩溃了......无论如何感谢你的时间.. 这个错误发生在尝试时创建 (n) 个 threads/task ...
这里的情况很奇怪:),我已经在我的片段中实现了这段代码来扫描 multithread environment
中的 TCP Ports
,它是 crash when debugging
,有时也是 crash in release mode
带有这些消息:
E/art (12972): Nested signal detected - original signal being reported
F/art (12972): art/runtime/fault_handler.cc:117] Check failed: !initialized_
tried to set Target
Android to 23
that didn’t work.tried running
adb shell setprop debug.mono.env MONO_DEBUG=soft-breakpoints
that didn’t work.tried to compile using different
Android API's Versions
知道为什么会这样吗??
HERE IS MY CODE:
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;
}
}
}
我正在编译使用:
Android Version (Android 7.1 Nougat)
最低 Android 版本:
Android 4.1 (API Level 16 - Jelly Bean)
目标Android版本:
Compile Using SDK Version
更新:
在 Visual Studio Update 15.2 (26430.12)
和 Xamarin 4.5.0.476
- 30/05/2017
(dd/mm/yyyy) 之后,应用程序 crashed
也是 connected to debugger
...
Here is the debugger output :
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_
谢谢大家...
要使 apk 文件在连接 USB 调试以外的其他设备上运行,您需要发布签名的 APK 文件并分发它,请检查以下内容 link: https://developer.xamarin.com/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/
所以我遇到了与 Xamarin 和 VS 类似的问题。事实证明,并非所有错误都记录到 VS 调试控制台中,但它们都在设备日志中。那次我必须做的是在我的机器上使用模拟器,然后 运行 它同时让设备登录。并在崩溃后立即停止记录。在该日志中很清楚问题出在哪里(在我的例子中是错误配置的权限)。希望对您有所帮助。
正如您所描述的那样,它在没有您的那部分代码的情况下也能正常工作...所以错误一定是在您的代码中的某个地方。
一起来看看吧
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());
}
}
在 start
方法中,您启动 50 个任务 - 而不是 await
中的任何一个 - 这意味着,可能所有任务 运行 并行(至少 绝对一些任务尝试同时访问port
)。
那些任务执行的是一个访问 port
的方法,它必须是包含 class 的字段。
在没有锁的情况下从多个任务/线程访问共享字段从来都不是一个好主意。
请尝试使用以下代码(如果您出于某种原因确实需要并行任务)。
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());
}
}
}
}
可能更好的方法是只使用一个任务并在某处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());
}
}
}
}
如果这解决了您当前的问题,您可能想添加另一个关于如何正确解决您实际尝试解决的问题的问题(因为您当前的代码基本上只是递增 port
直到它被中止或应用程序崩溃(因为它计算在 Int32
MaxValue 以上)
问题似乎出在 xamarin.android platform
因为在上次更新后 6/9/2017
Visual Studio 2017 version 15.2 (26430.13)
它不再崩溃了......无论如何感谢你的时间.. 这个错误发生在尝试时创建 (n) 个 threads/task ...