버스 오류(Bus Error)가 자꾸 납니다.

sozu의 이미지

솔라리스 장비인데, 가끔 시스템이 멈춤현상이 있더니

쉘에서 어떤 명령어를 실행 시켜도

한참뒤에 버스오류(Bus Error)가 나옵니다.

어떤 현상인지 알고 싶습니다. :oops:

sjpark의 이미지

Quote:

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의 이미지

보통 90%는 unaligned access로 나는 에러일껍니다. risc머신에서 잘 일어나구요. 소스찾아서 miss-aligned 된 스트럭쳐 찾아 고쳐야안죽습니다.

서지원의 이미지

어쩌면 메모리가 불량일 수도 있습니다. 한번 메모리를 뽑아서 다시 잘 끼워보거나, 아예 바꿔 보는게 좋을지도 모르겠습니다. 혹시나 해서 답변드립니다..

eggboy의 이미지

저 같은경우는 잘못된 프로세스가 무한 포크 했을때 버스에러를 본

기억이 있네요...

saxboy의 이미지

Tony 님의 말씀처럼 bus error 라면 structure의 alignment 를 먼저 의심해보시는 것이 좋습니다. grep struct 로 찾아보시고 char 나 short 를 int (보통 4바이트 또는 머신에 해당되는 alignment 단위)로 바꾸어주시면 대부분 해결되리라 생각합니다. 물론 데이터형의 변환에 따른 데이터값에 대해서도 이곳 저곳 신경을 써주셔야 로직에 문제가 없어지겠지요. gcc라면 #pragma, 또는 컴파일러에 따라 적당한 컴파일 옵션으로 해결도 가능하겠지요.

송지석의 이미지

버스에러라면...
세그먼트 폴트보다 좀더 심한 거 정도로 이해해도 무관할 듯.
"한참 있다가 에러 메시지가 뜬다" 는 것은
아마 메모리 이상일 가능성이 높습니다.
메모리 접근시 하드웨어적으로 타임 아웃이 걸린 게 아닐까 합니다.
말 그대로 메모리 버스 에러죠

sozu의 이미지

지금 작성중인 코드중에

struct AAA {
   long
   long
   long
   char
   char
};

이런 코드가 있는데 이게 문제가 된다는 말씀이시죠?

저는 Padding 되는줄 알고 있었는데 일단 고쳐봐야겠습니다

답변 감사합니다. :D

-----------
청하가 제안하는 소프트웨어 엔지니어로써 재미있게 사는 법
http://sozu.tistory.com

sozu의 이미지

송지석 wrote:
버스에러라면...
세그먼트 폴트보다 좀더 심한 거 정도로 이해해도 무관할 듯.
"한참 있다가 에러 메시지가 뜬다" 는 것은
아마 메모리 이상일 가능성이 높습니다.
메모리 접근시 하드웨어적으로 타임 아웃이 걸린 게 아닐까 합니다.
말 그대로 메모리 버스 에러죠

메모리에 대한 고려도 해보겠습니다. 감사합니다. :D

-----------
청하가 제안하는 소프트웨어 엔지니어로써 재미있게 사는 법
http://sozu.tistory.com

ㅡ,.ㅡ;;의 이미지

sozu wrote:
솔라리스 장비인데, 가끔 시스템이 멈춤현상이 있더니

쉘에서 어떤 명령어를 실행 시켜도

한참뒤에 버스오류(Bus Error)가 나옵니다.

어떤 현상인지 알고 싶습니다. :oops:

저도 한번은 버스에서 오류가 계속나서 돈으로 낸적이 있는데...ㅡㅡ


----------------------------------------------------------------------------

Necromancer의 이미지

sozu wrote:
지금 작성중인 코드중에

struct AAA {
   long
   long
   long
   char
   char
};

이런 코드가 있는데 이게 문제가 된다는 말씀이시죠?

저는 Padding 되는줄 알고 있었는데 일단 고쳐봐야겠습니다

답변 감사합니다. :D

패딩 안하도록 코딩을 해주거나(이런거는 대개 비표준임...) 옵션 먹이면 됩니다.
그리고 char가 long 앞에 있거나 사이에 끼어 있어야죠.

