【问题标题】:Know exact line of the program execution知道程序执行的确切行
【发布时间】:2018-05-24 03:56:10
【问题描述】:

我正在尝试为我的程序执行调试模式,该模式在一个文件中写入类似内容以存储日志:

[Day Month D HH:MM:SS YYYY] foo.c function_name line 33: The thing 发生这种情况

问题是知道该行的确切值,显然我可以在我的 IDE 中看到它,但我想知道是否存在更优雅和有效的方法。

我希望你已经很好地解释了我(对不起,如果没有)并提前感谢。

【问题讨论】:

标签: c file debugging logging line-numbers


【解决方案1】:

您可以查看宏 assert (assert.h),它是按照您的意图完成的。

简而言之:

  1. 它必须是一个宏。如果它是一个函数,它将报告该函数的文件和行,但实际上您需要调用该函数的文件和行。 (这并不意味着这个宏不能调用一个函数作为助手。)

  2. 当前文件和行可通过宏__FILE____LINE__ 访问。

这就是它在源代码中的样子:

#define LOG_DEBUG(TEXT) log_debug(__FILE__, __LINE__, TEXT)

void log_debug(const char *file, int line, const char *text)
{
  fprintf(stderr, "DEBUG '%s':%d: %s\n");
}

作为MCVEtest-log-debug.c

#include <stdio.h>

#define LOG_DEBUG(TEXT) log_debug(__FILE__, __LINE__, TEXT)

void log_debug(const char *file, int line, const char *text)
{
  fprintf(stderr, "DEBUG '%s':%d: %s\n", file, line, text);
}

/* test/sample */
int main()
{
  LOG_DEBUG("in main()");
  return 0;
}

在 Windows 10(64 位)的 cygwin 中使用 gcc 编译和测试:

$ gcc --version
gcc (GCC) 6.4.0

$ gcc -std=c11 -g -o test-log-debug test-log-debug.c 

$ ./test-log-debug     
DEBUG 'test-log-debug.c':13: in main()

$

再次在Windows 10的VS2013中编译测试:

DEBUG 'C:\Users\Scheff\tests\test-log-debug.c':13: in main()

visibleman注意到有一个非常相似的问题SO: Visual C++ equivalent of __FILE__ , __LINE__ and __PRETTY_FUNCTION__

AFAIK,(在一个回答中也提到过)__FILE____LINE__ 是标准的。可能会提供其他/类似的宏作为编译器的专有扩展。

【讨论】:

猜你喜欢
  • 2020-09-15
  • 2017-01-22
  • 2019-10-31
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
  • 2011-09-01
  • 1970-01-01
  • 2017-09-10
相关资源
最近更新 更多