'Debug'에 해당되는 글 2건

  1. 2012.11.19 [단축키] Trace32 by 당신은 천하보다 귀중합니다. av930
  2. 2008.09.22 [Visual C++] Error Msg by 당신은 천하보다 귀중합니다. av930 (2)

     

3~4년까지만 해도 Trace32없이는 개발을 할 수 없을 것 같이 무척이나 많이 사용했었는데, 시간이 흐른 지금, 그리고 android가 나온 지금 세상이 많이 변했다.

Trace32는 지금도 비싸긴 하지만, SW를 써보면 정말 대단하다라는 찬사가 나올정도다. 그래서 SW license를 annual update로 해야 하나 보다. 그래도 그렇지.. 비싸긴 하네. 그런데 이런 비싸고 훌륭한 장비를 downloader로 사용하는 개발자가 있다. 컥!..

보통 단순한 Rom Writer기들은 20~30만원 under로 살수 있는데, 천만원 이상을 들이는 것은 아무래도 아닌듯.

 
어째튼 아직도 Trace32 를 애용하는 개발자들이 있을 거라고 판단하여 여기 단축키를 올린다. T32로 언젠가 android 속속들이 파헤치고 싶은 심정이 아직도 가득하다. 또한 단축키(유용 명령어 모음)신기술도 익히고 최신 version으로 update하고 싶지만, 아쉽기 짝이 없다.

   

TRACE 32

    

    

    

    

대분류

단축키

    

    

    

설명

   

   

   

   

   

   

   

   

   

   

   

   

   

심볼명 = 함수명 or 변수명

   

   

주소 = num

   

   

   

   

   

   

   

   

   

화면

    

    

    

    

    

   

winclear:

   

   

모든 windows를 close하겠다는 command

   

screen

   

   

   

화면 update

   

   

   

   

   

   

시스템

    

    

    

    

    

   

sys.res

   

   

   

디버거를 리셋

   

sys.u

   

   

   

타겟시스템과 디버거가 연결되면서, 동시 점검 및 타겟리셋과 더불어 디버깅 ready상태로감.

   

sys.d

   

   

   

타겟시스템과 디버거가 연결을 제거

   

sys.g

   

   

   

sys.up + go

   

sys.mode attach

   

target을 reset하지 않고 현재상태에서 T32와 연결을 하여 현재 상태(현재 pc주소)를 보여준다.

   

res

   

   

   

icd debugger reset와 target reset를 동시에 수행한다.

   

   

   

   

   

   

   

   

   

   

   

sys.up 구조

   

   

   

   

   

1. JTAG test

   

   

   

   

   

2. target reset

   

   

   

   

   

3. target과 연결후 디버그 모드로 전환

   

   

   

   

   

3. pc를 0번지로 만든다.

   

   

   

   

   

   

브라우징

    

    

    

    

   

y.b

   

   

   

어떤 심볼을 찾아야 하는데 그 심볼의 이름을 정확히 알수 없을때(참고로, 먼저 해당 elf가 로딩되어 있어야 한다.)

   

y.b.m [파일명]

   

   

어떤 파일 (t32에서는 모듈이라고 부름)을 찾고 싶을때,

   

   

   

   

   

c파일경우는 확장자 없이. H파일경우는 확장자와 함께 파일명을 기록한다.

   

y.l [심볼명]

   

   

심볼이 위치하는 주소및 주변주소를 참조하거나 알고 싶을때

   

y.l.SEC

   

   

   

알지 못하는 어떤 모델의 메모리 맵을 보고자 할때, 섹션과 메모리 위치를 보여준다.

   

y.d [섹션명]

   

   

위에서 보여준 섹션을 심볼에서 제거 할수있다. 즉, y.b했을경우 제거 하면 나오지 않게 된다.

   

   

   

   

   

   

   

   

   

   

   

   

브레이크

    

    

    

    

   

map.nobonchip 0--0xffffff

s/w interrupt mode를 사용하기위해서

   

map.bonchip [range]

   

map.bonchip 0x0—0xffff = flash memory나 Rom과 같은 영역을 trace32에게

   

   

   

   

   

알려 주어 trace32로 하여금 그영역에는 onchip break를 seting 하도록 함

   

   

   

   

   

