我有类似于以下代码片段的内容:
// 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
}
}
是的,我完全清楚它打破了各种编码习惯,但这是另一个故事(它是一个非常庞大,非常复杂,非常古老的系统的一部分,不会很快改变)。< / p>
我的问题是:是否可以在code.h中的“// do something else”点设置一个断点,你可以指定它是否是从alpha.c包含的实例或beta.c?如果是这样,怎么样?
答案 0 :(得分:2)
将#defines放在主文件中:
// 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 :(得分:0)
好的,我想以很多不同的方式告诉你为什么你需要改变系统,但是你已经表明你知道这不好并且它不会改变所以我会尝试不要这样做。
你是否可以按照以下方式做点什么:
// file alpha.c
void function_A()
{
int i;
const int foo = 1;
#include "code.h"
}
并在code.h中设置条件断点,条件为foo == 1?做同样的事情,但为函数B设置foo = 2来打破那里。
答案 2 :(得分:0)
在function_A
或function_B
中设置断点,然后单步执行包含的代码。然后,您可以在需要的地方设置断点。
这假设您已禁用大多数编译器和链接器优化。
答案 3 :(得分:0)
在.c文件中使用#define
,在.h文件中使用#ifdef
。在#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
}
}
答案 4 :(得分:0)
由于这样的事情可能很少需要,因此可能不会花钱去弄清楚如何在C源级别进行操作或跳过一堆箍。
所以,我可能只是看看我想要破解的函数的反汇编并在汇编级别设置断点。
作为一个实验,我通常在code.h
的行上设置一个断点,调试器的断点窗口显示一个断点树:
o code.h, line 9
|
+-- o code.h, line 9
|
+-- o code.h, line 9
可以禁用每个条目。没有简单的方法可以找出哪一个对应function_A()
而哪一个对应function_B()
只是通过观察 - 我必须运行该程序同时启用,并关闭我不感兴趣的程序在它第一次被击中时。不是很好的可用性体验,但考虑到情况可能罕见,并不太令人惊讶。
如果您需要更经常地执行此操作,Visual C / C ++应该允许您使用"Context Operator"完全指定断点:
{[function],[source],[module] } location
但我无法弄清楚如何在调试器IDE中实际使用此语法。如果有人有详细信息,我会很感激评论。
<{3}}中的WinDBG也支持这种语法(或类似的东西),但我无法确切地确定它当前是如何工作的(或是否)。