gpt4 book ai didi

c# - 应用程序立即崩溃,无异常或记录(似乎是 xamarin/mono 错误)

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:59:00 25 4
gpt4 key购买 nike

这是一个奇怪的情况:),我在我的 fragment 中实现了这段代码以在多线程环境中扫描TCP端口,它调试时崩溃 ,有时 在 Release模式下崩溃 也有 thoose 消息:

E/art (12972):检测到嵌套信号 - 报告原始信号

F/art (12972): art/runtime/fault_handler.cc:117] 检查失败:!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 版本(Android 7.1 牛轧糖)

最低 Android 版本:

Android 4.1(API 级别 16 - Jelly Bean)

目标安卓版本:

使用SDK版本编译

更新:

Visual Studio 更新 15.2 (26430.12)Xamarin 4.5.0.476 - 30/05/2017(dd/mm/yyyy ) 应用程序 崩溃 连接到调试器 也...

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_

谢谢大家...

最佳答案

正如您所描述的,它在没有您的那部分代码的情况下也能正常工作……所以错误一定是在您的代码中的某个地方。

让我们看看。

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 的方法,它必须是包含类的一个字段。

如果没有锁,从多个任务/线程访问共享字段绝不是一个好主意。

请尝试使用以下代码(如果您出于某种原因确实需要并行任务)。

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)

关于c# - 应用程序立即崩溃,无异常或记录(似乎是 xamarin/mono 错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44140237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com