在我做的一些C语言项目中,我喜欢使用以下宏,它们的工作方式类似于Perl的warn和die子程序:
#include <stdio.h>
#include <stdlib.h>
#define warn(...) \
fprintf(stderr, __VA_ARGS__); \
fprintf(stderr, " at %s line %d\n", __FILE__, __LINE__)
#define die(...) \
warn(__VA_ARGS__); \
exit(0xFF)
是否有类似Perl的carp、croak、cluck和confess子例程Carp的存在?我想要有一些能够从用户角度报告错误的东西。
如果没有,我知道在glibc中有backtrace()和backtrace_symbols()函数,再加上-gcc选项可以提供函数名称和代码地址的回溯。但是我想要更好的东西;像Perl的caller子例程一样,能够访问调用堆栈中的文件、行和函数名称。有了这个,我就能编写自己的libcarp,用于我的c程序。
编辑:2009-10-19
我正在考虑创建一个使用可用的gdb的东西,并在basename(argv[0])上处理堆栈跟踪以生成我想要的不同类型的消息。它应该能够确定我是否不在可调试的可执行文件中或在没有gdb的系统中,在这种情况下,carp和cluck将变成警告,而craok和confess将变成死机。
我以前从未像这样使用gdb(我只在程序开始运行时运行过它,而不是在其已经运行时)。但我在glib中找到了一些函数(g_on_error_stack_trace和stack_trace),它们看起来非常接近我想要做的事情:它使用basename(argv [0])和进程ID作为参数分叉一个gdb进程,然后写入其stdin(已重定向到管道)命令“backtrace”,后跟“quit”。然后它从结果中读取并解析它所喜欢的方式。这几乎正是我需要做的事情。