반응형
Notice
Recent Posts
Recent Comments
관리 메뉴

꿈꾸는 사람.

SkImageDecoder에서 SIGABRT 발생. (메모리 할당 실패) 본문

IT/Android

SkImageDecoder에서 SIGABRT 발생. (메모리 할당 실패)

현무랑 니니 2014. 3. 5. 00:39
반응형











안드로이드 앱을 개발 중 여러 가지 어려움이 있는데 그 중에서 SIGNAL 오류가 발생할 때 이다.

안드로이드 앱은 JAVA로 개발하기 때문에 SIGNAL 오류는 JVM에서 사용되는 SIGNAL을 사용하게 된다.


1. SIGNAL 종류

시그널 이름

시그널 종류

설명

SIGHUP (1)

Interrupt

종료. JVM 정상적으로 종료한다.

SIGINT (2)

Interrupt

Interactive attention (CTRL-C). JVM exits normally.

SIGQUIT (3)

Control

터미널에 대한 종료 시그널로  Javadump 발생시킨다

SIGILL (4)

Exception

잘못된 명령. (알려지지 않은 기계어를 호출할 발생한다.)

SIGTRAP (5)

Control

JIT 사용한다.

SIGABRT (6)

Error

비정상적인 종료. JVM 오류를 발견 때마다 JVM   발생시키는 시그널이다.

SIGBUS (7)

Exception

메모리에 대한 잘못된 액세스. (data misalignment)

SIGFPE (8)

Exception

부동 소수점 예외. (divide by zero)

SIGSEGV (11)

Exception

메모리에 대한 잘못된 접근.
(
액세스할 없는 메모리에 쓰려고 .)

SIGTERM (15)

Interrupt

종료 요청.  JVM 정상 종료한다.

__SIGRTMAX - 2

Control

SDK 사용.

SIGCHLD (17)

Control

내부 제어용으로 SDK 사용.


2. SIGABRT

크게 두 가지 경우가 있다.

1. 메모리 할당이 안 된 메모리에 접근.

- 주로 malloc이 안되어 발생한다.

2. 예외 처리를 위해 정상적으로 사용하는 경우.

- 이 경우는 crash가 아니라 예외 처리로 발생하는 것이다. 응용 프로그램이 시스템에 잘못된 데이터를 전달하여 계속 진행할 수 없을 때 응용 프로그램을 죽이는 것이다.

즉, 디버그 메시지를 발생하는 것이다.


3. SIGABRT 예제.

SkImageDecoder에서 SIGABRT


재현 경로:

1. 큰 BMP 파일을 폰에 저장.

2. 여려 BMP 이미지를 갤러리에서 메시지로 공유.

3. 충돌 발생.


  • 근본 원인:

메모리 할당에 실패할 때 sk_malloc_flags, sk_realloc가 abort()를 호출하여 발생한다.

충돌이 일어난 지점을 backtrace 추적할 수 있다.


아래 backtrace 처럼 이메일, 갤러리 등에서 SKIA를 통한 이미지 디코딩 과정에서 메모리 할당이 안되어 오류가 발생한 것을 알 수 있다.

Backtrace:
I DEBUG   : backtrace:
I DEBUG   :     #00  pc 00021fcc  /system/lib/libc.so (tgkill+12)
I DEBUG   :     #01  pc 00013021  /system/lib/libc.so (pthread_kill+48)
I DEBUG   :     #02  pc 00013235  /system/lib/libc.so (raise+10)
I DEBUG   :     #03  pc 00011f6b  /system/lib/libc.so
I DEBUG   :     #04  pc 00021880  /system/lib/libc.so (abort+4)
I DEBUG   :     #05  pc 0010a4df  /system/lib/libskia.so (sk_malloc_flags(unsigned int, unsigned int)+14)
I DEBUG   :     #06  pc 000f1865  /system/lib/libskia.so (CopyStreamToStorage(SkAutoMalloc*, SkStream*)+168)
I DEBUG   :     #07  pc 000eb78d  /system/lib/libskia.so (SkBMPImageDecoder::onDecode(SkStream*, SkBitmap*, SkImageDecoder::Mode)+20)
I DEBUG   :     #08  pc 000eb2d1  /system/lib/libskia.so (SkImageDecoder::decode(SkStream*, SkBitmap*, SkBitmap::Config, SkImageDecoder::Mode)+36)
I DEBUG   :     #09  pc 00076a15  /system/lib/libandroid_runtime.so
I DEBUG   :     #10  pc 00076ca3  /system/lib/libandroid_runtime.so

I DEBUG   : backtrace:
I DEBUG   :     #00  pc 0002215c  /system/lib/libc.so (tgkill+12)
I DEBUG   :     #01  pc 000131b1  /system/lib/libc.so (pthread_kill+48)
I DEBUG   :     #02  pc 000133c5  /system/lib/libc.so (raise+10)
I DEBUG   :     #03  pc 000120fb  /system/lib/libc.so
I DEBUG   :     #04  pc 00021a10  /system/lib/libc.so (abort+4)
I DEBUG   :     #05  pc 0010f69b  /system/lib/libskia.so (sk_realloc_throw(void*, unsigned int)+12)
I DEBUG   :     #06  pc 000f074f  /system/lib/libskia.so
I DEBUG   :     #07  pc 000efd11  /system/lib/libskia.so (image_codec::BmpDecoderHelper::DecodeImage(char const*, int, int, image_codec::BmpDecoderCallback*)+724)
I DEBUG   :     #08  pc 000f0835  /system/lib/libskia.so (SkBMPImageDecoder::onDecode(SkStream*, SkBitmap*, SkImageDecoder::Mode)+80)
I DEBUG   :     #09  pc 000f033d  /system/lib/libskia.so (SkImageDecoder::decode(SkStream*, SkBitmap*, SkBitmap::Config, SkImageDecoder::Mode)+36)
I DEBUG   :     #10  pc 0007eebd  /system/lib/libandroid_runtime.so
I DEBUG   :     #11  pc 0007f163  /system/lib/libandroid_runtime.so


반응형
Comments