2009-09-30 2 views
7

큰 #define 된 MACRO 루틴을 가진 소스 코드를 디버깅하고 있습니다. 내가 그들로 스테핑에서 흥미로운,하지만 내가 VC++의 기능이 스텝에서 허용 ... 그렇게하지 않는, 생각,VC++에서 MACRO로 들어가기

  • I 함수로 변환하고, 그러나 이것은 나를
위해 열심히되고있다

MACRO 루틴으로 들어갈 수있는 방법이 있습니까? 특히 VC++에서?

PS : GCC 컴파일러 내 지식, 비즈니스 (의 SoftICE)를 벗어 매크로를 한 단계 씩 수있는 유일한 디버거의 최고 매크로

답변

3

위의 정답 이외에 : 일반적으로 혼합 디스플레이 (C + 어셈블리)를 표시하는 것입니다. 이것은 실제로 일어나는 것을 보여줍니다. 기본 어셈블리에 익숙하지 않더라도 어떤 일이 발생하는지 (예 : 사소한 대체 루프 또는 복잡한 루프인지) 알 수 있습니다. 또한 기능을 추가로 활용할 수있는 기회를 제공 할 것입니다. 예를 들어, 경우 매크로

#define foo(a) i++;foo_func(a,i) 

디버거가 사용되는 루프 변수의 종류 같은 것을) 표시됩니다이다. 이를 이해하기 위해 매크로 정의를 참조로 사용할 수 있습니다.

00411454 mov   dword ptr [j],eax 
00411457 cmp   dword ptr [j],0Ah 
0041145B jge   wmain+58h (411478h) 
    { 
     foo(j); 
0041145D mov   eax,dword ptr [i] 
00411460 add   eax,1 
00411463 mov   dword ptr [i],eax 
00411466 mov   eax,dword ptr [i] 
00411469 push  eax 
0041146A mov   ecx,dword ptr [j] 
0041146D push  ecx 
0041146E call  foo_func (411028h) 
00411473 add   esp,8 
    } 

이것은 변수 i와 j가 함수 foo_func를 호출하는 데 사용된다는 것을 알 수 있습니다.

Visual C++를 사용하면 매크로 (F11)에서 호출 된 함수를 사용할 수 있습니다. 개별 진술은 아니지만.

+0

이것이 내 문제에 대해 할 수있는 일에 가장 가깝기 때문에이 대답을 수락합니다. – Alphaneo

1

단계 씩 지원하는 경우,이 포트 GCC에 전체 코드를 할 수 있습니다. 정말로 50 줄 매크로를 작성하면 안되는 이유의 좋은 예입니다. 그럼 전반적으로 행운을 빈다.

+0

@Micheal, 나는 단지 관리자이며, 매번 매크로를 작성한 사람을 촬영하는 것처럼 느껴질 때가 있습니다. – Alphaneo

+0

당신은 모든 사람보다 더 나빠요. :) –

2

매크로는 전처리기에 의해 컴파일되므로 컴파일러는 매크로를 단계별로 디버그 정보를 생성 할 수 없습니다.

2

긴 답변. No.

컴파일러 옵션에서 확장 된 전체 매크로 목록을 생성 할 수 있습니다. 다소 도움이 될 수도 있지만 디버거 기능을 제공하지는 않습니다.

1

매크로를 사용할 때 디버거와 관련된 코드는 동일한 소스 코드 줄로 확장됩니다. 디버거는 MY_MACRO()를보고 실제로 매크로 안에 코드가 얼마나 많은지 상관없이 그 한 줄을 처리합니다.

C++에서 템플릿은 매크로가 할 수있는 대부분의 작업을 수행 할 수 있지만 훨씬 더 우아하게 작동합니다. 언어의 진정한 부분이기 때문에 디버거를 사용하여 직접 프로그래밍 할 수 있습니다.

// Macro FIND() - ugly, buggy, and can't ever be stepped in to by debugger! 
#define FIND(begin, end, value) \ 
{ \ 
    for (; begin != end; ++begin) { \ 
     if (*begin == value) \ 
      break; \ 
    } \ 
} 

// Templated find() - works beautifully and can be debugged like a real function! 
template<typename Iter, typename T> 
Iter find(Iter begin, Iter end, const T& value) 
{ 
    for (; begin != end; ++begin) { 
     if (*begin == value) 
      return begin; 
    } 
} 

참고 : 예를 들어, 표준 라이브러리 기능은 물론이다() 찾을 수 있습니다,하지만 난 간단하게 디버깅 할 수있는 방법을 보여주기 위해, 매크로과 비교하기 위해이 서면으로 작성했습니다. 매크로 버전은 말할 것도없고 다른 많은 문제가 있습니다. 경험 법칙 : 가능하면 코드 작성을위한 매크로는 피하십시오!

+0

첫째, Alphaneo는 라이브러리를 사용하며 모든 마크로를 템플릿으로 변경하는 것은 어색합니다. 둘째, C에서 템플리트를 사용할 수없고 사람들은 C 만 사용해야하는 많은 이유가 있습니다. – user172818

2

아마도 내 대답은 VC++ 사용자에게 도움이되지 않습니다. 유닉스에서 나는 다음과 같이한다 :

gcc -E prog.c | indent > prog-formatted.c 

i.즉, 프로그램을 사전 처리하고 다시 포맷합니다.

관련 문제