va_list在64位模拟器上崩溃

时间:2014-05-23 15:40:14

标签: ios nsstring 64-bit ios-simulator exc-bad-access

当使用64位iOS模拟器时,下面的init函数会因EXC_BAD_ACCESS(code = 1)错误而崩溃。谁会知道为什么?以及如何正确修复它。

有关信息:'格式'不是零,它可以在32位模拟器和任何32/64位iPhone / iPad设备上正常工作。

void Log (NSString * format, ...)
{
   va_list argList;
   va_start(argList, format);
   NSLogv(format, argList);
   NSString* string = [[NSString alloc] initWithFormat: format arguments: argList];
   va_end(argList);

...
}

在AppDelegate中首先调用了

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
   Log(@"app options %@", launchOptions);
   ...
}

2 个答案:

答案 0 :(得分:11)

不知何故A-Live评论给了我一个想法,我发现了如何避免崩溃。

我在同一个va_start / va_end块中使用argList两次

[[NSString alloc] initWithFormat: format arguments: argList];

NSLogv(format, argList);

似乎iOS 64位模拟器并不喜欢它。不知道为什么它只能在任何其他平板电脑(以及真实设备)中找到它。所以我通过制作两个不同的bock来修复它

va_list argList;

va_start(argList, format);
NSString* string = [[NSString alloc] initWithFormat: format arguments: argList];
va_end(argList);

va_start(argList, format);
NSLogv(format, argList);
va_end(argList);

希望它会帮助某人。 如果有人知道原因,我仍然很想知道它。

答案 1 :(得分:1)

昨晚我也遇到了这个问题。我为此提交了雷达。

我现在的工作是制作一个va_copy:

    NSString *description = nil;
    va_list vaListCopy;

    va_copy(vaListCopy, arguments);

    if (format) {
        description = [[NSString alloc] initWithFormat:format arguments:vaListCopy];
    }

然后我打电话给下一个方法

    [[BKAssertRecordHandler currentHandler] recordFailureWithCondition:condition function:function file:file line:line description:format arguments:arguments backtrace:backtrace];

换句话说,我在本地使用副本。 我做了一些实验。我制作了一份副本,如果是va_list,然后将其与原版进行比较,原版之后就这样使用了。

    description = [[NSString alloc] initWithFormat:format arguments:arguments];

字节比较期间的输出:索引8处的不匹配(orig = 0xd8 copy = 0xe0)。在通话之前,我也进行了字节比较,它们是相同的。

因此无论出于何种原因,在64位模拟器上,initWithFormat:arguments和NSLogv都会破坏va_list。