如何在Apple的Accelerator代码中调试EXC_BAD_ACCESS?

时间:2014-02-08 00:59:57

标签: ios ipad signal-processing exc-bad-access accelerate-framework

在偶发的情况下,我在Apple的加速器框架方法之一vDSP_fft2d_zip中获得了EXC_BAD_ACCESS(SIGSEV)。崩溃报告为Thread 10提供了以下内容。同样,大部分时间这都像冠军一样。关于如何找到原因并解决问题的任何想法?

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: KERN_INVALID_ADDRESS at 0x412f2740
Triggered by Thread:  10
. . .

Thread 10 Crashed:
0   libvDSP.dylib                   0x2ddfcdb4 ___lldb_unnamed_function431$$libvDSP.dylib + 68
1   libvDSP.dylib                   0x2ddfab66 ___lldb_unnamed_function427$$libvDSP.dylib + 562
2   libvDSP.dylib                   0x2ddfa8ee vDSP_fft2d_zop + 434
3   libvDSP.dylib                   0x2ddfa732 vDSP_fft2d_zip + 18
4   ASSIST for iPad                 0x000ac32e -[Processor setupFilterForBubbleSizeMM:rectWidth:rectImageWidth:dataFilled:dataUnfilled:] (Processor.mm:813)
5   ASSIST for iPad                 0x000af4d2 -[Processor runConvolutionProcessOnImage:aveImage:] (Processor.mm:1835)
6   ASSIST for iPad                 0x000ac5f6 -[Processor processAnswers] (Processor.mm:869)
7   ASSIST for iPad                 0x000ae9cc -[Processor process] (Processor.mm:1644)
8   ASSIST for iPad                 0x000d7744 -[ReallTimeScanner processImage:] (ReallTimeScanner.mm:1046)
9   Foundation                      0x2f296c82 __NSThread__main__ + 1058
10  libsystem_pthread.dylib         0x396b6c1a _pthread_body + 138
11  libsystem_pthread.dylib         0x396b6b8a _pthread_start + 98
12  libsystem_pthread.dylib         0x396b4c8c thread_start + 4

相关代码如下所示:

#define FFT_SIZE 512
#define FFT_POWER 9

dataFilledIn->imagp=(float *) malloc(sizeof(float)*FFT_SIZE*FFT_SIZE);
dataFilledIn->realp=(float *) malloc(sizeof(float)*FFT_SIZE*FFT_SIZE);
dataUnfilledIn->imagp=(float *) malloc(sizeof(float)*FFT_SIZE*FFT_SIZE);
dataUnfilledIn->realp=(float *) malloc(sizeof(float)*FFT_SIZE*FFT_SIZE);

memset(dataFilledIn->imagp, 0, sizeof(float)*FFT_SIZE*FFT_SIZE);
memset(dataFilledIn->realp, 0, sizeof(float)*FFT_SIZE*FFT_SIZE);
memset(dataUnfilledIn->imagp, 0, sizeof(float)*FFT_SIZE*FFT_SIZE);
memset(dataUnfilledIn->realp, 0, sizeof(float)*FFT_SIZE*FFT_SIZE);


for(float y=0; y<FFT_SIZE; y+=0.25)
{
    for(float x=0; x<FFT_SIZE; x+=0.25)
    {
        dataFilledIn->realp[(int)y*FFT_SIZE+(int)x] += 0.0625;
        dataUnfilledIn->realp[(int)y*FFT_SIZE+(int)x] -= 0.0625;
    }
}

vDSP_fft2d_zip(setup, dataFilledIn, 1, 0, FFT_POWER, FFT_POWER, kFFTDirection_Forward);

2 个答案:

答案 0 :(得分:2)

在这里回答我自己的问题:确保在(类型FFTSetup)发送到vDSP_fft2d_zip()的第一个参数被正确初始化,你应该使用这个调用

vDSP_destroy_fftsetup(setup);

清理它。我正在初始化setup var,就像这个

setup = vDSP_create_fftsetup(FFT_POWER, kFFTRadix2);

然后清理它,但在后续调用vDSP_fft2d_zip()之前没有再次初始化它。不幸的是,它很少引起崩溃,这使得它看起来像vDSP_fft2d_zip(setup,...)的频繁调用在它们不工作时正在工作。崩溃是零星的,使真正的原因难以追查。

答案 1 :(得分:0)