Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective-C-如何强制iOS模拟器内存不足_Ios_Memory - Fatal编程技术网

Objective-C-如何强制iOS模拟器内存不足

Objective-C-如何强制iOS模拟器内存不足,ios,memory,Ios,Memory,我有一个错误,一些用户的设备内存不足时,会出现EXC\u BAD\u ACCESS。堆栈跟踪指向下面的if行,我相信这是因为UTF8String被释放并仍在使用: dispatch_sync(dbQueue, ^{ if (sqlite3_bind_text(sql_stmt, 1, pid.UTF8String, -1, SQLITE_STATIC) != SQLITE_OK) { ... 我很难重现我这方面的问题,如何在模拟器或设备上强制或模拟内存不足 更新: 我尝试在上面的行中添

我有一个错误,一些用户的设备内存不足时,会出现
EXC\u BAD\u ACCESS
。堆栈跟踪指向下面的
if
行,我相信这是因为UTF8String被释放并仍在使用:

dispatch_sync(dbQueue, ^{
    if (sqlite3_bind_text(sql_stmt, 1, pid.UTF8String, -1, SQLITE_STATIC) != SQLITE_OK) {
...
我很难重现我这方面的问题,如何在模拟器或设备上强制或模拟内存不足

更新:


我尝试在上面的行中添加一个断点,然后使用选项Simulator->Simulate Memory Warning,但仍然无法重现EXC\u BAD\u访问错误。

在Simulator的菜单中:硬件->Simulate Memory Warning

更新

如果您确定应用程序在sqlite3_bind_text上崩溃,我想最可能的问题可能是pid.UTF8String有时为NULL,在这种情况下会导致崩溃。此外,使用时不太可能释放pid或pid.UTF8String,您可以检查崩溃报告(如果有)并检查导致EXC\u BAD\u访问的内存地址,例如,如果您有
EXC\u BAD\u访问代码=2地址=0x00000000
,这意味着pid.UTF8String确实是一个空指针,如果地址不是0x0,那么这是另一个问题(在您的情况下不太可能)

作为建议,请在代码中添加零检查:

if (pid) {
    if (sqlite3_bind_text(sql_stmt, 1, pid.UTF8String, -1, SQLITE_STATIC) != SQLITE_OK){
    // do your stuff
    }
} else {
    sqlite3_bind_null(sql_stmt,1);
}

在模拟器中有一个菜单项:硬件:模拟内存警告


shiftcommandM

在Xcode屏幕的左侧,您可以看到打开调试导航器的按钮,在那里您可以看到应用程序当前使用的内存量以及可用的内存量

如果你分析它,你会发现你的模拟器的可用内存和你的计算机的内存是一样的,所以我建议你运行一些应用程序,在模拟器的同时使用大量内存


如果你有一台iPad,这可能会更容易,我通常做的是继续这样做,并尽可能多地复制unicode表,这样它会被存储在粘贴板上很多次,这些类型的错误是环境“完美风暴”的结果(即竞争条件、在“正确”的时间运行的不频繁任务等),通常是你无法预料的情况;如果你知道如何可靠地复制它,你可能也知道如何修复它。下一个最好的方法是尝试增加在环境(调试器)中复制它的统计概率,在这个环境中,您有希望了解正在发生的事情

请参阅此帖子:。通过以编程方式模拟内存警告,您可以(例如)使用一个重复计时器以每秒1次的速度发出内存警告(比这快得多,您可能会遇到其他问题,这将使您更容易追根究底,而不是解决原始问题),无需手动重复执行

在实际运行测试之前,还可以在以下位置设置断点:

Symbol                                        Module
======                                        ======
objc_exception_throw                          libobjc.A.dylib
-[NSException raise]                          CoreFoundation
此外,在所有Objective-C异常上设置断点。设置断点将允许您在运行时实际引发异常之前检查内存内容,这将使您有更好的机会了解问题发生时的情况。当(如果)捕获崩溃时,请检查
pid
pid.UTF8String
sql\u stmt
,因为它们看起来是最可能的罪魁祸首


运行应用程序并启动计时器。这不一定或直接导致您正在寻找的崩溃,但它可能会使它更可能随着时间的推移而发生,而无需手动操作;您可以启动计时器并等待(即做一些更有效率的事情),直到您真正看到崩溃。

据我所知,该选项只会发出警告,并调用类似于
didReceiveMemoryWarning
的方法,但它是否也会重现与内存不足的设备相同的行为?感谢链接@MaxvonHippel!我尝试使用此选项并更新了问题,但仍然无法重现EXC_BAD_ACCESS errorSimulate Memory警告不会导致内存分配失败,并且可能不会帮助您跟踪内存问题