看到我有这样的功能集
funtion_a();
funtion_b();
funtion_c();
|
|
funtion_y();
funtion_z();
现在所有函数调用内部magic()
现在当function_j() calles magic()
出现问题并且我希望在那种情况下进行调试时,我将任何单个print语句放入魔术中,然后在每种情况下
function_a() calles magic()
function_b() calles magic()
|
function_z() calles magic()
printf已经完成,很难看出我感兴趣的案例中发生了什么
function_j() calles magic()
所以现在有什么方法让我可以跟踪从function_j()调用yes魔法,所以只有在这种情况下我的调试打印来了。?
答案 0 :(得分:4)
是的。它被称为调试器。 gdb或其他什么。如果在代码中放置断点,则可以显示调用堆栈并查看调用的函数。您将不得不研究命令的特定调试器。有些集成在IDE中,有些是命令行工具,有些是独立的。让谷歌帮助您找到适合您的环境和偏好的正确的。
答案 1 :(得分:3)
您可以使用以下结构
int debug = 0;
function magic() {
.
.
if (debug) printf("hello\n");
.
.
}
function a();
function b();
.
.
function j() {
debug = 1;
.
.
magic();
.
.
debug = 0;
}
function k();
.
.
.
function z();
答案 2 :(得分:1)
你还没有发布magic()
的原型,所以我要打造一个原型:
int magic(int a, int b);
现在,给定这个原型,在定义这个原型的标题中添加这个定义下面的这些行:
inline int real_magic(int a, int b) { return magic(a, b); }
#define magic(a, b) (printf(__func__ " calling magic()\n"), real_magic((a), (b)))
在实施magic()
的翻译单元中,您必须#undef
宏:
#undef magic
int magic(int a, int b)
{
// implementation
}
#define magic(a, b) (printf(__func__ " calling magic()\n"), real_magic((a), (b)))
您必须调整宏和real_magic
包装器以匹配您的参数和返回类型。
这是一个可怕的黑客攻击,但这是我能够提出的最简单的机制来满足您的要求。请考虑使用适当的调试器,因为它们可以在错误发生时更深入地检查程序状态,包括变量值和整个堆栈跟踪。
答案 3 :(得分:1)
我建议使用调试器,正如其他人提到的那样。但是,如果你赶时间,并且考虑到你已经编写了所有这些诊断printf
,那么你不能只通过grep
输出你的输出,这样你就可以看到你的行对此感兴趣?