이영역 이외에 break를 걸면 s/w break로 인식하게된다.

   

b.l

   

   

   

break 브라우징 창열기, 현재 어떤 break가 걸렸는지와 그 상태를 알고 싶을때

   

b.s 심볼명/주소

   

   

특정 심볼위치에 break를 건다.

   

b.s num--num /w

   

특정 메모리 영역을 write할때 break가 걸린다.

   

b.s num /w

   

   

특정 메모리를 write할때 break가 걸린다.

   

b.s nvimr_read

   

   

break set 함수 (ex: b.s error_fatal_put_log)

   

   

   

   

   

ex) b.s 0x1000000 /HLL 특정 메모리에 HLL break를 건다.

   

   

   

   

   

b.s 변수명 /data.b 0x55

   

   

   

   

   

b.s sieve = sieve함수 첫머리에 break point를 잡겠다는 command

   

   

   

   

   

b.s sieve+0xf0 = sieve함수 첫머리에서 0xf0만큼 offset을 갖는 위치에

   

   

   

   

   

break point를 잡겠다는 command

   

b.d

   

   

   

break delete

   

   

   

   

   

   

변수및 메모리

    

    

    

    

   

d 심볼명/주소 /spotlight

   

특정 심볼위치의 메모리나 주어진 번지의 메모리 내용을 보여준다.

   

   

   

   

   

(참고로 트레이스에서는 0x를 붙이지 않아도 모든 주소를 hex로 인식, spotlight은 주황색으로 변화된값을 표시)

   

   

   

   

   

Dump [address] [/width]

   

   

   

   

   

ex)d 0xfff0 /W = word단위로 0xfff0번지부터 dump창에 보여줌(default long)

   

v.v %open rex_best_task

   

variable view 특정변수나, 구조체의 값을 display

   

v.print 변수이름

   

   

변수 print

   

   

   

   

   

그냥 print와 차이점: 그냥 print는 cmm파일등에서 &input과 같이 선언된 사용자 변수를 보기위한 것이며

   

   

   

   

   

v.print는 trace하고 있는 소스상의 변수를 보기위함이다.

   

v.INFO 변수명

   

   

enum type의 변수값을 보고자 할때

   

d.s

   

   

   

Data.Set [address][%L | %W | %B][data] :

   

   

   

   

   

명시된 addr에 4bytes(long)나 1bytes(word),1byte(byte)단위로 명시된 data를 써넣겠다는 command

   

   

   

   

   

ex)data.set 0xff0 %w 0xf0f0 = data 0xf0f0의 값을 0xff0에 써넣음

   

   

   

   

   

d.s 0xff20 %b 0xff = data 0xff를 0xff20번지에 써넣음

   

d.SAVE

   

   

   

Data.SAVE.[binary | InteHex] ] [file name] [range]

   

   

   

   

   

ex)d.save.b test.bin 0x0—0xffff = 0번지부터 0xffff번지까지 binary format으로 test.bin file에 저장

   

d.LOAD

   

   

   

Data.LOAD.[format] [file name] [address]

   

   

   

   

   

ex)d.load.b test.bin 0xfff0 = binary format인 test.bin file을 0xfff0번지부터 down

   

   

   

   

   

loading하라는 명령임,여기서 format은 elf,coff,binary,intelhex,srecord,omf등임

   

d.f

   

   

   

Data.Find [range] [%width] [data]

   

   

   

   

   

ex)d.f 0x0—0xffff %l 0xf0f0f0f0 = 이는 0—0xffff번지내에서 data(long형4byte) 0xf0f0f0f0

   

   

   

   

   

를 찾으라고 하는 명령임

   

d.compare

   

   

특정 영역의 내용끼리 비교한다.

   

   

   

   

   

ex) d.compare 0x100++0x300 0x1100

   

   

   

   

   

0x100--0x400까지의 영역을 0x1100--0x1400과 비교한다.

   

Data.Test &range /Prime

T32에서 지원하는 RAM 테스트 루틴으로 임의의값을 write하여 정상동작을 검사한다.

   

d.l 심볼명

   

   

특정 심볼위치를 보여준다.

   

   

   

   

   

Data.List [address]

   

   

   

   

   

