如何跟踪功能调用?

时间:2012-11-27 07:00:39

标签: c function

看到我有这样的功能集

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魔法,所以只有在这种情况下我的调试打印来了。?

4 个答案:

答案 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输出你的输出,这样你就可以看到你的行对此感兴趣?