일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 프로야구
- mysql
- 뉴스타파
- 타이젠
- 야구
- 데이터베이스
- NC다이노스
- 조세피난처
- python
- Linux
- 문파문파
- ubuntu
- 우분투
- 디자인 패턴
- 문파문파 공략
- 안드로이드
- 인공지능
- 애플
- ubuntu 12.04
- 김경문
- 블로그
- 손민한
- Tizen
- 태그를 입력해 주세요.
- 단통법
- 국정원
- 해외직구
- NC 다이노스
- 리뷰
- arm
- Today
- Total
꿈꾸는 사람.
SkImageDecoder에서 SIGABRT 발생. (메모리 할당 실패) 본문
안드로이드 앱을 개발 중 여러 가지 어려움이 있는데 그 중에서 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
'IT > Android' 카테고리의 다른 글
[Galaxy S5 vs G Pro2] 완벽 스펙, 기능 비교. (2) | 2014.04.01 |
---|---|
[G2 vs G Pro2] 완벽 가격, 스펙 비교. (0) | 2014.03.11 |
ART (Android RunTIme)란 Kitkat의 새로운 런타임. (0) | 2013.11.21 |
[안드로이드 4.4] KitKat 기능과 전망. (0) | 2013.11.14 |
[TI Android GingerBread 2.3.4 DevKit 2.1.1] Build procedure (0) | 2013.11.01 |