मैं गिफ्ट बनाने के लिए कुछ मूल कोड का उपयोग करने की कोशिश कर रहा हूं। मैं पेंट का उपयोग करके छवियों को खींचता हूं, कुछ स्ट्रोक बना रहा हूं, सहेजने पर क्लिक करता हूं और खींची गई छवि को जेपीजी प्रारूप में सहेजा जाता है। जब मैं GIF बनाने पर क्लिक करता हूं तो यह सभी छवियों को लेता है और एक gif बनाने शुरू करता है। यह तब होता है जब मुझे घातक सिग्नल 11 मिलता है और ऐप पुनरारंभ होता है।गिफलेन घातक सिग्नल 11
मैं मूल कोड उपयोग करती हैं इसलिए मैं दुर्घटना के एक पश्व-अनुरेखन है:
I/DEBUG(95): backtrace:
I/DEBUG(95): #00 pc 00002a04 /lib/libgifflen.so (NeuQuant::learn()+239)
I/DEBUG(95): #01 pc 00002b9d /lib/libgifflen.so (NeuQuant::quantise(DIB*, DIB*, int, int, int)+84)
I/DEBUG(95): #02 pc 00002d41 lib/libgifflen.so (Java_com_stay_gif_GifEncoder_addFrame+208)
I/DEBUG(95): #03 pc 0001deb0 /system/lib/libdvm.so (dvmPlatformInvoke+112)
I/DEBUG(95): #04 pc 0004d103 /system/lib/libdvm.so (dvmCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+394)
I/DEBUG(95): #05 pc 0004f21f /system/lib/libdvm.so (dvmResolveNativeMethod(unsigned int const*, JValue*, Method const*, Thread*)+174)
I/DEBUG(95): #06 pc 000272e0 /system/lib/libdvm.so
I/DEBUG(95): #07 pc 0002bbe8 /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+180)
I/DEBUG(95): #08 pc 0005fb37 /system/lib/libdvm.so (dvmInvokeMethod(Object*, Method const*, ArrayObject*, ArrayObject*, ClassObject*, bool)+374)
I/DEBUG(95): #09 pc 000670e5 /system/lib/libdvm.so
I/DEBUG(95): #10 pc 000272e0 /system/lib/libdvm.so
I/DEBUG(95): #11 pc 0002bbe8 /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+180)
I/DEBUG(95): #12 pc 0005f871 /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+272)
I/DEBUG(95): #13 pc 000496f3 /system/lib/libdvm.so
I/DEBUG(95): #14 pc 00048581 /system/lib/libandroid_runtime.so
I/DEBUG(95): #15 pc 00049637 /system/lib/libandroid_runtime.so (android::AndroidRuntime::start(char const*, char const*)+390)
I/DEBUG(95): #16 pc 00000dcf /system/bin/app_process
कोड जहां यह दुर्घटनाओं:
void NeuQuant::learn()
{
int i,j,b,g,r;
int radius,rad,alpha,step,delta,samplepixels;
//unsigned char *p;
int *p;
unsigned char *lim;
alphadec = 30 + ((samplefac-1)/3);
p = (int*)thepicture;
lim = thepicture + lengthcount;
samplepixels = lengthcount/samplefac;
delta = samplepixels/ncycles;
alpha = initalpha;
radius = initradius;
rad = radius >> radiusbiasshift;
if (rad <= 1) rad = 0;
for (i=0; i<rad; i++)
radpower[i] = alpha*(((rad*rad - i*i)*radbias)/(rad*rad));
//fprintf(stderr,"beginning 1D learning: initial radius=%d\n", rad);
sprintf(s, "samplepixels = %d, rad = %d, a=%d, ad=%d, d=%d", samplepixels, rad, alpha, alphadec, delta);
__android_log_write(ANDROID_LOG_VERBOSE, "gifflen",s);
if ((lengthcount%prime1) != 0) step = prime1;
else {
if ((lengthcount%prime2) !=0) step = prime2;
else {
if ((lengthcount%prime3) !=0) step = prime3;
else step = prime4;
}
}
i = 0;
while (i < samplepixels)
{
/* b = p[0] << netbiasshift;
g = p[1] << netbiasshift;
r = p[2] << netbiasshift;*/
b = (((*p)) & 0xff) << netbiasshift;
g = (((*p) >> 8) & 0xff) << netbiasshift;
r = (((*p) >> 16) & 0xff) << netbiasshift;
j = contest(b, g, r);
altersingle(alpha,j,b,g,r); //these crashes
if (rad) alterneigh(rad,j,b,g,r); // alter neighbours
p += step;
if (p >= (int *)lim) p -= lengthcount;
i++;
if (i%delta == 0)
{
alpha -= alpha/alphadec;
radius -= radius/radiusdec;
rad = radius >> radiusbiasshift;
if (rad <= 1) rad = 0;
for (j=0; j<rad; j++)
radpower[j] = alpha*(((rad*rad - j*j)*radbias)/(rad*rad));
}
}
//sprintf(s, "final alpha = %f", ((float)alpha)/initalpha);
// __android_log_write(ANDROID_LOG_VERBOSE, "gifflen",s);
}
लॉग करने के लिए Thx मुझे पता चला कि त्रुटि NeuQuant में क्या होता है :: सीखें(), कुछ डीबग किया और यह इस सटीक रेखा बी = (((* पी)) & 0xff) < < netbiasshift;
The Crash does not को हमेशा होता है, कभी कभी मैं एक gif हो और सब कुछ काम करता है, लेकिन कभी कभी यह ख = (((* पी)) & 0xff) < < netbiasshift पर दुर्घटनाओं ;.
मैंने कुछ और डीबगिंग किया और मुझे पता चला कि जब यह बी = (((* पी)) & 0xff पर क्रैश होता है) < < netbiasshift; जब यह पहली बार प्रवेश करता है तो यह क्रैश नहीं होता है, यह बी = (((* पी) के 30 चेक के बाद दुर्घटनाग्रस्त हो जाता है) & 0xff) < < netbiasshift ;.
कोई भी जानता है कि समस्या क्या हो सकती है?
शायद 'पी' एक अमान्य संदर्भ बन जाता है, जिससे आपके सूचक अंकगणित के कारण सेगमेंटेशन गलती हो जाती है। – auselen
मैं इसे कैसे ठीक कर सकता हूं? क्या "पी" जांचने का कोई तरीका है और यदि अमान्य स्टॉप या ऐसा कुछ है? –