ex)d.l 0x1000 = 1000번지부터 source list창을 띄워주게 된다

   

   

   

   

   

ex)d.l = default값으로 0번지부터 source창을 띄워준다

   

d.l

   

   

   

현재 break가 걸린 메모리번지를 기준하여 그에 해당하는 소스라인의 명령을 볼때

   

d.l num

   

   

   

특정 메모리번지를 선택한다.

   

   

   

   

   

   

레지스터

    

    

    

    

   

r /spotlight

   

   

register 브라우징 창열기, 현재 모드별 레지스터값을 출력해주고

   

   

   

   

   

변화된 값을 주황색으로 보여준다.

   

Register.Set [register name] [data]

   

   

   

   

   

ex)r.s pc 0x10000 = pc값을 0x10000으로 써넣음

   

   

   

   

   

r.s pc sieve = pc값을 sieve함수가위치한 addr에 위치하도록 함

   

r.undo

   

   

   

한 step전으로 돌아가는 명령어로, 레지스터 값을 이전으로 돌리므로써 구현된다.

   

   

   

   

   

그러므로 일반 메모리 operation을 수행했다면, 그것은 이전으로 돌리지는 못한다.

   

   

   

   

   

디버깅 장비를 연결할여 타겟을 동작시 running시는 일반 normal 모드로 장비가 물려있지 않은 상태와 같게

   

   

   

   

   

된다. 그러나 break을 걸때, 타켓을 디버깅 모드가 되어 타켓의 정보를 디버깅 장비가 읽어올수 있게 되는 것이다

   

   

   

   

   

그러므로 r.undo를 했을때, 만약 step으로 실행시켰다면 바로 이전 명령어로 가겠지만, go stop으로

   

   

   

   

   

실행했다면 이전 break가 걸린 곳으로 가게 되는것이다.

   

   

   

   

   

이것을 이용하여 reset 되면 sys.up을 하여 target을 붙이고. r.undo하여 t32에 저장된 이전 레지스터 값을

   

   

   

   

   

로딩하여 이전 마지막으로 break되었던 곳으로 이동할수가 있는것이다. 그래서 만약 step cmd로 동작하고

   

   

   

   

   

있었다면 바로 이전명령어가 되는것이다.

   

r.redo

   

   

   

undo한것을 다시 원상태로 만든다.

   

   

   

   

   

   

인터럽트

    

    

    

    

   

to.set [IRQ/FIQ] [on/off]

   

IRQ/FIQ/ETC등을 trace에서 받도록 설정하거나 disable시킨다.

   

   

   

   

   

ex) to.set IRQ off

   

   

   

   

   

   

디버깅

g (go)

    

    

    

Go [address] : ex) go = 프로그램을 실행하겠다는 command

   

   

   

   

   

go sieve = sieve함수까지 실행하겠다는 command

   

s (step)

   

   

   

step명령(source list창의 step버튼과 같음)

   

b (break)

   

   

break명령(source list창의 break버튼과 같음)

   

   

   

   

   

   

   

wait [time.ms|s]

   

   

프로그램 running과 상관없이 trace가 몇초동안 기다린후 명령을 수행하게된다.

   

   

   

   

   

ex)

   

   

   

   

   

wait 100.ms;

   

   

   

   

   

WAIT 1.s ;

   

   

   

   

   

WAIT Register(pc)==0x1000 ;

   

   

   

   

   

WAIT !run() ;

   

   

   

   

   

   

   

   

   

   

   

   

   

print "[text string]"

   

print " " 문자열을 area에 표시해 준다.

   

   

   

   

   

ex) print "this is test mode" = status line에 this is test mode출력

디버깅관련 명령 설명

    

    

    

   

(Step) : HLL또는 disassemble된 소스를 한 개의 라인씩 진행. 함수내로의 step into기능도 포함하고 있음.

   

(StepOver) : Step명령과 비슷하나 함수내로 분기해 들어가지 않고 함수도 하나의 라인으로 간주하고 처리

   

(Go Next ) : Step Over 명령과 유사하나 루프문에서 바로 빠져 나올수 있음.

   

(Go Return) : 함수의 리턴문까지 수행

   

(Go Up) : 함수를 빠져 나옴. 호출한 상위 모듈로 올라감.

   