Written By the Black Knight of Destruction

bejoy4him의 이미지

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으로 읽어온 다음 shift하는 걸로 될텐데 말이죠...

roshell의 이미지

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가 발생하는 하드웨어쪽에 관련된 문제일 가능성이 있는것 같습니다.

sozu의 이미지

ㅡ,.ㅡ;; wrote:
sozu wrote:
솔라리스 장비인데, 가끔 시스템이 멈춤현상이 있더니

쉘에서 어떤 명령어를 실행 시켜도

한참뒤에 버스오류(Bus Error)가 나옵니다.

어떤 현상인지 알고 싶습니다. :oops:

저도 한번은 버스에서 오류가 계속나서 돈으로 낸적이 있는데...ㅡㅡ

푸하하.. :twisted:

아까 봤을때는 무슨말씀하시는건지 갸우뚱했는데..ㅋㅋㅋ

-----------
청하가 제안하는 소프트웨어 엔지니어로써 재미있게 사는 법
http://sozu.tistory.com

alwaysN00b의 이미지

sozu wrote:
ㅡ,.ㅡ;; wrote:
sozu wrote:
솔라리스 장비인데, 가끔 시스템이 멈춤현상이 있더니

쉘에서 어떤 명령어를 실행 시켜도

한참뒤에 버스오류(Bus Error)가 나옵니다.

어떤 현상인지 알고 싶습니다. :oops:

저도 한번은 버스에서 오류가 계속나서 돈으로 낸적이 있는데...ㅡㅡ

푸하하.. :twisted:

아까 봤을때는 무슨말씀하시는건지 갸우뚱했는데..ㅋㅋㅋ

전 그냥 타라고 하더군요.. ㅋㅋ

언제나 시작

체스맨의 이미지

bejoy4him wrote:
SUN 장비에서 프로그램을 짤때....
struct {
char a,
char b,
short c,
short d,
long e
} hum;

이런식으로 구조체가 잡혀있으면, padding을 하더라도
b를 억세스할때 프로세스가 죽는다고 하더라구요...
하지만 그게 bus error때문인지는 모르겠네요.. ^^;;;;

이 구조체는 전혀 문제가 없는 구조체입니다.
만일 말씀하신대로 해서 죽으면 그건 이상한 C 컴파일러 탓일 겁니다.

n 바이트를 메모리로부터 읽거나 쓰는 인스트럭션인 경우,
읽거나 쓰는 메모리의 주소는 n 배수 상에 있어야하는데,
그렇지 않은 경우 버스 에러가 발생합니다.

예를 들면,
1바이트 값은 임의 주소에 대해 읽고 쓸 수 있습니다.
4바이트 값은 4배수 주소에 대해 읽고 쓸수 있구요.

다음과 같은 전형적인 예에서 버스에러가 일어납니다.
물론 인텔 계열 cpu 에는 그런 에러가 일어나지 않지만,
메모리 접근 성능은 떨어집니다.

char*a = malloc( 3 );
*(short*)(a+1) = 1; /* 버스 에러! */
free( a );

다른 정렬 옵션을 사용해서 만들어진 외부라이브러리를 사용하는
경우에 발생했을 수도 있구요. 아무튼 기본 원리는 위와 같습니다.

Orion Project : http://orionids.org

bejoy4him의 이미지

그런건가요?
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 옵션이 있고 또 소스 내에서 __attribute__((packed))로 할 수도 있고 #pragma pack으로 할 수도 있습니다.
#pragma 는 컴파일러마다 옵션이 틀리기 때문에 알 수 없네요.

테스트 해보시려면

typedef struct {
    int a;
    char b;
    char b2;
    char b3;
} fff;
typedef struct {
    int a;
    char b;
    char b2;
    char b3;
} __attribute__((packed)) tdd;

printf("!!!fff%d\r\n", sizeof (fff) );
printf("!!!tdd%d\r\n", sizeof (tdd) );

이런 코드로 테스트 해보세요.
pack이 되면 크기가 어떻게 되는 지 보시고, 컴파일러 옵션으로 했을 때도 되는 지도 보세요.
물론 2byte씩 pack하려면 뭔가 더 붙이거나 해야 할 듯.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.