如何调试核心映像内核中的语法错误



编写新的Core Image过滤器时,您需要使用Core Image Kernel Language编写内核,这是一种轻度变异的OpenGL着色器语言。你在运行时用这样的东西编译这些...

NSString *myCode = ...
NSArray *kernels = [CIKernel kernelsWithString:myCode];

问题是任何语法错误,你只是得到一个nil而不是一个数组。记录的 API 未建议获取诊断信息的机制。

如果您按照 Apple 文档中的建议在 Quartz Composer 中使用过滤器,您会注意到它可以为您提供语法错误信息。(这仅适用于简单的筛选器。

那么,如何获取错误的内核源文件的诊断信息?

更新:根据具体情况,您可能会在主机上获得格式化行。如果你很幸运,那么你不必担心这一点,只需寻找这样的行:

8: error: in function kernel vec4 clipDetection (uniform in sampler, uniform in float)
8: error: unknown variable name: gratuitous

当然,如果您仍然需要掌握信息...

如果你在 CIKernel 类上使用内省,你会发现一个 kernelsWithString:messageLog: 方法。它没有公共接口,但不要让它阻止你......

NSString *myCode = ...
NSMutableArray *messageLog = [NSMutableArray array];
NSArray *kernels = [[CIKernel class] performSelector:@selector(kernelsWithString:messageLog:) withObject:myCode withObject:messageLog];
if ( messageLog.count > 0) NSLog(@"Error: %@", messageLog.description);

messageLog 参数希望成为一个可变数组。如果出现错误,它将在其中放入一些字典。这些内容在互联网上无处可见,但它们看起来像这样(在我向内核源代码添加"无端错误"的情况下)......

2012-12-06 17:56:53.077 MyProgram[14334:303] Error: (
        {
        CIKernelMessageDescription = "kernel vec4 clipDetection (uniform in sampler, uniform in float)";
        CIKernelMessageLineNumber = 8;
        CIKernelMessageType = CIKernelMessageTypeFunctionName;
    },
        {
        CIKernelMessageDescription = "unknown variable name: gratuitous";
        CIKernelMessageLineNumber = 8;
        CIKernelMessageType = CIKernelMessageTypeError;
    }
)

与往常一样,请三思而后行,将其保留在交付代码中。它是没有记录的,苹果可以随时对它做任何事情。他们甚至可能,你知道,记录下来。

最新更新