* Go till here(Pop up 메뉴) : 현재 커서가 있는 부분까지 수행.

   

* Set PC here : PC만 현재의 커서부분으로 옮김.

   

   

   

   

   

   

기타

    

    

    

    

    

   

   

   

   

   

   

   

cmm file editor : 이는 cmm file(mcro file)을 편집하고 실행할수있는 editor를 여는 command이다.

   

   

   

   

   

pedit [file name]

   

   

   

   

   

ex)pedit moon = moon.cmm file을 editor에 가져옴

   

menu editor : 이는 menu file을 편집하고 compile해서 저장할수 있는 editor를 여는 command이다

   

   

   

   

   

menu [file name]

   

   

   

   

   

ex)menu test = test.men file을 menu editor에 가저옴

   

   

   

   

   

ex)menu : t32.men 파일이 열리면서 편집가능함.

   

   

   

   

   

일반 editor로 t32.men을 편집시에는 menu.rp라는 명령을 추가로 실행시켜야 적용이됨.

   

   

   

   

   

   

   

text editor

   

   

   

   

   

   

   

   

edit [file name] : 이는 도스상에서 edit 명령을 친것과 거의 다름없는 명령어로서 text editor이다

   

   

   

   

   

ex)edit text.txt

   

history,ls,dir,copy명령 :

   

   

   

   

   

   

   

history명령은 지금까지 command line에서 사용한 명령을 보여주는 command이고

   

   

   

   

   

ls/ dir은 현제 path의 file및 folder를 보기 위한 명령이며

   

   

   

   

   

copy명령 또한 dos command와 같은 기능을 한다

   

   

   

   

   

   

   

현재 Trace32에서 지원하고 있는 패러렐 모드로는 양방향 스탠다드모드,ECP, EPP 모드가 지원 되고 있음.

   

EPP는 스탠다드 방식에 비해 다운로드와 업로드 속도가 2-3배 빠르며 ECP의 경우는 다운로드 속도만 3-4배 빠름.

   

이 설정을 위해서는 PC BIOS에서 알맞은 모드로 설정해주어야 한다.

   

   

   

   

   

   

   

Trace32은 PRACTICE라는 매크로 언어를 사용하여 일련의 과정을 일괄 처리할 수 있다(do filename.cmm).

Posted by 당신은 천하보다 귀중합니다. av930

댓글을 달아 주세요

[Visual C++] Error Msg

Language 2008. 9. 22. 22:51

C CPP CompilerErrorMessageAndErrorSolution

C / C++ Compiler Error Message And Error Solution

C / C++ 컴파일러에서 내뱉는 error, warning메세지에 대한 해결법정리, 컴파일러의 버전별이나 라이브러리 별로 정리되어 있다.

Solution

MSVC 6.0, 7.0

C4121: alignment of a member was sensitive to packing

클래스의 데이터멤버의 포인터를 사용하는 경우, 클래스의 멤버함수의 포인터를 받는 변수를 사용한다던지 할때 레벨4에서 나는 워닝이다. 이에 따른 솔루션은 당연히 안쓰는 것이 좋지만 사용하는 경우 다음과 같은 Pragma Directives를 선언함으로서 워닝을 제거 할 수 있다.

각 해당 포인터를 사용하는 멤버에 대한 상속방법등을 정확히 알지 못하기 때문인데. 옵션에 따라 상속종류 별로 처리 할 수 있다.

In this case, the compiler has to guess how to implement the member pointer for the kind of inheritance the class is using and gives out a warning.

With Visual C++, you get this warning if you compile on the highest warning level. It's possible to "inform" the compiler about what kind of class inheritance is used with the #pragma pointers_to_members directive and resolve the warning problem.

@TODO 옵션정리!

다음과 같이 멤버함수의 포인터를 사용하는 곳에 적용한다.

//   Specify single-inheritance only
#pragma pointers_to_members( full_generality, single_inheritance )

참고 : http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_predir_pointers_to_members.asp

C2332: 'class' : missing tag name

class 후에 tag가 없어서 나는 에러인데. 실제 없어서 나는 에러보다는 미리 #define되어 있는 값과 동일 한경우 대체 되어서 전혀 다른 상수값이 되어 버릴수도 있따.

