processor) bus error - A fatal failure in the execution of a machine language instruction resulting from the processor detecting an anomalous condition on its bus. Such conditions include invalid address alignment (accessing a multi-byte number at an odd address), accessing a physical address that does not correspond to any device, or some other device-specific hardware error. A bus error triggers a processor-level exception which Unix translates into a "SIGBUS" signal which, if not caught, will terminate the current process.
예전에 어디선가 bus error에 대한 Q&A를 본듯 한데 기억이 나질 않아
구글에 입력하여 적당한 오류를 찾았으나,
문제 해결에 큰 도움이 되지 않을듯 하옵니다.
Tony 님의 말씀처럼 bus error 라면 structure의 alignment 를 먼저 의심해보시는 것이 좋습니다. grep struct 로 찾아보시고 char 나 short 를 int (보통 4바이트 또는 머신에 해당되는 alignment 단위)로 바꾸어주시면 대부분 해결되리라 생각합니다. 물론 데이터형의 변환에 따른 데이터값에 대해서도 이곳 저곳 신경을 써주셔야 로직에 문제가 없어지겠지요. gcc라면 #pragma, 또는 컴파일러에 따라 적당한 컴파일 옵션으로 해결도 가능하겠지요.
Address Decoding이 제대로 되지 않을 때에도 발생합니다.(너무 하드웨어적인가요? Embedded System을 만지다보니..ㅡㅡ;)
Memory 문제일 수도 있지만 Bus Bridge 또는 Address Decoding 회로(아마도 I/O 관련 액세스 일 때에 국한되겠지만, EPLD, GAL, FPGA 등 Memory Mapped I/O 장치들의 Address Decoder)의 이상 동작시에도 발생합니다.
PPC를 쓰는 어떤 CPU 보드들은 1byte read Cycle을 8번 반복하여 메모리를 액세스 합니다. 그러다 보면 어드레싱 되지 않는 부분을 액세스 하려하여 Bus 에러가 발생하는 경우를 봤습니다.
송지석님 말씀처럼 Address를 내보내고 거기에 대한 DTACK 신호를 받지 못했을 때 Bus Error가 발생하는 하드웨어쪽에 관련된 문제일 가능성이 있는것 같습니다.
제가 앞서 말한 부분을 보았더니..
네트웍에서 문자열로 쭈욱 읽어들인것을 union을 이용해서 struct에 집어넣고 struct의 멤버에 접근을 하도록 되어있는것이었는데..
struct {
struct a,
struct b,
struct {
struct c0,
struct c1 };
} hum;
뭐 이런식의 복잡한 구조였습니다.
따라서 2byte씩 메모리 연산(구조체가 2바이트의 배수라서...)을 하도록 옵션(#pragma pack(2))이 들어가 있었는데, 유독 SUN장비의 cc로 컴파일 된것들은 그냥 죽어버려서, struct의 크기를 4바이트의 배수가 되도록 수정해 주었더니 죽지 않았다! (이를 위해서 문자열로 읽어온것을 다시 shifting 하는 쓸데없는 루틴이 또 추가되었죠... ㅡ.ㅡ) 뭐 이런 논리였습니다.
컴파일 옵션이 잘못되어서 1byte씩 메모리 연산하라고 했던것이 적용 안되었던걸까요? ^^;;
흠 모르겠당...
[quote]processor) bus error - A fatal
예전에 어디선가 bus error에 대한 Q&A를 본듯 한데 기억이 나질 않아
구글에 입력하여 적당한 오류를 찾았으나,
문제 해결에 큰 도움이 되지 않을듯 하옵니다.
https://nicesj.com
https://blog.nicesj.com
보통 90%는 unaligned access로 나는 에러일껍니다. ris
보통 90%는 unaligned access로 나는 에러일껍니다. risc머신에서 잘 일어나구요. 소스찾아서 miss-aligned 된 스트럭쳐 찾아 고쳐야안죽습니다.
어쩌면 메모리가 불량일 수도 있습니다. 한번 메모리를 뽑아서 다시 잘 끼
어쩌면 메모리가 불량일 수도 있습니다. 한번 메모리를 뽑아서 다시 잘 끼워보거나, 아예 바꿔 보는게 좋을지도 모르겠습니다. 혹시나 해서 답변드립니다..
저 같은경우는 잘못된 프로세스가 무한 포크 했을때 버스에러를 본기
저 같은경우는 잘못된 프로세스가 무한 포크 했을때 버스에러를 본
기억이 있네요...
Tony 님의 말씀처럼 bus error 라면 structure의 al
Tony 님의 말씀처럼 bus error 라면 structure의 alignment 를 먼저 의심해보시는 것이 좋습니다. grep struct 로 찾아보시고 char 나 short 를 int (보통 4바이트 또는 머신에 해당되는 alignment 단위)로 바꾸어주시면 대부분 해결되리라 생각합니다. 물론 데이터형의 변환에 따른 데이터값에 대해서도 이곳 저곳 신경을 써주셔야 로직에 문제가 없어지겠지요. gcc라면 #pragma, 또는 컴파일러에 따라 적당한 컴파일 옵션으로 해결도 가능하겠지요.
버스에러라면...세그먼트 폴트보다 좀더 심한 거 정도로 이해해도 무관
버스에러라면...
세그먼트 폴트보다 좀더 심한 거 정도로 이해해도 무관할 듯.
"한참 있다가 에러 메시지가 뜬다" 는 것은
아마 메모리 이상일 가능성이 높습니다.
메모리 접근시 하드웨어적으로 타임 아웃이 걸린 게 아닐까 합니다.
말 그대로 메모리 버스 에러죠
rommance.net
흠
지금 작성중인 코드중에
이런 코드가 있는데 이게 문제가 된다는 말씀이시죠?
저는 Padding 되는줄 알고 있었는데 일단 고쳐봐야겠습니다
답변 감사합니다. :D
-----------
청하가 제안하는 소프트웨어 엔지니어로써 재미있게 사는 법
http://sozu.tistory.com
[quote="송지석"]버스에러라면...세그먼트 폴트보다 좀더 심한
메모리에 대한 고려도 해보겠습니다. 감사합니다. :D
-----------
청하가 제안하는 소프트웨어 엔지니어로써 재미있게 사는 법
http://sozu.tistory.com
Re: 버스 오류(Bus Error)가 자꾸 납니다.
저도 한번은 버스에서 오류가 계속나서 돈으로 낸적이 있는데...ㅡㅡ
----------------------------------------------------------------------------
Re: 흠
패딩 안하도록 코딩을 해주거나(이런거는 대개 비표준임...) 옵션 먹이면 됩니다.
그리고 char가 long 앞에 있거나 사이에 끼어 있어야죠.
Written By the Black Knight of Destruction
어쩌면....
SUN 장비에서 프로그램을 짤때....
struct {
char a,
char b,
short c,
short d,
long e
} hum;
이런식으로 구조체가 잡혀있으면, padding을 하더라도
b를 억세스할때 프로세스가 죽는다고 하더라구요...
하지만 그게 bus error때문인지는 모르겠네요.. ^^;;;;
그래서 썬 장비일때는 구조체를 이런식으로 사용하더군요...
struct {
char a,
char reserved0, //사용하지 않음
char b,
char reserved1, //사용하지 않음
short c,
short d,
long e
} hum;
썬장비에서 메모리의 짝수번지(맞나?? ㅡㅡ;;)를 접근하면 죽는다는 식으로 설명하시던데.. 정확한 원리는 모르겠습니다.
명확히 아시는 분이 계시다면 답글을 달아주시면 좋을것 같네요.....
컴파일러 문제 아닙니까? b를 억세스하면 16bit이나 32bit으로 읽
컴파일러 문제 아닙니까? b를 억세스하면 16bit이나 32bit으로 읽어온 다음 shift하는 걸로 될텐데 말이죠...
rommance.net
Address Decoding이 제대로 되지 않을 때에도 발생합니다.(너
Address Decoding이 제대로 되지 않을 때에도 발생합니다.(너무 하드웨어적인가요? Embedded System을 만지다보니..ㅡㅡ;)
Memory 문제일 수도 있지만 Bus Bridge 또는 Address Decoding 회로(아마도 I/O 관련 액세스 일 때에 국한되겠지만, EPLD, GAL, FPGA 등 Memory Mapped I/O 장치들의 Address Decoder)의 이상 동작시에도 발생합니다.
PPC를 쓰는 어떤 CPU 보드들은 1byte read Cycle을 8번 반복하여 메모리를 액세스 합니다. 그러다 보면 어드레싱 되지 않는 부분을 액세스 하려하여 Bus 에러가 발생하는 경우를 봤습니다.
송지석님 말씀처럼 Address를 내보내고 거기에 대한 DTACK 신호를 받지 못했을 때 Bus Error가 발생하는 하드웨어쪽에 관련된 문제일 가능성이 있는것 같습니다.
Re: 버스 오류(Bus Error)가 자꾸 납니다.
푸하하.. :twisted:
아까 봤을때는 무슨말씀하시는건지 갸우뚱했는데..ㅋㅋㅋ
-----------
청하가 제안하는 소프트웨어 엔지니어로써 재미있게 사는 법
http://sozu.tistory.com
Re: 버스 오류(Bus Error)가 자꾸 납니다.
전 그냥 타라고 하더군요.. ㅋㅋ
언제나 시작
Re: 어쩌면....
이 구조체는 전혀 문제가 없는 구조체입니다.
만일 말씀하신대로 해서 죽으면 그건 이상한 C 컴파일러 탓일 겁니다.
n 바이트를 메모리로부터 읽거나 쓰는 인스트럭션인 경우,
읽거나 쓰는 메모리의 주소는 n 배수 상에 있어야하는데,
그렇지 않은 경우 버스 에러가 발생합니다.
예를 들면,
1바이트 값은 임의 주소에 대해 읽고 쓸 수 있습니다.
4바이트 값은 4배수 주소에 대해 읽고 쓸수 있구요.
다음과 같은 전형적인 예에서 버스에러가 일어납니다.
물론 인텔 계열 cpu 에는 그런 에러가 일어나지 않지만,
메모리 접근 성능은 떨어집니다.
다른 정렬 옵션을 사용해서 만들어진 외부라이브러리를 사용하는
경우에 발생했을 수도 있구요. 아무튼 기본 원리는 위와 같습니다.
Orion Project : http://orionids.org
그런건가요 ^^
그런건가요?
bus error에 대해서 알게되어 감사합니다.
제가 앞서 말한 부분을 보았더니..
네트웍에서 문자열로 쭈욱 읽어들인것을 union을 이용해서 struct에 집어넣고 struct의 멤버에 접근을 하도록 되어있는것이었는데..
struct {
struct a,
struct b,
struct {
struct c0,
struct c1 };
} hum;
뭐 이런식의 복잡한 구조였습니다.
따라서 2byte씩 메모리 연산(구조체가 2바이트의 배수라서...)을 하도록 옵션(#pragma pack(2))이 들어가 있었는데, 유독 SUN장비의 cc로 컴파일 된것들은 그냥 죽어버려서, struct의 크기를 4바이트의 배수가 되도록 수정해 주었더니 죽지 않았다! (이를 위해서 문자열로 읽어온것을 다시 shifting 하는 쓸데없는 루틴이 또 추가되었죠... ㅡ.ㅡ) 뭐 이런 논리였습니다.
컴파일 옵션이 잘못되어서 1byte씩 메모리 연산하라고 했던것이 적용 안되었던걸까요? ^^;;
흠 모르겠당...
아시는 분이 계시다면 부탁드려요~~ ^^;;;
아마 gcc가 아닌 것 같네요. gcc라면 -fpack-struct 옵션
아마 gcc가 아닌 것 같네요. gcc라면 -fpack-struct 옵션이 있고 또 소스 내에서 __attribute__((packed))로 할 수도 있고 #pragma pack으로 할 수도 있습니다.
#pragma 는 컴파일러마다 옵션이 틀리기 때문에 알 수 없네요.
테스트 해보시려면
이런 코드로 테스트 해보세요.
pack이 되면 크기가 어떻게 되는 지 보시고, 컴파일러 옵션으로 했을 때도 되는 지도 보세요.
물론 2byte씩 pack하려면 뭔가 더 붙이거나 해야 할 듯.
rommance.net
댓글 달기