'Datatype misalignment'에 해당되는 글 2건

  1. 2007.10.27 Windows Mobile 에서 assert 사용하기
  2. 2007.10.27 Data Abort 에러 발생시에 에러확인 및 중단하기 (2)

Windows Mobile 에서 assert 사용하기

프로그래밍/개발/Blackjack(SPH-M6200) 2007.10.27 00:27

블랙잭으로 프로그램을 작성하며 값을 검증하기 위해 MFC 에서 제공하는 ASSERT() 매크로를 사용하였다.

하지만 수많은 시행착오 끝에 ASSERT() 매크로는 제대로 작동하지 않는다는 것을 알았고, 대신 기본으로 제공되는 assert() 매크로는 제대로 작동한다는 사실을 알게 되었다.

다음과 같이 이용하자.

C++

#include <cassert>

assert(expression);

간단히 테스트하기 원한다면

assert(false); 라고 수행하면 원하는 결과를 얻을 수 있다.

사용자 삽입 이미지


Trackback 0 : Comment 0

Write a comment


Data Abort 에러 발생시에 에러확인 및 중단하기

프로그래밍/개발/Blackjack(SPH-M6200) 2007.10.27 00:12

블랙잭을 이용하여 프로그램을 작성하던 도중 특정 구문을 수행할시에 Data Abort 에러가 발생하는 것을 확인하였다.

평소 Win32 용 프로그램만 작성해 보다가 처음 하고 있는 Windows Mobile 디바이스 작업이기 때문에 처음 보는 에러였는데, 구글을 통해 검색해 보니 대충 윈도의 잘못된 연산 수행이나, 리눅스의 Segmentation fault 와 비슷한 것이라는 얘기가 나왔다.

그런데 이상한 점이, 분명히 윈도용 프로그램을 개발할 때에는 잘못된 연산을 수행하면 즉시 그 부분에 브레이크가 걸리고 무엇이 잘못되었는지 표시가 되는데 여기서는 그렇지가 않다는 것이었다.

사용자 삽입 이미지

멈추지 않고 에러가 계속 발생한다.

나같은 초보 프로그래머들은 저 에러메시지만 보고서는 대체 무슨 에러인지도 모르겠고, 소스에도 의심가는 부분이 없게 된다면 무척이나 당황하게 된다.

결국 Trace 를 통해 문제가 되는 부분을 찾았는데, 전혀 이상이 없다.
해답을 찾아 삼만리..

결국 발견한 것은 다음과 같은 방법이다.

Debug>Exceptions 메뉴를 실행한다.
다음과 같은 창이 뜬다.

사용자 삽입 이미지

Win32 Exceptions

주의해서 봐야 할 부분은 여기 Win32 Exceptions 부분이다.

여기 체크된 예외만이 디버거 실행을 멈추게 되어있다. 기본값은 위와 같고 (물론 항목은 더 많다.) 잘 보면 기본적인 Access violation 이나 Illegal Instruction, Datatype misalignment 가 체크되어 있지 않은 것을 알 수 있다.

위 항목을 체크하고 OK를 눌러주자

사용자 삽입 이미지

멈추길 바라는 항목들을 체크

다시 프로그램을 실행하면 결과가 아까와는 조금 달라진다.

사용자 삽입 이미지

뭐가 달라졌을까?

과연 어떤점이 다를까.

아까는 볼 수 없었던 줄이 하나 추가 된것을 볼 수 있다.
First-chance exception at 0x00028048 in xxxxxxxx.exe: 0x80000002: Datatype misalignment.


그리고 훌륭하게 디버거는 문제가 발생한 지점에서 실행을 중단하고 메시지 창을 띄운다.

사용자 삽입 이미지

Datatype misalignment

Data Abort 를 일으킨 장본인은 바로 Datatype misalignment 에러였다.

자! 문제가 무엇인지 좀 더 분명해 졌다.
왜 이런 Exception 들을 기본으로 체크해 놓지 않았는지 의문이 생기지만, 어쨌든 해결하게 된 것 만으로도 기쁘게 생각한다.
이제 문제가 무엇인지 알았으니 이제 문제를 해결하기만 하면 된다! (아직 해결 안됐음)

참고: datatype alignment 참고자료



Trackback 0 : Comments 2
  1. dawnsea 2007.12.17 17:14 신고 Modify/Delete Reply

    리퍼러 보고 왔어요 ㅋㅋ

    CE .NET 에서도 역시 무조건 4의 배수 얼라인을 하라는 듯?
    일단 아키텍쳐들이.. 임베디드에서 쓰는 코어들은 하드웨어 얼라인을 지원 안 하거든요..


    어.. 근데 수원멤이네요 -_-;
    저 수원멤 13기 -_-;; 애매모호한 낙오자 있습니다 ㅋㅋ -_-;

    • mahalo 2007.12.31 01:35 신고 Modify/Delete

      핫.. 방문해주셔서 감사합니다 ^^;
      수원멤 13기시면 한참 선배님이시네요~
      저는 16기랍니다.. 13기는 거의 모르는데.. OB와의 만남 오셨으면 한번쯤 뵈었을지도 모르겠습니다 ^^

Write a comment