signal 7 (SIGBUS), code 1 (BUS_ADRALN) 오류
프로그램을 실행하다 보면 해당 에러가 나오는 경우가 존재한다.
window에서는 32bit, 64bit 문제 없이 잘 돌아가는게 arm processer에서만 죽는 현상이다.
해당 문제는 64bit로 빌드하면 멀쩡하게 돌아가던게 32bit로 빌드한걸 실행했을 때만 문제가 발생한다.
에러난 곳을 살펴보면 struct 안에 존재하는 변수의 레퍼런스에 접근할 때 죽는 것을 확인할 수 있다.
일반적으로 struct를 사용할 때 pragma pack을 활용을 많이 한다. 해당 기능의 활용이 문제를 야기하는 것 같다.
예를 들어 아래와 같은 상황을 보면
#pragma pack(push, 1)
struct STemp
{
int8 a;
int16 b;
int32 c;
};
#pragma pack(pop)
static void get_value( int16 *p_value)
{
char str[] = "9999.999";
*p_value = atoi( str); // <-- 에러가 발생하는 위치
}
static void get_value( int32 *p_value)
{
char str[] = "9999.999";
*p_value = atoi( str); // <-- 에러가 발생하는 위치
}
int main( int argc, char *argv[])
{
STemp sData;
get_value( &sData.b); // <--- 정상 실행
return 0;
}
int main( int argc, char *argv[])
{
STemp sData;
get_value( &sData.b);
get_value( &sData.c); // <--- error
return 0;
}
위와 같은 결과가 나오는데 아래처럼 직접 값을 입력하면 크래시는 안난다;;
*p_value = 99.99;
결론
- 해당 오류 발생하면 pragma pack 사용하지말고 패킷을 serialize해서 전송하는 방식으로 수정하자
참고
https://decdream.tistory.com/491