Tôi đang cố gắng sử dụng một số Mã gốc để tạo Gifs. Tôi vẽ hình ảnh bằng sơn, tạo một vài nét, nhấp vào lưu và hình ảnh được vẽ sẽ được lưu vào định dạng JPG. khi tôi nhấp vào tạo Gif, nó sẽ chụp tất cả hình ảnh và bắt đầu tạo gif. Đây là khi tôi nhận được tín hiệu Fatal 11 và ứng dụng khởi động lại.Gifflen Fatal Signal 11
tôi sử dụng mã gốc vì vậy tôi có một vết lùi của vụ tai nạn:
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
Mã, nơi nó bị treo:
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 để Log tôi phát hiện ra rằng các lỗi xảy ra trong NeuQuant :: học(), đã làm một số debugs và nó bị treo trên đường dây này chính xác b = (((* p)) & 0xff) < < netbiasshift ;.
Sự cố không xảy ra luôn, đôi khi tôi nhận được gif và mọi thứ hoạt động, nhưng đôi khi nó bị lỗi tại b = (((* p)) & 0xff) < < netbiasshift ;.
Tôi đã thực hiện một số sửa lỗi khác và tôi phát hiện ra rằng khi nó gặp sự cố trên b = (((* p)) & 0xff) < < netbiasshift; nó không sụp đổ khi nó đi vào lần đầu tiên, nó bị treo như sau 30 séc của b = (((* p)) & 0xff) < < netbiasshift ;.
Bất cứ ai biết những gì có thể là vấn đề?
Có lẽ 'p' trở thành tham chiếu không hợp lệ, dẫn đến lỗi phân đoạn do số học con trỏ của bạn. – auselen
Làm cách nào để khắc phục sự cố này? Có cách nào để kiểm tra "p" và nếu dừng không hợp lệ hoặc một cái gì đó như thế? –