2009-09-30 17 views
7

Estoy depurando un código fuente que tiene una gran cantidad de grandes rutinas MACRO definidas. Soy interesantes de entrar en ellos, pero supongo, VC++ no permite el paso funcionalidad ... así,ingresando a MACRO en VC++

  • yo los estoy convirtiendo en funciones, pero esto se está volviendo difícil para mí

¿Hay alguna manera de entrar en las rutinas MACRO? especialmente en VC++?

PD: puede transferir todo el código en gcc, si compilador gcc apoya entrar en MACRO

Respuesta

3

Además de todas las respuestas correctas anteriores: lo que suelo hacer es mostrar una pantalla mixta (conjunto C +). Esto muestra lo que realmente sucede. Incluso si no es un experto en el ensamblaje subyacente, le da una idea de lo que sucede (es decir, es un reemplazo trivial o un ciclo complejo). También proporcionará oportunidades adicionales para entrar en funciones. Por ejemplo, si la macro es

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

el depurador mostrará algo así como bucle y qué tipo de variables se utilizan). Puede usar la definición de macro como referencia para entenderlo.

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 
    } 

Esto da una pista de que las variables i y j se usan para llamar a la función foo_func.

Si usa Visual C++, le permitirá ingresar a funciones llamadas desde una macro (F11); no declaraciones individuales sin embargo.

+0

Dado que esto es lo más cercano a lo que podría hacer por mi problema, acepto esta respuesta. – Alphaneo

1

A lo mejor de mi conocimiento, el único depurador que podría paso en macros está fuera del negocio (SoftIce). Gran ejemplo de por qué no debe escribir macros de 50 líneas, realmente. Entonces, en general ... buena suerte.

+0

@Micheal, solo soy el mantenedor, y cada vez que encuentro un gran MACRO me siento como disparar a la persona que escribió el código. – Alphaneo

+0

Lo tienes peor que todos, entonces. :) –

2

Las macros son compiladas por el preprocesador, por lo que el compilador será incapaz de generar información de depuración para pasar por las macros.

2

Respuesta larga. No.

Puede generar una lista completa de las macros expandidas en las opciones del compilador. Puede ayudar un poco, pero no le dará capacidades de depurador

1

Cuando utiliza una macro, el código detrás de ella se expande a la misma línea de código fuente, en lo que respecta al depurador. El depurador ve MY_MACRO() y trata esa línea individual sin importar cuánto código realmente está dentro de la macro.

En C++, las plantillas pueden hacer la mayoría de las cosas que pueden hacer las macros, pero funcionan mucho, mucho más elegantemente. Ya que son una parte real del lenguaje, ¡también puede intervenir con el depurador! Por ejemplo:

// 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; 
    } 
} 

Nota: encontrar() es, por supuesto, una función de biblioteca estándar, pero yo simplemente he escrito esto para compararla con una macro, para demostrar cómo se puede depurar. Sin mencionar que la versión de macro tiene muchos otros problemas. Regla de oro: ¡evite las macros para escribir código siempre que sea posible!

+0

En primer lugar, Alphaneo usa una biblioteca y es incómodo cambiar todos los marcros por plantillas. En segundo lugar, las plantillas no están disponibles en C y las personas tienen muchas buenas razones para usar solo C. – user172818

2

Probablemente mi respuesta no sea útil para usuarios de VC++. En Unix, hago algo como esto:

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

i.e., usted preprocesa el programa y lo reformatea.