代码之家  ›  专栏  ›  技术社区  ›  Alphaneo

在VC中单步执行宏++

  •  7
  • Alphaneo  · 技术社区  · 15 年前

    我正在调试一个源代码,它有很多大的定义宏例程。 我对介入它们很感兴趣,但我猜,VC++不允许介入功能…所以,

    • 我正在把它们转换成函数,但这对我来说越来越困难了

    有没有办法进入宏程序?尤其是在VC++中?

    PS:如果gcc编译器支持单步执行宏,我可以将整个代码导入gcc。

    6 回复  |  直到 15 年前
        1
  •  3
  •   Adriaan    15 年前

    除了上面所有正确的答案:我通常做的是显示混合显示(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。

    如果您使用VisualC++,它将允许您进入从宏(F11)调用的函数,而不是单独的语句。

        2
  •  2
  •   Tullo_x86    15 年前

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

        3
  •  2
  •   cmroanirgo    15 年前

    长回答。不。

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

        4
  •  2
  •   user172818    15 年前

    可能我的答案对VC++用户没有帮助。在Unix上,我执行如下操作:

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

    即,对程序进行预处理并重新格式化。

        5
  •  1
  •   Michael F    15 年前

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

        6
  •  1
  •   AshleysBrain    15 年前

    使用宏时,就调试器而言,宏后面的代码将全部扩展到同一源代码行。调试器会看到我的_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()当然是一个标准的库函数,但我编写这个函数只是为了将其与宏进行比较,以演示如何调试它。更不用说宏版本还有很多其他问题。经验法则:尽可能避免宏来编写代码!