개발자, 엔지니어, 리더



  관리자(2005-08-24 21:53:59, Hit : 1223, Vote : 409
 디버깅할 때 최적화 옵션과 어셈블러코드

가끔씩 IDE를 통하여 온라인으로 코드 한 줄 한 줄을 디버깅하다보면
어떤 코드에 Break Point를 걸었는데도 불구하고 그 줄에 Break Point가
걸리지 않고 다른 줄에 걸리는 것을 볼 수 있다.

이것은 Compiler가 코드를 컴파일할 때 불필요한 코드라고 판단되는 것은
자기 스스로 코드 최적화를 수행하기 때문이다.

예를 들어서

ImsiVal = 5;
ImsiVal = Imsival + 10;

이라고 코딩하고 컴파일 옵션에서 최적화 옵션을 선택하게 되면
컴파일러가 컴파일을 하면서

ImsiVal = 15;

이런 식으로 최적화 해버릴 수도 있다는 이야기이다.

컴파일러가 똑똑하게 최적화하면 그럴 수 있지만 아닐 수도 있기 때문에
주의해야 한다.

만약 필요하다면 컴파일 옵션에서 최적화 옵션을 빼고 테스트할 수도 있다.
하지만 컴파일 옵션을 바꾸고 테스트가 잘 되었다고 해서 스스로 무해하다고
생각하는 컴파일 옵션을 추가한다고 그 코드가 이전 코드와 같이 수행할 것이라고
기대해서는 안 된다.

C 레벨에서의 소스코드를 따라가다가 보면 가끔씩 이해할 수 없게 동작하는 경우를
볼 수도 있게 된다.
이럴때는 C레벨의 소스코드 뿐만 아니라 컴파일러가 만들어낸 어셈블러코드도 같이
검토해 보아야 할 경우도 있다. 이 어셈블러 코드를 따라감으로써 C레벨의 소스에서는
아무리 봐도 찾기가 힘든 에러를 잡았던 기억을 가지고 있다.

이전에 하기와 같은 코드를 만들었다.

void ImsiFunc( void )
{
   unsigned char b;

    ...
   b = (unsigned char) 0x11;
    ImsiFunc2( b );
}

void ImsiFunc2( unsigned char ii )
{
    ...
}

위에서 ImsiFunc2에서 받는 인자 ii가 항상 0으로 들어가는 사태가 발생했었다.
원인을 몰라서 한참을 헤메다가 어셈블러코드를 봤더니
ImsiFunc2()라는 함수에게 넘겨주는 인자를 int 형으로 넘겨주는 것이었다.
그래서 0x0011을 넘겨주게 됨으로써 0x00라는 값만 항상 ii에게 들어가는 것이었다.

근본적인 원인은 ImsiFunc2() 함수형을 사용전에 미리 선언하지 않음으로써
컴파일러가 인자를 항상 int 형으로 간주함으로써 발생되는 문제였다.
어셈블러코드를 보면서 16비트형 레지스터가 사용되면서 이상한 값이 들어가는 것을
따라가다가 발견하게 되었다.

* 엉뚱한 교훈 : 컴파일러가 워~닝~ 메시지를 무시하지 말자.





공지   한 마디 [6]  관리자  2004/04/23 1315 508
34   고객지원을 하면서 느끼는 기쁨은...  관리자 2007/03/16 1625 507
33   프로젝트 리더로써 기쁨을 맛 보았을때.  관리자 2007/03/16 1621 494
32   이것만 해결하면 될 것 같은 마약  관리자 2006/10/01 1560 486
31   안정적이지 못한 조직에서는  관리자 2006/08/06 1203 473
30   "비굴클럽"을 읽고  관리자 2006/03/03 1102 369
29   혹시 IEToy에서 스마트로그인 기능이 안되면  관리자 2005/12/20 1952 491
28   코칭기법 : 하소연들어주기.  관리자 2005/11/26 1187 428
27   갑 또는 을  관리자 2005/11/26 1159 418
26   모듈의 독립성과 CallBack 함수  관리자 2005/10/19 1492 428
25   될때까지~~ 정신  관리자 2005/09/26 1204 458
24   자기 입맛에 꼭 맞는 리더를 기대해서는 안된다.  관리자 2005/09/08 1181 432
  디버깅할 때 최적화 옵션과 어셈블러코드  관리자 2005/08/24 1223 409
22   소스코드가 나의 제어하에 있다고 느낄 때  관리자 2005/08/17 1273 465
21   팀장의 역할  관리자 2005/07/25 1495 436
20   코딩 중에 드는 개선사항 기록하기  관리자 2005/06/17 1286 428
19   사람 봐가면서 작동하는 보드  관리자 2005/06/08 1229 404
18   05' ETC Korea 전시회에 다녀와서  관리자 2005/05/20 1176 366
17   Embedded Target Board 자동 테스트하기  관리자 2005/05/02 1398 386
16   "조엘 온 소프트웨어"를 읽고  관리자 2005/04/26 1314 303

1 [2]
 

Copyright 1999-2017 Zeroboard / skin by zero