솔라리스 SIGBUS(Invalid Address Alignment)에 관하여...

robin7446의 이미지

썬 솔라리스 Sun WorkShop Compilers C/C++ 5.0을 이용하여
프로그램을 개발하고 있는 개발자 입니다.

제가 개발한 Application이 SIGBUS가 발생하며 계속 비정상 종료됩니다.
core dump file을 분석해 보면 SIGBUS Signal이 발생한 이유가
"invalid address alignment" 때문이라고 합니다.
제가 아는 상식으로는 "invalid address alignment"는 보통 address를 잘못
참조하였을 경우 발생하는 것으로 아는데 제 프로그램이 실제로 종료된
위치를 보면 모두 Memory Allocation하다가 발생하였습니다.
Memory Allocation 하다가 "invalid address alignment"가 발생하는
이유는 무엇인지 궁금합니다. 그리고 해결방안은 어떤것이 있는지 알고싶습니다.

아래의 내용은 dbx를 이용하여 core dump file을 분석한 내용입니다.
이부분에서만 발생하는 것이 아니라 불특정 다수의 Memory Allocation 부분
에서 발생하고 있습니다. 아래의 내용은 그 중 한부분입니다.

detected a multithreaded program
t@3360 (l@3) terminated by signal BUS (invalid address alignment)
Current function is CStrArrAddStr
112 NowNode = new NODE; // 현재 노드
(/opt/SUNWspro/bin/../WS5.0/bin/sparcv9/dbx) where
current thread t@3360
[1] t_splay(0x619888, 0x6fd28, 0x4, 0xfdb689e8, 0x0, 0xfdb819b3), at 0xff146430
[2] t_delete(0x619888, 0xff1b5f74, 0x60d9a0, 0x81d818, 0x12d998, 0x203f88), at 0xff146298
[3] realfree(0x81d820, 0x619888, 0xff1bc8d8, 0xff1b5f74, 0x81d818, 0x203f8b), at 0xff145ee0
[4] cleanfree(0x0, 0xff1b5f74, 0xff1bc84c, 0xff1bc8cc, 0xff1bc84c, 0x0), at 0xff146768
[5] _malloc_unlocked(0x81d820, 0x10, 0x0, 0x81d818, 0x0, 0xff1b5f74), at 0xff1458f0
[6] malloc(0x10, 0x0, 0x0, 0x0, 0x0, 0x0), at 0xff1457e8
[7] 0xff20651c(0x10, 0xfdb7e910, 0x13b84, 0xff34caf0, 0xff21a07c, 0x10), at 0xff20651b
=>[8] CStrArrAddStr(this = 0x16fe78, szStr = 0xfdb819ae "\x80a", nSizeOfStr = 4), line 112 in "StrArr.cpp"
[9] PGMSResponsePutDataWithHttp(this = 0x169210, szData = 0xfdb819ae "\x80a", nSizeOfData = 4), line 2442 in "Pgms.cpp"
[10] PGMSResponseResponseDynamicMenus(this = 0x169210, smcode = 0x175290 "^B", transType = 1), line 154 in "MenuList.cpp"
[11] PGMSResponseResponseTC3(this = 0x169210), line 1415 in "Pgms.cpp"
[12] PGMSResponseResponseFromUser(this = 0x169210, subCmd = 'f'), line 769 in "Pgms.cpp"
[13] PGMSResponseProcessMessage(this = 0x169210, cmd = STRUCT), line 664 in "Pgms.cpp"
[14] PGMSResponseRun(this = 0x169210), line 522 in "Pgms.cpp"
[15] StartUpSPThread(pThread = 0x169210), line 214 in "Spthread.cpp"

여러 고수님들의 많은 조언 부탁드립니다.

kihlle의 이미지

이전 코드에서 허용되지 않은 공간에 덮어쓰기가 있었거나 혹은 할당받지 않은 장소에 대해 free()를 호출했던것으로 추정됩니다.
배열이나 malloc으로 할당받은 공간의 경계를 넘어서 쓰기가 있었는지 살펴보셔야 할것입니다. 여기에는 a=(int*)malloc(7)로 잡고 a[1]에다 writing한 부분까지 포함됩니다.
할당받은 장소에 대해서 free()를 두번이상하거나, 할당된 주소변수가 변조되어서 free()까지 갔는지, 비할당영역에 free()가 호출되었는지도 체크해보셔야합니다.

Sun플랫폼에서도 efence라이브러리나 _MALLOC_CHECK같은 환경변수가 작동하는지 잘 몰라서 다른 해결책을 말씀드리긴 힘들구요. 어쨌든 저런 에러는 솔라리스뿐 아니라 다른 유닉스들에서도 각각 다른 형태로 나타나며, 그 원인은 에러가 난 부분보다 (훨씬)더 이전에 있었음을 말씀드리고 싶습니다.

homeless

alofree의 이미지

위에서 말씀하신 경우도 맞고요.

다른 경우는 메모리를 100 바이트 할당할 경우
실제로 메모리 페이지가 생성되는 것은 메모리 블럭사이즈 만큼 할당됩니다
아마도 512바이트.. 이런 식으로 할당이 되겟지요.

따라서, 100 바이트를 할당하고 100 혹은 그 이후의 의 위치에 write를 발생 시켰다고 해서 에러가 발생하진 않습니다.
512짜리 페이지가 할당 되었다면 512이후의 위치에 write를 할 경우 invalid address alignment 가 발생합니다.

하지만, 위의 경우와 같이 프로그램 하시는 분은 잘 없겠죠..

제가 생각하는 대부분의 경우는 메모리를 할당 한 후 그 메모리를 free 하고 난 이후에 그 메모리에 write를 하는 경우라고 생각됩니다.

위의 답변에서 말하는 free를 두번 한 경우도 비슷한 경우가 아닐까 생각합니다.

simpid의 이미지

제가 얼마전에 경험한적 있습니다.

thread, mutex, condition ... 셋중 하나였는데...(기억은 안남)
주소가 짝수로 align되어 있어야 합니다.

예를들어 구조체에 이것저것 들었는데..
#pragma pack 1
을 한 후에 문제가 되더군요.

소켓 통신하는 프로그램이었기에 전송하는 구조체를 위해 #pragma pack 1을 했었는데..
전송용이 아닌 내부 사용을 위한 구조체는 #pragma pack 2 를 사용했었습니다.

익명 사용자의 이미지

risc에서 잘 발생하는 일이죠.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.