0

看到我有这样的功能集

funtion_a();
funtion_b();
funtion_c();
|
|
funtion_y();
funtion_z();

现在这个所有函数在内部调用magic()

现在,当function_j() calles magic()出现问题并且我想在这种情况下进行调试时,当我将任何单个打印语句放入魔术时,然后在每种情况下

function_a() calles magic()
function_b() calles magic()
|
function_z() calles magic()

printf 已执行,很难看到在我感兴趣的案例中发生了什么

function_j() calles magic()

所以现在有什么办法让我可以跟踪从 function_j() 调用的魔法,所以只有在这种情况下我的调试打印才会出现。?

4

4 回答 4

4

就在这里。它被称为调试器。gdb 什么的。如果在代码中放置断点,则可以显示调用堆栈并查看被调用的函数。您将不得不研究您的特定调试器的命令。有些集成在 IDE 中,有些是命令行工具,有些是独立的。让 google 帮助您找到适合您的环境和偏好的产品。

于 2012-11-27T07:06:59.233 回答
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();
于 2012-11-27T07:33:58.003 回答
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包装器以匹配您的参数和返回类型。

这是一个可怕的 hack,但它是我能想出的最简单的机制来满足您的要求。考虑改用适当的调试器,因为它们将允许在错误发生时更深入地检查程序状态,包括变量值和整个堆栈跟踪。

于 2012-11-27T07:08:30.193 回答
1

正如其他人所提到的,我建议使用调试器。但是,如果您很着急,并且鉴于您已经编写了所有这些诊断程序printf,您难道不能直接通过管道输出您的输出,grep以便查看您感兴趣的行吗?

于 2012-11-27T07:11:19.883 回答