在VC ++中进入MACRO

时间:2009-09-30 05:46:18

标签: c++ c debugging gcc visual-c++

我正在调试一个源代码,它有很多大的#define MACRO例程。 我很有兴趣进入它们,但我想,VC ++不允许步入功能......所以,

  • 我正在将它们转换成函数,但这对我来说变得很难

有没有办法进入MACRO例程?特别是在VC ++中?

PS:如果gcc编译器支持步入MACRO

,我可以将整个代码移植到gcc中

6 个答案:

答案 0 :(得分: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);但不是个别陈述。

答案 1 :(得分:2)

宏由预处理器编译,因此编译器将无法生成调试信息以逐步执行宏。

答案 2 :(得分:2)

答案很长。否。

您可以生成在编译器选项中展开的宏的完整列表。它可能会有所帮助,但它不会为您提供调试器功能

答案 3 :(得分:2)

可能我的回答对VC ++用户没有帮助。在Unix上,我做了类似的事情:

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

即你预先处理程序并重新格式化。

答案 4 :(得分:1)

据我所知,唯一可以进入宏的调试器是业务(SoftICE)。很好的例子,为什么你不应该写50行宏,真的。所以,总的来说......祝你好运。

答案 5 :(得分: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;
    }
}

注意:find()当然是标准库函数,但我只是编写它来将它与宏进行比较,以演示如何调试它。更不用说宏版本还有很多其他问题。经验法则:尽可能避免使用宏来编写代码!