2010-01-12 82 views
1

我有下面的代码片段的东西类似:我可以在包含的代码中设置断点吗?

// file alpha.c 
void function_A() 
{ 
    int i; 
    #include "code.h" 
} 

//file beta.c 
void function_B() 
{ 
    int i; 
    #include "code.h" 
} 

// file code.h 
for(i = 1;i < 10;i++) 
{ 
    // do some stuff 
    if (very_rare_event) 
    { 
     // do something else 
    } 
} 

是的,我充分认识到它打破各种编码实践,但这是另一个故事(它是一个非常庞大,非常复杂,非常旧的系统的一部分,不会很快改变)。

我的问题是这样的:是否有可能在code.h中的“// do something else”点设置一个断点,以便您可以指定它是否是从alpha.c包含的实例或beta.c?如果是这样,怎么样?

回答

2

认沽#define语句的主要文件:

// file alpha.c 
#define BREAK_FOR_ME 'A' 
void function_A() 
{ 
    int i; 
    #include "code.h" 
} 

// file beta.c 
#define BREAK_FOR_ME 'B' 
void function_B() 
{ 
    int i; 
    #include "code.h" 
} 

然后在code.h:

// file code.h 
for(i = 1;i < 10;i++) 
{ 
    // do some stuff 
    if (very_rare_event) 
    { 

    #ifdef BREAK_FOR_ME 
     switch (BREAK_FOR_ME) 
     { 
     case 'A': 
      // set breakpoint here... 
      break; 

     case 'B': 
      // or here... 
      break; 
     } 
    #endif 

     // do something else 
    } 
} 
+1

显然,伟大的思想家都一样! – 2010-01-12 19:09:36

+0

+1狡猾的开关使用。由于常量切换表达式可能会得到编译器警告,但是如果您使用这样的包含编写代码,我认为编译器警告可能是您最担心的问题。 – 2010-01-12 19:11:33

+0

只有少数几个文件被涉及时,这可能是确定的,并且您不想经常更改或添加断点位置。但它不能太好 - 这太多了,你可能正在接近修复古怪编码实践的努力水平。 – 2010-01-12 20:51:50

0

好的,我想告诉你很多不同的方式,为什么你需要改变系统,但你已经表明你知道这不好,它不会改变,所以我会尽量避免这样做。

你能不能做也许沿着这行的东西:

// file alpha.c 
void function_A() 
{ 
    int i; 
    const int foo = 1; 
    #include "code.h" 
} 

,并设置在code.h条件断点与条件FOO == 1?做同样的事情,但设置foo = 2为功能B打破那里。

0

function_Afunction_B中设置断点,然后单步进入包含的代码。然后您可以在需要的地方设置断点。

这假定您已禁用大多数编译器链接器优化。

0

使用#define在你的.c文件,并#ifdef S IN .h文件。在#ifdef内放置一些非操作(可能是递增然后递减计数器),然后在那里设置断点。请注意,您需要在那里进行一些操作,因为您只能在实际操作中设置断点。

所以:

// file alpha.c 
#define FILE_ALPHA 
void function_A() 
{ 
    int i; 
    #include "code.h" 
} 
#undef FILE_ALPHA 

//file beta.c 
#define FILE_BETA 
void function_B() 
{ 
    int i; 
    #include "code.h" 
} 
#undef FILE_BETA 

// file code.h 
for(i = 1;i < 10;i++) 
{ 
    // do some stuff 
    if (very_rare_event) 
    { 
     // do something else 
     #if defined FILE_ALPHA 
      i++; //Set breakpoint here... 
      i--; 
     #elif defined FILE_BETA 
      i++; //...or here... 
      i--; 
     #else 
      i++; //...or here. 
      i--; 
     #endif 
    } 
} 
+0

哇,同步:) – egrunin 2010-01-12 19:08:19

0

因为这样的事情大概只需要很少,它可能不会支付弄清楚如何做到这一点的C源代码级或通过一束篮球的跳。

所以,我可能只是看看我想要打入的函数的反汇编,并在汇编级别设置断点。

作为一个实验,我在code.h设置断点上线正常,调试器的断点窗口显示了断点树:

o code.h, line 9 
| 
+-- o code.h, line 9 
| 
+-- o code.h, line 9 

每个条目都可以被禁用。没有简单的方法找出哪一个对应于function_A(),哪个对应的是function_B(),只需看一下 - 我必须在启用时运行该程序,并关闭我在第一次启动时不感兴趣的程序。考虑到情况可能有多少,这不是一个很好的可用性经验,但也不是太令人惊讶。

如果你需要做到这一点更经常地,视觉C/C++应该让你使用完全指定的断点处"Context Operator"

{[function],[source],[module] } location 

,但我一直无法弄清楚如何实际在调试器IDE中使用此语法。如果有人有细节,我会很感激评论。

Debugging tools for Windows中的WinDBG也支持这种语法(或者类似的东西),但我不能确切地说明它(或者它是如何)在这个时刻工作的)。

相关问题