#define SOME_CLASS 0

class SOME_CALSS // 얼씨꾸?
<code>

==== C4003: not enough actual parameters for macro =====
특이사항. template코드에서 다음과 같은 코드를 작성시에 typename에 언더라인(_)을 붙이면 다음과 같은 워닝이 뜬다. 그래서 다음과 같이 바꿈
<code>
template <typename T>
class Class
{
template <typename _T>
class Class
{
public:
        T* Alloc()
        {
                PVOID _pV = NULL;
                
                if (is_notnull(_pV))
                {
                        return new (typename _pV) _T(); // 여기 .. _T를 T로 변경
                }
        }
};

C4346: dependent name is not a type

MSVC .NET이후에 typedf나 template안에서 같이 형으로 간주되는 경우(미정의경우)의 선언시에는 반드시 typename이 들어가야한다. 이것이 ISO C++표준이다.

// template코드 내에서 iterator를 쓸경우 형이 지정된 상태가 아님으로 typename으로 써야 한다.
typename _T::iterator _itr = find(begin(), end(), _Key);

// C4346.cpp
// compile with: /WX /LD
template<class T>
struct C {
   T::X* x;   // C4346
   // try the following line instead
   // typename T::X* x;
};

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/vcerrCompilerWarningLevel1C4346.asp

R6025 Pure virtual function call

Debug 경고창에 나오는 에러 메세지로 디버깅시에 _purecall이라는 함수에서 경고를 내는데 이유는 virtual function을 사용하는 클래스의 인스턴스가 올바르지(존재하지않는겨우 소멸의 경우)않아서 이다. 베이스 클래스가 순수가상함수이고 그 함수를 호출할려고 할때 올바른 상속클래스의 인스턴스가 없는 경우이다.

void* ThreadFunc(void* pArgs)
{
      pSomeBaseInstance->ExecutePureVirtualFunction();
}

void SomeOtherThreadFunc()
{
     SomeDerivedClass Class;
     beginthread(ThreadFunc(&Class));
     // 해당 인스턴스는 사라졌다.
}

C1083: Cannot open include file: 'xmldom.idl': No such file or directory

idl이 빠진경우로 internet development sdk를 다운로드하면 된다

C2064: term does not evaluate to a function(taking 'number' arguments)

함수로 사용할수 없는 형이나 상태의 함수(클래스의 멤버함수)를 호출한다는 의미이다. 멤버 함수를 함수 포인터로 넘기거나 keyword를 함수이름으로 했을때 생긴다. 멤버함수의 포인터를 typedef등을 해서 넘길경우 묵시적인 this포인터가 있음에도 생략해서 호출하기 때문이다. static이나 global의 경우는 상관없다. 잘 살펴보자.

int i, j;
char* p;
void func()
{
   j = i();    // C2064, i is not a function
   p();        // C2064, p doesn't point to a function
}

class C {
public:
     func();
};

void caller_func(C::*pfn()) {
     pfn(); // error C2064
}

int main() {
    caller_func(&C::func());
}

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/C2064.asp

C1010: unexpected end of file while looking for precompiled header directive

주로 MFC에서 pre-compiled파일인 stdafx.h를 기본적으로 header파일에서 include해야하는데 .NET의 경우 Win32프로젝를 생성하더라도 pre-compiled 셋팅을 필요로 하고 header파일의 경우 이를 include해야한다. 혹은 다음과 같은 절차를 거쳐서 셋팅을 변경한다.

1. 솔루션 탐색기에서 프로젝트를 선택하여 속성창을 뛰운다.
2. 왼쪽팬에서 C/C++폴더를 선택하고
3. Precompiled Header노드를 선택한다.
4. 오른쪽팬에서 Create/Use Precompiled Header에서 Not Using Precompiled Headers을 선택을 한다.
Posted by 당신은 천하보다 귀중합니다. av930

댓글을 달아 주세요

  1. KBS 2012.02.20 15:54  댓글주소  댓글쓰기 수정/삭제

    C2332 에러로 고생하고 있었는데 Oasis님 덕분에 해결했습니다. 정말 감사합니다 ^^

  2. 2013.09.12 00:10  댓글주소  댓글쓰기 수정/삭제

    비밀댓글입니다